本文共 1137 字,大约阅读时间需要 3 分钟。
在mfc的group上有这样一个问题:( ) I need to update one class data and the view during the idle, I used this method in the Cdoc: void CMyAppDoc::OnIdle(){ theClass -> Update(); POSITION pos = GetFirstViewPosition(); CView * pView = GetNextView(pos); pView -> Invalidate( true ); pView -> UpdateWindow(); } It works only when I move the mouse, what ' s wrong? Z_Z 这个问题的确比较搞,要好好看mfc源码的,下面是我的回答 Nothing is wrong, I can explain it is by design. Please take a look at the source code of int CWinThread::Run(), in that function, IsIdleMessage() is called, and in IsIdleMessage() WM_PAINT is ignored, which means WM_PAINT will not cause OnIdle to be called, for windows think it's just a WM_PAINT message and will not change the UI. Your UpdateWindow() only post a WM_PAINT message, the message queue is not empty but it's ignored by IsIdleMessage(), that's why. But when you move your mouse, the message queue is filled with some WM_MOUSEMOVE and it's not ignored for the position changes. So your OnIdle() is called again. - My suggestion is to move your Invalidate & UpdateWindow code to somewhere else. OnIdle() 的确是个有点复杂的问题,我可能还会写几篇文章 :) 这里( )有篇文章讲的很到位 转载地址:http://xyqhl.baihongyu.com/