I need to update one class data and the view during the idle, I used this
method in the Cdoc:
POSITION pos = GetFirstViewPosition();
CView* pView = GetNextView(pos);
It works only when I move the mouse, what's wrong? Z_Z
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（）