UI界面没有及时刷新时,添加如下代码强制重绘:
InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);
当窗体需要更新内容或是重绘外观背景的时候,应用程序通常会发送一条WM_PAINT消息,通知窗体进行重新绘制。
InvalidateRect(m_hWnd, lpRect, bErase)
强制使客户区中的一个矩形失效,而在客户区中有一个无效区域将导致Windows在应用程序的消息队列中放置一条WM_PAINT消息。
即:强制系统进行重绘,但是不一定马上会进行重绘,仅仅是通过Post方式将WM_PAINT消息放入到窗体消息队列,当执行到WM_PAINT消息时候才会执行重绘。重绘区域通过lpRect指定,如果为NULL,则重绘整个客户区
UpdateWindow(m_hWnd)
UpdateWindow是非队列消息,促使Windows发送WM_PAINT消息给窗口,也就是说Windows调用了该窗口的窗口过程。
即:绕过消息队列直接向窗体发送WM_PAINT消息并且立即执行,发送之前会通过GetUpdateRect(hWnd, NULL, TRUE)看看是否有需要绘制的客户区域,如果没有,就不发送WM_PAINT消息了。
RedrawWindow(HWND hWnd, LPCRECT lpRectUpdate, CRgn* prgnUpdate, UINT flags):
具有InvalidateRect和UpdateWindow的双特性。声明窗口状态为无效,并立即更新窗口,立即调用WM_PAINT消息。
通常我们会看到这样的组合:
InvalidateRect(m_hWnd, lpRect, bErase);
UpdateWindow(m_hWnd);
目的是让窗体立即刷新无效区域
Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。
UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。
效果很明显,当调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。
如果调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句。
MSDN的解释 :
UpdateWindow
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty.
The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue.
If the update region is empty, no message is sent.
InvalidateRect
The system sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window.
翻译成中文大概的解释如下:
UpdateWindow:如果有无效区,则马上sending a WM_PAINT message到窗口处理过程,不进消息队列进行排队等待,立即刷新窗口,否则,什么都不做。
InvalidateRect:设置无效区,如果为NULL参数,则设置整个窗口为无效区。当应用程序的那个窗口的消息队列为空时,则sending a WM_PAINT message(即使更新区域为空).在sending a WM_PAINT message的所有InvalidateRect的更新区域会累加。
参考:
1.VC++ 关于窗口刷新的几个函数InvalidateRect、UpdateWindow、RedrawWindow_vc postmessage 刷新窗口-CSDN博客
2.Invalidate、RedrawWindow与UpdateWindow的区别
3.RedrawWindow, UpdateWindow,InvalidateRect 用法
4.https://zhuanlan.zhihu.com/p/150660047?from_voters_page=true Windows窗口与消息:消息与消息队列