奇怪问题,MFC,定时器在非模式对话框中无效,不信进来看看。

时间:2022-04-06 00:22:34
我做了一个CStatic派生类,用定时器每隔100ms重画窗口,加上了定时器:
BEGIN_MESSAGE_MAP(CGradientbar, CStatic)
//{{AFX_MSG_MAP(CGradientbar)
ON_WM_PAINT()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

 void CGradientbar::OnTimer(UINT nIDEvent) 
 {
//。。。。。。。。。。。。。
MessageBox("Test");
 
 }

void CGradientbar::Start()
{
////////.............................
SetTimer(0,100,NULL);

}


把一个Static资源加到对话框CTestDlg中,用Classwizard声明为CGradientbar类对象,奇怪的是,CTestDlg作为模式对话框使用时,一切正常:
CTestDlg dlg;
dlg.DoModal(); //在dlg的initdlg中调用CGradientbar::Start()

但是将CTestDlg作为非模式对话框使用时,就无法进入OnTimer函数:
CTestDlg dlg;
dlg.Create(IDD_DIALOG_TEST); 
dlg.ShowWindow(SW_SHOW);  
经调试已经运行Start()的SetTimer函数,但是OnTimer就是不相应。
随后在SetTimer函数后加上MessageBox("Test2")后,就可以相应OnTimer函数,靠见鬼了。

我又试了试在CtestDlg中使用定时器,同样结果,如果对话框是非模式对话框的话,对话框映射的OnTimer函数同样不相应,这是为十马??!!

18 个解决方案

#1


你的水平比我高!!
我帮你UP!

#2


无模式对话框又没有自己的消息循环,故此定时器无效

#3


但是主线程的消息循环为什么不把这个WM_TIMER分发给static呢?

#4


up

#5


呜呼,那怎么整?

#6


糕鱼昏这名字怎么这么耳熟?回忆ing...

#7


You can give me the source code.
rosement@sina.com
http://rosement.diy.163.com

#8


糕鱼昏,被五角飞碟收拾者也。

#9


定時器是無法在非模式得對話框裡面運行得.
但是你可以在非模式得上一層設置OnTimer..然後用指正傳遞到你的裡面

#10


>但是你可以在非模式得上一層設置OnTimer..然後用指正傳遞到你的裡面

教我,我不认识繁体字。

#11


我是这么想的,模式对话框有他自己的消息循环,他是你定义那个类的窗口的父窗口,所以在模式下,你的程序正确,但在非模式下时,该对话框,已没有了自己的消息循环,所以,你的static里的ontimer消息已传到了,你整个程序的主窗口,而你并没有处理。

我只是这么想,我水平不高

#12


to iProgram(小癞蛤蟆):
  你也看《童话大王》吗?

#13


小时候看,郑猿截呵呵。

to chinaren_shibo:
那我该如何做呢?

难道只有我一个人需要在非模式对话框里使用定时器?如何在非模式对话框里使用定时器?

#14


诸位:有没有搞错!
我做过的,目的是用一个非模式对话框模仿CDialogBar,在OnInitDialog()设置定时器,OnDestroy()中销毁,完全可以用。
如果照诸位讲的没有消息循环,OnPaint,OnDestroy,OnSetcursor,OnCreat不都没法用了?怎么会没有消息?

#15


hehe,很奇怪,我就在非模里用ontimer呀,一点问题都没有的

#16


是的,搞错乐,不是非模式对话框的原因,是OnTimer没有在SetTimer后正常启动,奇怪,研究ing...

相关:http://www.csdn.net/Expert/TopicView1.asp?id=949731

#17


而且我还有一个CStatic派生的滚动字幕控件,在控件里面OnTimer,控件放在非模对话框里,也没有问题

#18


突然想到一个问题,你的OnTimer是用ClassWizard加的还是你自己手写的?
定义的时候是用afx_msg void OnTimer(UINT nIDEvent);吗

#1


你的水平比我高!!
我帮你UP!

#2


无模式对话框又没有自己的消息循环,故此定时器无效

#3


但是主线程的消息循环为什么不把这个WM_TIMER分发给static呢?

#4


up

#5


呜呼,那怎么整?

#6


糕鱼昏这名字怎么这么耳熟?回忆ing...

#7


You can give me the source code.
rosement@sina.com
http://rosement.diy.163.com

#8


糕鱼昏,被五角飞碟收拾者也。

#9


定時器是無法在非模式得對話框裡面運行得.
但是你可以在非模式得上一層設置OnTimer..然後用指正傳遞到你的裡面

#10


>但是你可以在非模式得上一層設置OnTimer..然後用指正傳遞到你的裡面

教我,我不认识繁体字。

#11


我是这么想的,模式对话框有他自己的消息循环,他是你定义那个类的窗口的父窗口,所以在模式下,你的程序正确,但在非模式下时,该对话框,已没有了自己的消息循环,所以,你的static里的ontimer消息已传到了,你整个程序的主窗口,而你并没有处理。

我只是这么想,我水平不高

#12


to iProgram(小癞蛤蟆):
  你也看《童话大王》吗?

#13


小时候看,郑猿截呵呵。

to chinaren_shibo:
那我该如何做呢?

难道只有我一个人需要在非模式对话框里使用定时器?如何在非模式对话框里使用定时器?

#14


诸位:有没有搞错!
我做过的,目的是用一个非模式对话框模仿CDialogBar,在OnInitDialog()设置定时器,OnDestroy()中销毁,完全可以用。
如果照诸位讲的没有消息循环,OnPaint,OnDestroy,OnSetcursor,OnCreat不都没法用了?怎么会没有消息?

#15


hehe,很奇怪,我就在非模里用ontimer呀,一点问题都没有的

#16


是的,搞错乐,不是非模式对话框的原因,是OnTimer没有在SetTimer后正常启动,奇怪,研究ing...

相关:http://www.csdn.net/Expert/TopicView1.asp?id=949731

#17


而且我还有一个CStatic派生的滚动字幕控件,在控件里面OnTimer,控件放在非模对话框里,也没有问题

#18


突然想到一个问题,你的OnTimer是用ClassWizard加的还是你自己手写的?
定义的时候是用afx_msg void OnTimer(UINT nIDEvent);吗