当窗口发生重绘时,应用程序会接收到WM_PAINT消息,从而调用ONPaint()函数,当程序中调用以下几个函数时会发送WM_PAINT消息。
在讲解之前有一点知识需要明白:即当窗口有效时,那么我们是不能对窗口进行绘制,当窗口无效时,我们才能向窗口进行重画操作。
1. void Invalidate( BOOL bErase = TRUE )
该函数的作用是使整个窗口的客户区无效,使客户区无效就意味着对客户区需要重绘,从而对应用程序发送WM_PAINT消息。这就导致程序强制应用程序进行重画,但不一定是马上进行重画,该消息是利用PostMessage()来传递WM_PAINT消息到消息队列中,当执行到该WM_PAINT消息时,才会对客户区进行重画。
在该函数中,参数默认为TRUE,当参数为TRUE时,重绘区域将会重画,否者,背景将保持不变。
2. BOOL InvalidateRect(HWND hWnd,//需要重绘的窗口的句柄
LPCRECT lpRect,//需要重绘的矩形区域
BOOL bErase = TRUE)//重绘矩形的方式
需要更新窗口时可以利用Invalidate()重绘整个窗口,但是该函数需要的计算量很大,会导致屏幕出现闪烁,为了防止这种情况,可以使用InvalidateRect来代替Invalidate,因为这个函数仅重绘这个窗口中的小矩型,计算量小的多。
在该函数中,最后一个参数bErase为TRUE时,会向窗体发送一个WM_ERASEBKGND消息,这个消息会使背景进行重绘,TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。
3.UpdateWindows()
UpdateWindows(),当调用这个函数的时候,会立即让当前的窗口失效,然后对整个窗口立即进行重绘。UpdateWindows()函数调用的时候直接将OnPaint调用到目标窗口,使目标窗口立即进行重绘。当然在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。
与Invalidate的区别: UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。
4.RedrawWindow()
则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。
注意:UpdateData()函数不是用于刷新窗口,而是用于更新数据。参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反。