~~~
BOOL InvalidateRect(
HWNDhWnd,???????????// 窗口句柄
CONST RECTlpRect,???// 矩形區域
BOOLbErase???????????//是否擦除背景
);
~~~
**InvalidateRect**只是增加重繪區域,在下次WM_PAINT的時候才生效。InvalidateRect函數中的參數TRUE表示系統會在你畫之前用背景色將所選區域覆蓋一次,默認背景色為白色,可以通過設置BRUSH來改變背景色。
**void Invalidate( BOOL bErase )**執行之后調用函數的次序為:
...OnPaint()->OnPrepareDC()->OnDraw()
所以只是刷新在OnPaint()和OnDraw()函數中的繪圖語句。其它地方沒有影響。
**Invalidate()**標記一個需要重繪的無效區域,并不意味著調用該函數后就立刻進行重繪。類似于PostMessage(WM_PAINT),需要處理到WM_PAINT消息時才真正重繪。如果您Invalidate()之后還有其他的語句正在執行,程序沒有機會去處理WM_PAINT消息,只有當函數執行完畢后,消息處理才得以進行。
Invalidate()只是放一個WM_PAINT消息在隊列里,不做別的,所以只有當當前函數返回后,進入消息循環,取出WM_PAINT,才執行OnPaint(),所以不管Invalidate放哪里,都是最后執行的。
**InvalidateRect(hWnd,&rect,TRUE)**;向hWnd窗體發出WM_PAINT的消息,強制客戶區域重繪制。rect是你指定要刷新的區域,此區域外的客戶區域不被重繪,這樣防止客戶區域的一個局部的改動,而導致整個客戶區域重繪而導致閃爍,如果最后的參數為TRUE,則還向窗體發送WM_ERASEBKGND消息,在客戶區域重繪之前先重繪背景。
**UpdateWindow**只向窗體發送WM_PAINT消息,在發送之前判斷GetUpdateRect(hWnd,NULL,TRUE)看有無可繪制的客戶區域,如果沒有,則不發送WM_PAINT。
**如果希望立即刷新無效區域**,可以在調用InvalidateRect之后調用UpdateWindow,如果客戶區的任一部分無效,則UpdateWindow將導致Windows用WM_PAINT消息調用窗口過程(如果整個客戶區有效,則不調用窗口過程)。這一WM_PAINT消息不進入消息隊列,直接由WINDOWS調用窗口過程。窗口過程完成刷新以后立刻退出,WINDOWS將控制返回給程序中UpdateWindow調用之后的語句。
**UpdateData()**這個函數不是刷新界面用的。
**UpdateData()**;參數為FALSE時,將界面上控件綁定的變量的數據導到控件內,參數為TRUE時,導入方向則相反。