c++窗口立即刷新重绘

UI界面没有及时刷新时,添加如下代码强制重绘:

InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);

当窗体需要更新内容或是重绘外观背景的时候,应用程序通常会发送一条WM_PAINT消息,通知窗体进行重新绘制。

1、InvalidateRect

InvalidateRect(m_hWnd, lpRect, bErase)

强制使客户区中的一个矩形失效,而在客户区中有一个无效区域将导致Windows在应用程序的消息队列中放置一条WM_PAINT消息。

即:强制系统进行重绘,但是不一定马上会进行重绘,仅仅是通过Post方式将WM_PAINT消息放入到窗体消息队列,当执行到WM_PAINT消息时候才会执行重绘。重绘区域通过lpRect指定,如果为NULL,则重绘整个客户区

2、UpdateWindow

UpdateWindow(m_hWnd)

UpdateWindow是非队列消息,促使Windows发送WM_PAINT消息给窗口,也就是说Windows调用了该窗口的窗口过程。

即:绕过消息队列直接向窗体发送WM_PAINT消息并且立即执行,发送之前会通过GetUpdateRect(hWnd, NULL, TRUE)看看是否有需要绘制的客户区域,如果没有,就不发送WM_PAINT消息了。

3、RedrawWindow

RedrawWindow(HWND hWnd, LPCRECT lpRectUpdate, CRgn* prgnUpdate,  UINT flags):

具有InvalidateRect和UpdateWindow的双特性。声明窗口状态为无效,并立即更新窗口,立即调用WM_PAINT消息。

4、让窗体立即刷新无效区域

通常我们会看到这样的组合:

InvalidateRect(m_hWnd, lpRect, bErase);

UpdateWindow(m_hWnd);

目的是让窗体立即刷新无效区域


5、其他解释

        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窗口与消息:消息与消息队列 

你可能感兴趣的:(windows客户端,windows,c++)