我们先来看看函数结构:
boolinvalidaterect(hwndhwnd,//handleofwindowwithchangedupdateregionconstrect * LP rect,/addressofrectanglecoordinatect
1: 参数说明:包含要更新的客户区域的表单的句柄。 如果为NULL,则在函数返回之前重新绘制所有窗口,并将hwnd:和WM_ERASEBKGND发送到窗口处理函数。
2: WM_NCPAINT无效区域中的矩形是存储矩形大小的结构指针。 如果为NULL,则所有联系人客户区域都将添加到更新区域。
3: lpRect:如果参数bErase为TRUE,系统将在您绘制之前用背景色覆盖选定区域一次。 默认背景颜色为白色,可以通过设置BRUSH来更改背景颜色。 如果为FALE,则保存当前背景色。 我认为这并不是不重新绘制背景,而是用原始背景颜色重新绘制背景。 因此,调用SetBkColor ()不会改变背景颜色。 否则,将此参数设置为TRUE。
如果bErase:函数成功,则返回非零值;否则返回零值。返回值:
此函数的作用是禁用指定的RECT空间并将WM_PAINT消息放在系统的消息队列中,但由于WM_PAINT消息的优先级较低,因此必须在消息队列中的其他消息发送后再处理因此,调用invalidateRect ) )并不会立即重新绘制,除非系统处理了它或有来自其他人的WM_PAINT消息。
说明:
调用UpdateWindow函数时,WM_PAINT将直接发送到目标窗口,并立即重新绘制该窗口。 其实正在发送WM_PAINT消息。 只是一个用sendMessage ()发送,另一个用PostMessage () )发送。
如果想要立即重绘,调用UpdateWindow();
处理WM_PAINT消息时,消息队列中的所有无效区域将累积、重新呈现在一起,并丢弃所有WM_PAINT消息。 所以,无论你发送的WM_PAINT是快是慢,当它被处理成WM_PAINT消息时,如果它们在队列中,就会累计它们的无效区域,并一起绘图。 很明显,效率提高了!