Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381385
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:31:42

    一般来说回调函数都必须设为全局函数。但是某些情况下须要使用成员函数。而今天下午发现有人问如何定义一个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);

}

    注意:以上转换过程显得有点烦,主要是表达它的过程^_^!
    
当然强烈提醒要注意的是:必须在对象析构之前解去这个时钟。


--------------------next---------------------

阅读(230) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~