如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用--VC中测试(单类继承)
2013-05-03 16:32
639 查看
C++的委托
// TestDelegate.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
typedef unsigned long gulong;
typedef char gchar;
typedef void* gpointer;
typedef long GObject;
void* g_lpObject = 0;
class BaseObject
{
public:
BaseObject();
virtual ~BaseObject();
/* 创建对象并绑定信号的接口 */
virtual gulong setupObject() = 0;
//protected:
typedef gulong (BaseObject::* CommonCallback)(GObject*instance, ...);
typedef struct tagOBJ_CALLBACK
{
BaseObject* x_pThis;
CommonCallback x_pCallback;
GObject* x_pWidget;
} ObjectCallbackInfo;
GObject* x_pObject;
gulong ConnectSignal(gpointer instance, const gchar *detailed_signal, CommonCallback c_handler);
//private:
//GSList* x_pObjectList;
static gulong SignalProc(const ObjectCallbackInfo* lpObject, ...);
};
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
BaseObject::BaseObject():x_pObject(NULL)
{
}
BaseObject::~BaseObject()
{
/* 释放所有分配的ObjectToMemFunc空间 */
}
gulong BaseObject::ConnectSignal(gpointer instance,
const gchar *detailed_signal,
CommonCallback c_handler)
{
/* 分配存放回调指针的空间 */
ObjectCallbackInfo* lpObject = (ObjectCallbackInfo*)malloc(sizeof(ObjectCallbackInfo));
if (NULL == lpObject)
{
return 0;
}
lpObject->x_pThis = this;
lpObject->x_pCallback = c_handler;
lpObject->x_pWidget = (GObject*)instance;
printf("Object : 0x%08x\n", lpObject);
printf("This : 0x%08x\n", lpObject->x_pThis);
printf("Callback: 0x%08x\n", lpObject->x_pCallback);
printf("Widget : 0x%08x\n", lpObject->x_pWidget);
/* 将信息保存在slist中 */
//x_pObjectList = g_slist_append(x_pObjectList, lpObject);
/* 注册信号回调 */
/* return g_signal_connect_swapped(instance, detailed_signal,
&(BaseObject::SignalProc), lpObject);*/
g_lpObject = lpObject;
}
gulong BaseObject::SignalProc(const ObjectCallbackInfo* lpObject, ...)
{
va_list pArgList;
gulong ulRetcode;
struct reserve_arg { gulong ulReserver[20];} *pstTemp;
BaseObject* lpThis;
CommonCallback pCallBack;
/* 收到信号时,先判断指针 */
if ( (NULL == lpObject) )//|| (NULL == lpObject->x_pCallback ) || (NULL == lpObject->x_pWidget))
{
return 0;
}
printf("Object : 0x%08x\n", lpObject);
printf("This : 0x%08x\n", lpObject->x_pThis);
printf("Callback: 0x%08x\n", lpObject->x_pCallback);
printf("Widget : 0x%08x\n", lpObject->x_pWidget);
/* 取出this指针及成员函数指针 */
va_start(pArgList, lpObject);
pstTemp = (struct reserve_arg*)pArgList;
lpThis = lpObject->x_pThis;
pCallBack = lpObject->x_pCallback;
printf("Param : %08x %08x %08x %08x\n", pstTemp->ulReserver[0], pstTemp->ulReserver[1], pstTemp->ulReserver[2], pstTemp->ulReserver[3]);
/* 调用成员函数 */
ulRetcode = (lpThis ->* pCallBack)(lpObject->x_pWidget, *pstTemp);
va_end(pArgList);
printf("Object : 0x%08x\n", lpObject);
printf("This : 0x%08x\n", lpObject->x_pThis);
printf("Callback: 0x%08x\n", lpObject->x_pCallback);
printf("Widget : 0x%08x\n", lpObject->x_pWidget);
return ulRetcode;
}
class TestDialog: public BaseObject
{
public:
virtual gulong setupObject();
protected:
virtual gulong __cdecl OnChange(void *notebook1, void *page, unsigned int num);
};
gulong TestDialog::setupObject()
{
ConnectSignal((void*)123, "destroy", reinterpret_cast<CommonCallback>(&TestDialog::OnChange));
return 0;
}
gulong TestDialog::OnChange(void *notebook1, void *page, unsigned int num)
{
printf("this : %08x\n", this);
printf("notebook : %08x\n", notebook1);
printf("page : %08x\n", page);
printf("Current Page: %d(%08x)\n", num, num);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
TestDialog* lpDialog = NULL;
lpDialog = new TestDialog;
lpDialog->setupObject();
BaseObject::SignalProc((const BaseObject::ObjectCallbackInfo *)g_lpObject, 234, 456, 3);
delete lpDialog;
getchar();
return 0;
}
// TestDelegate.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
typedef unsigned long gulong;
typedef char gchar;
typedef void* gpointer;
typedef long GObject;
void* g_lpObject = 0;
class BaseObject
{
public:
BaseObject();
virtual ~BaseObject();
/* 创建对象并绑定信号的接口 */
virtual gulong setupObject() = 0;
//protected:
typedef gulong (BaseObject::* CommonCallback)(GObject*instance, ...);
typedef struct tagOBJ_CALLBACK
{
BaseObject* x_pThis;
CommonCallback x_pCallback;
GObject* x_pWidget;
} ObjectCallbackInfo;
GObject* x_pObject;
gulong ConnectSignal(gpointer instance, const gchar *detailed_signal, CommonCallback c_handler);
//private:
//GSList* x_pObjectList;
static gulong SignalProc(const ObjectCallbackInfo* lpObject, ...);
};
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
BaseObject::BaseObject():x_pObject(NULL)
{
}
BaseObject::~BaseObject()
{
/* 释放所有分配的ObjectToMemFunc空间 */
}
gulong BaseObject::ConnectSignal(gpointer instance,
const gchar *detailed_signal,
CommonCallback c_handler)
{
/* 分配存放回调指针的空间 */
ObjectCallbackInfo* lpObject = (ObjectCallbackInfo*)malloc(sizeof(ObjectCallbackInfo));
if (NULL == lpObject)
{
return 0;
}
lpObject->x_pThis = this;
lpObject->x_pCallback = c_handler;
lpObject->x_pWidget = (GObject*)instance;
printf("Object : 0x%08x\n", lpObject);
printf("This : 0x%08x\n", lpObject->x_pThis);
printf("Callback: 0x%08x\n", lpObject->x_pCallback);
printf("Widget : 0x%08x\n", lpObject->x_pWidget);
/* 将信息保存在slist中 */
//x_pObjectList = g_slist_append(x_pObjectList, lpObject);
/* 注册信号回调 */
/* return g_signal_connect_swapped(instance, detailed_signal,
&(BaseObject::SignalProc), lpObject);*/
g_lpObject = lpObject;
}
gulong BaseObject::SignalProc(const ObjectCallbackInfo* lpObject, ...)
{
va_list pArgList;
gulong ulRetcode;
struct reserve_arg { gulong ulReserver[20];} *pstTemp;
BaseObject* lpThis;
CommonCallback pCallBack;
/* 收到信号时,先判断指针 */
if ( (NULL == lpObject) )//|| (NULL == lpObject->x_pCallback ) || (NULL == lpObject->x_pWidget))
{
return 0;
}
printf("Object : 0x%08x\n", lpObject);
printf("This : 0x%08x\n", lpObject->x_pThis);
printf("Callback: 0x%08x\n", lpObject->x_pCallback);
printf("Widget : 0x%08x\n", lpObject->x_pWidget);
/* 取出this指针及成员函数指针 */
va_start(pArgList, lpObject);
pstTemp = (struct reserve_arg*)pArgList;
lpThis = lpObject->x_pThis;
pCallBack = lpObject->x_pCallback;
printf("Param : %08x %08x %08x %08x\n", pstTemp->ulReserver[0], pstTemp->ulReserver[1], pstTemp->ulReserver[2], pstTemp->ulReserver[3]);
/* 调用成员函数 */
ulRetcode = (lpThis ->* pCallBack)(lpObject->x_pWidget, *pstTemp);
va_end(pArgList);
printf("Object : 0x%08x\n", lpObject);
printf("This : 0x%08x\n", lpObject->x_pThis);
printf("Callback: 0x%08x\n", lpObject->x_pCallback);
printf("Widget : 0x%08x\n", lpObject->x_pWidget);
return ulRetcode;
}
class TestDialog: public BaseObject
{
public:
virtual gulong setupObject();
protected:
virtual gulong __cdecl OnChange(void *notebook1, void *page, unsigned int num);
};
gulong TestDialog::setupObject()
{
ConnectSignal((void*)123, "destroy", reinterpret_cast<CommonCallback>(&TestDialog::OnChange));
return 0;
}
gulong TestDialog::OnChange(void *notebook1, void *page, unsigned int num)
{
printf("this : %08x\n", this);
printf("notebook : %08x\n", notebook1);
printf("page : %08x\n", page);
printf("Current Page: %d(%08x)\n", num, num);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
TestDialog* lpDialog = NULL;
lpDialog = new TestDialog;
lpDialog->setupObject();
BaseObject::SignalProc((const BaseObject::ObjectCallbackInfo *)g_lpObject, 234, 456, 3);
delete lpDialog;
getchar();
return 0;
}
相关文章推荐
- 如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用--VC中测试(虚拟继承类及多继承)
- 如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用--示例
- 如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用
- 如何将GTK+-2.0的信号、回调处理映射成OOC虚拟成员函数的调用
- VC多线程中全局函数如何调用对话框类成员变量及成员函数
- 【转】回调函数中如何调用类中的非静态成员变量或非静态成员函数
- Linux 多线程应用中如何编写安全的信号处理函数
- Redis系列(二)---如何接受客户端请求并调用处理函数
- C++如何在派生类成员函数内调用基类的成员函数(包括构造函数)
- VC中外部函数如何获得对话框成员变量
- VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数
- 在MFC中类内部建立线程处理函数以便调用类的成员函数和变量
- 10.2.1 关于vc++不支持把类的成员函数定义为类的友元函数的处理
- apue第三版 在信号处理程序中调用不可再入函数 的例子遇到的问题
- 回调函数中如何调用类中的非静态成员变量或非静态成员函数
- 【iOS开发-4】UIApplication生命周期以及如何简单测试每个函数何时被调用?
- 如何在VC中添加消息处理函数
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
- const成员函数如何调用non-const成员变量
- C++ 类成员函数回调调用方法