invalidateRect解析

先看函数结构:

BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect, // address of rectangle coordinates
BOOL bErase // erase-background flag
);
参数说明:

1:hwnd:要更新的客户区所在的窗体的句柄。如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送WM_ERASEBKGNDWM_NCPAINT 给窗口过程处理函数。

2:lpRect:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。

3:bErase:参数bErase为TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色;如果为FALE则保存现在的背景色,我认为这并不是说不对背景重绘,而是说用原来的背景色来重新绘背景,所以即便你调用了SetBkColor()也不会改变它的背景色,除非,你将此参数设为TRUE;

返回值:
函数成功则返回非零值,否则返回零值。
说明:

该函数的作用是让指定的RECT区域变为无效,并在系统的消息队列中放置WM_PAINT消息,但由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。所以在调用invalidateRect()后并不会立即重绘,只能等到系统处理到它的或别人发的WM_PAINT消息时,才会被重绘;

如果想要立即重绘,调用UpdateWindow();

调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。其实发送的都是WM_PAINT消息,只不过是一个用的sendMessage()发的,一个是用PostMessage()发的。

对于WM_PAINT消息,我理解的处理过程如下:

在处理到WM_PAINT消息时,系统会将消息队列中所有的无效区域累加起来,一起重绘,然后丢弃所有的WM_PAINT消息。所以无论你发的WM_PAINT早还是晚,如果在处理到一个WM_PAINT消息时,它们都在队列中,就会将它们的无效区域累加起来,一起绘图。很明显,提高了效率!


你可能感兴趣的:(invalidateRect解析)