快乐小胖兔的一窟

用自己的方式过一生 --- zyq654321

VC知识库BLOG 首页 新随笔 联系 聚合 登录
  23 Posts :: 0 Stories :: 83 Comments :: 2 Trackbacks

公告

Welcome you

留言簿(7)

随笔分类

随笔档案

文章档案

相册

网站联接

BLOG友情链接

搜索

最新评论

阅读排行榜

评论排行榜

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

}

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

posted on 2004-11-05 05:29 HERCULES BLOG 阅读(3417) 评论(3)  编辑 收藏

Feedback

# re: 如何将普通成员函数设为系统的回调函数 2004-11-13 05:15 demitasse
*pWord = static_cast(*pWordMember);
这句好像有问题,我照你的方法编译无法通过,static_cast的语法不是这样吧


# thank you for you kindly, I missed. 2004-11-13 05:52 hercules
Sorry, 漏了static_cast<DWORD>(*pWordMember)

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]