ixMind(路在何方) 程序会在空闲的时候做这方面的处理,能否讲得更清楚写。何时为空闲?我只看到一次WM_PAINT,是由UpdateWindow(...)产生的(详见下附代码) 如果去掉BeginPaint(),EndPaint()倒是一直产生WM_PAINT,不过Petzold说这样做是错误的又MSDN 关于WM_PAINT叙述如下: The system sends this message when there are no other messages in the application's message queue. 程序空闲时干这个。我什么也没干,它应该很空才是,怎么我才看到一次WM_PAINT呢?有点糊涂了。附代码: WindowProc(...)//in window procedure { case: WM_PAINT: OutputDebugString("On message WM_PAINT\n"); BeginPaint(...); EndPaint(...); return 0; }
你也可以调用UpdateWindow来强制即时刷新窗体
如果去掉BeginPaint(),EndPaint()倒是一直产生WM_PAINT,不过Petzold说这样做是错误的又MSDN 关于WM_PAINT叙述如下:
The system sends this message when there are no other messages in the application's message queue.
程序空闲时干这个。我什么也没干,它应该很空才是,怎么我才看到一次WM_PAINT呢?有点糊涂了。附代码:
WindowProc(...)//in window procedure
{ case:
WM_PAINT:
OutputDebugString("On message WM_PAINT\n");
BeginPaint(...);
EndPaint(...);
return 0;
}
(不过那上面是QS_PAINT标志)以下供参考
UpdateWindow的内部流程是检查窗体的无效区域是否为空,如不为空,
则SendMessage(hwnd, WM_PAINT...)
(注意SendMessage对于同一个线程的窗体,是直接调用该窗体的WndProc,
而不是经过消息队列传递的)InvalidateRect只是设置无效区(不知道是不是立即设置paint标志)
具体的重绘操作是等稍后“空闲”的时候来完成的,因为WM_PAINT/PM_QS_PAINT
的优先级仅高于WM_TIMER/QS_TIMER,而比其它的都低