首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么在类里面定义回调函数

2013-06-26 
如何在类里面定义回调函数?我想自己写个很简单的窗口类,大致如下class CMain{public:1.typedef LRESULT CA

如何在类里面定义回调函数?
我想自己写个很简单的窗口类,大致如下

class CMain
{
public:
1.    typedef LRESULT CALLBACK (*WNDPROC) (HWND, UINT, WPARAM, LPARAM);
    ......
2.    WNDPROC  WndProc;
3.    LRESULT CALLBACK TheWndProc(HWND, UINT, WPARAM, LPARAM);
}

对于3,我该如何定义呢?
我用:
LRESULT CALLBACK CMain::TheWndProc(HWND hwnd.....)
{
    ......
}

这样定义出来后,用WndProc = TheWndProc就出错了
不知道对这些应该如何正确定义,请大侠们帮忙解释一下。
[解决办法]
一个称作thunk的东西可以做这个,据说ATL就是用thunk把wnd_proc放到类里的,你可以参考这个文章的第一部分
http://blog.csdn.net/aj3423/article/details/8736586
codeproject上也有两篇讲thunk的

另外针对窗口回调这个问题有个取巧的办法(我没用过,仅供参考),因为CreateWindowEx最后那个参数是
lpParam 

[in] Pointer to a value to be passed to the window through the CREATESTRUCT structure passed in the lParam parameter the WM_CREATE message.
 
在创建窗口时候能在 wnd_proc 里拿到,而且这个参数通常是用不到的,所以可以利用一下:
class CMain {
public:
virtual LRESULT wnd_proc(...) {}
};

LRESULT wnd_proc_helper(hwnd,msg,wp, LPARAM lp) {

CMain* win = (CMain*)lp;
win->wnd_proc(hwnd,msg,wp,lp);
}

[解决办法]
引用:
建议楼主去看看函数指针,以及窗口回调是如何实现的。

对于Windows,窗口回调一般都要求是static修饰


把类中定义的回调函数定义成静态函数即可, 

如果非静态函数, 会自动在参数列表中加入this, 所以就导致编译出来与参数类型不符合了.
[解决办法]
把类中定义的回调函数定义成静态函数即可  这句重点
[解决办法]
type UINT callbackfunc (CBase *lpThis)
{

}

class CBase

virtual UINT doproc(){......return 0;};
static UINT callback_doproc(CBase *lpThis)
{
  return lpThis->doproc();
}
};
class CDrived_A:public CBase
{
......
virtual UINT doproc(){....return 0;}

}
class CDrived_B:public CBase
{
......
virtual UINT doproc(){....return 0;}

}

这样做感觉如何,把回调函数用静态函数封装起来
然后回调函数,调用对应的虚函数的实现。

热点排行