一般来说回调函数都必须设为全局函数。但是某些情况下须要使用成员函数。而今天下午发现有人问如何定义一个TIMERPROC回调函数为类的一个成员函数,在这里给出一个简单的解决方法。主要思想是“移花接木”。这里因为在编译阶段要进行类型检查,拟以无法用成员函数,但是我们完全可以runtime时可以将成员函数的地址写入。代码如下:
class SAMPLE
{
public:
...
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent, DWORD dwTime);
void SetMyTimer();
…
}
typedef void ( CALLBACK SAMPLE::*MemberPtr)(HWND,UINT,UINT_PTR, DWORD);
void CALLBACK SAMPLE::TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent, DWORD dwTime)
{
return ;
}
Void SAMPLE::SetMyTimer()
{
MemberPtr p = &SAMPLE::TimerProc;
TIMERPROC timeproc = NULL;
void* pVoid;
pVoid = &timeproc;
DWORD* pWord;
pWord = (DWORD*)pVoid;
void* pVoidMember;
pVoidMember = &p;
DWORD* pWordMember;
pWordMember = (DWORD*)pVoidMember;
*pWord = static_cast(*pWordMember); //以上几步显得有些罗嗦,仅是为了清楚显示过程.
::SetTimer(NULL, 0, 1000, timeproc);
}
注意:以上转换过程显得有点烦,主要是表达它的过程^_^!
当然强烈提醒要注意的是:必须在对象析构之前解去这个时钟。