我做了一个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函数同样不相应,这是为十马??!!

解决方案 »

  1.   

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

  2.   

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

  3.   

    You can give me the source code.
    [email protected]
    http://rosement.diy.163.com
      

  4.   

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

  5.   

    >但是你可以在非模式得上一層設置OnTimer..然後用指正傳遞到你的裡面教我,我不认识繁体字。
      

  6.   

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

  7.   

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

  8.   

    小时候看,郑猿截呵呵。to chinaren_shibo:
    那我该如何做呢?难道只有我一个人需要在非模式对话框里使用定时器?如何在非模式对话框里使用定时器?
      

  9.   

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

  10.   

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

  11.   

    是的,搞错乐,不是非模式对话框的原因,是OnTimer没有在SetTimer后正常启动,奇怪,研究ing...相关:http://www.csdn.net/Expert/TopicView1.asp?id=949731
      

  12.   

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

  13.   

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