如何在ATL控件类的静态函数中获取ATL控件的实例?

chuxuecharp 2010-11-23 03:41:41
我创建了一个ATL控件,由于要在这个控件中使用SetTimer,Timer的回调函数只能使用全局函数或静态函数。由于我需要在这个静态函数中调用ATL控件中的方法,所以必须得先获取ATL控件的实例,请问怎样才能在静态函数中获取ATL控件的实例对象呢?
...全文
153 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuxuecharp 2010-11-24
  • 打赏
  • 举报
回复
另外报告一下:
在WM_TIMER消息的处理函数中可以正常引发事件了。


chuxuecharp 2010-11-24
  • 打赏
  • 举报
回复
大意了,把::SetTimer(NULL,0,2000,NULL)修正为::SetTimer(this->m_hWnd,0,2000,NULL)可以收到wm_timer消息了。
chuxuecharp 2010-11-24
  • 打赏
  • 举报
回复
我的控件没有界面,运行时不可见。无法响应wm_timer啊。

我后来把运行不可见去掉,构造函数中加了 m_bWindowOnly = TRUE;仍然无法响应wm_timer。
但是可以正常响应wm_create。

我试图使用::SetTimer(NULL,0,2000,NULL);来产生wm_timer消息。

因为msdn上有说:

lpTimerFunc
[in] Pointer to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc. If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter.
bdzwj 2010-11-23
  • 打赏
  • 举报
回复
我很纳闷,直接处理WM_TIMER不行吗? 还需要自己写回调?

如果你非要使用回调,那用SetProp()将对象实例指针写入窗口句柄,在回调中读取,然后强制转换
chuxuecharp 2010-11-23
  • 打赏
  • 举报
回复
顶!
我用vs2008开发。
搜索ATL多线程引发事件时,在微软官方找到这篇内容,不知是否有用。
http://support.microsoft.com/kb/280512/zh-cn

如果确实没问题,那看来可以抛弃Timer了
chuxuecharp 2010-11-23
  • 打赏
  • 举报
回复
开线程做定时器,好像又不可以引发ATL控件的事件,比如Fire_xxxxx。
  • 打赏
  • 举报
回复
SetTimer比较麻烦,还是开个线程自己做定时器吧

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧