|
发表于 2019-5-22 13:13:34
|
显示全部楼层
能搞2天,已经很不错,有时一个问题,我们都还想一个星期,甚至个把月。才彻底明白了。
就跟给别人装机一样,一会,一会,几个小时,一天过去,可能就还是一会。但是肚子确实就饿了。
时间对你来说不重要,重要的是把问题弄明白。
你的问题不在于在哪个窗口,而在于没明白定时器
首先看SDK定时器定义:
UINT_PTR SetTimer(
HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
第一个参数是窗口句柄
第二个参数是定时器ID
第三个参数是响应时间,按毫秒计算
第四个参数是响应函数。
当第四个参数为NULL时,通过窗口的WM_TIMER消息响应. 第一个参数指明窗口。
当第四个参数不为NULL时,通过第四个参数的来响应消息。这是第一个参数可以设为NULL,也可以设置一个窗口。
此时与窗口就没什么关系,第四个参数是全局函数。
再看MFC定时器定义:
UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent,UINT nElapse,void(__stdcall*lpfnTimer)(HWND,UINT,UINT_PTR,DWORD));
区别就是MFC没窗口句柄,而是CWND类。
CWND取窗口句柄,不是很简单,比如当前CWND实例,只要
this->GetSafeHwnd();就获取了。
第三回答你的问题
你建了页控件,并绑定对话框,变量肯定知道。
你要把定时器响应函数绑到哪个窗口,就用哪个变量,不就行了。
比如你页对话框分别为m_dlg1,m_dlg2, 要绑定m_dlg2窗口上
就这样:
int nIDEvent = 1;
int nElapse = 1000;
m_dlg2.SetTimer(nIDEvent, nElapse, NULL);
不过这样还不能产生动作。因为第三个餐宿为NULL,表示用窗口消息,
得添加WM_TIMER消息响应及处理函数OnTimer.
如果担心它收不到消息,它是子窗。就不用消息试试。
m_dlg2.SetTimer(nIDEvent, nElapse, MyTimerProc);
再添加全局或静态函数
VOID CALLBACK MyTimerProc(
HWND hwnd, // handle to window for timer messages
UINT message, // WM_TIMER message
UINT idTimer, // timer identifier
DWORD dwTime) // current system time
{
}
|
|