如何在类里面定义回调函数?
我想自己写个很简单的窗口类,大致如下
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);
}[解决办法]
把类中定义的回调函数定义成静态函数即可,
如果非静态函数, 会自动在参数列表中加入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;}
}
这样做感觉如何,把回调函数用静态函数封装起来
然后回调函数,调用对应的虚函数的实现。