我用spy++看过,就是因为这个WM_SYSTIMER发送到了RichEdit(我派生过),导致WM_TIMER没有连续送到,结果出现progressbar不能连续运动,断断续续。请问系统发这个消息是做什么呢?为什么会发送他,而且发送到RichEdit,这个时候RichEdit也没有显示什么东西。怎么解决这个WM_TIMER不连续的问题呢

解决方案 »

  1.   

    WM_TIMER从来就不是一个可靠的定时器,当系统繁忙的时候,WM_TIMER就会出现中断和积累。
    RichEdit,我建议你不要仔细去分析,分析那样一个黑盒子得不偿失的。如果RichEdit不能满足你的要求,你最好去CodeProject之类的地方,另外找一个有源代码的合适的Edit。
      

  2.   

    BOOL AfxInternalIsIdleMessage(MSG* pMsg)
    {
    // Return FALSE if the message just dispatched should _not_
    // cause OnIdle to be run.  Messages which do not usually
    // affect the state of the user interface and happen very
    // often are checked for. // redundant WM_MOUSEMOVE and WM_NCMOUSEMOVE
    if (pMsg->message == WM_MOUSEMOVE || pMsg->message == WM_NCMOUSEMOVE)
    {
    // mouse move at same position as last mouse move?
      _AFX_THREAD_STATE *pState = AfxGetThreadState();
    if (pState->m_ptCursorLast == pMsg->pt && pMsg->message == pState->m_nMsgLast)
    return FALSE; pState->m_ptCursorLast = pMsg->pt;  // remember for next time
    pState->m_nMsgLast = pMsg->message;
    return TRUE;
    } // WM_PAINT and WM_SYSTIMER (caret blink)
    return pMsg->message != WM_PAINT && pMsg->message != 0x0118;
    }WM_SYSTIMER是为了光标闪烁,ID为0x118,当然消息为WM_SYSTIMER时OnIdle就不会执行。
    不过不应该影响WM_TIMER才对。
      

  3.   

    不知道这个是否有用:
    深入剖析MFC中对于Windows消息处理、运行机制http://search.csdn.net/Expert/topic/674/674432.xml?temp=.6512873
      

  4.   

    WM_SYSTIMER,检查你的richedit内容是否改变?
      

  5.   

    0x118消息是WM_SYSTIMER消息(系统用来通知光标跳动的一个消息)。
    也就是说,如果消息为WM_SYSTIMER或者WM_SYSKEYDOWN,并且空闲显示标志为真的话,就显示窗口并通知窗口立刻重绘。
      

  6.   

    重载App::IsIdleMessage(MSG *pMsg)
    }  
      if (!CWinApp::IsIdleMessage( pMsg) || pMsg->message == WM_TIMER) return FALSE;
      else return TRUE;
    }现象好了很多,基本消失(虽然Progressbar还不是很光滑,但是可以接受了)
    请问是什么道理呢?有没有人帮我说明一下。谢谢
      

  7.   

    你检查一下,在OnTimer响应函数中有没有block的操作。按照一般设计原则,OnTimer函数的工作应该是瞬间完成的。