MFC中Invalidate(); 和UpdateWindow();的用法
来自:https://blog.csdn.net/foreverhuylee/article/details/20859443
1.
Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此 时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘;
UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT;
当调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列;
如果调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句
2.
和楼上差不多:Invalidate()使窗口客户区无效,并向消息队列中寄送一个WM_PAINT消息,假如此时消息队列中没有要处理的其他消息,则此时窗口立即会重绘(因为WM_PAINT会立即得到处理),如果消息队列中有其他消息,那么WM_PAINT就排队等呗。。。。这样就可能会存在一个不能即时刷新窗口的问题;
UpdateWindow()绕过消息队列(不进队),直接向窗口客户区发送WM_PAINT消息,使得窗口立即更新。
3.
单独的Invalidate(); 在窗口要重绘时用
和Invalidate();UpdateWindow();通常在程序开始时用
4.要注意UpdateWindow()和 UpdateData()的区别
UpdateData()一般是更新编辑框中的数据,
而UpdateWindow()是更新整个窗口。