InvalidateRect添加一個地區到指定視窗的更新地區。更新地區代表必須被重繪的視窗用戶端區域的一部分。
BOOL InvalidateRect(
HWND hWnd, // 視窗的HANDLE
CONST RECT* lpRect, // 矩形餓座標
BOOL bErase // 擦除狀態
);
參數:
hWnd:[輸入]一個更新地區已經改變的視窗HANDLE。如果這個參數是NULL,系統將是所有的視窗無效和重繪,並在函數返回之前發送WM_ERASEBKGND和WM_NCPAINT訊息到視窗的處理常式。
lpRect:[輸入]指向一個RECT結構,該結構包含了被添加到更新地區的客戶座標,如果這個參數是NULL,整個用戶端區域將被添加到更新地區。
bErase::[輸入]說明當更新地區被處理的時候更新地區內的背景是否要擦除。如果這個參數是TRUE,當BeginPaint函數被調用的時候背景將被擦除,如果參數是FALSE,背景不會改變。
傳回值:
如果函數成功,傳回值非0
如果函數失敗,傳回值是0
Windows NT/2000/XP: 使用GetLastError得到錯誤的詳細解釋。
備忘:
無效的地區被累積,直到下個WM_PAINT訊息被處理或著通過ValidateRect或ValidateRgn來使地區變有效。
系統發送一個WM_PAINT訊息給到一個視窗,無論視窗的更新地區是不是空的,有沒有其他的訊息在視窗的應用程式隊列中。
指定的地區必須已經通過一個地區函數建立了。
如果更新地區中任何部分的bErase參數是TRUE,整個地區的背景都被擦除,而不是指定的那部分。
要求平台:
WINDOWS NT/2000/XP:包括WINNT3.1以後
WIN95/98/ME:包括95以後的版本
標頭檔:在winuser.h中聲明,包含windows.h
庫檔案: User32.lib
例子代碼:
無效客戶區系統並不是WM_PAINT訊息的唯一來源,InvalidateRect或InvalidateRgn函數可以間接為你的視窗產生WM_PAINT訊息,這些函數標記所有的或部分的客戶區為無效(必須被重繪)。
在後面的例子中,視窗程序在處理WM_CHAR訊息的時候將整個客戶區無效。這就允許使用者通過輸入一個數字來表示並瀏覽結果,一旦應用程式的訊息佇列中沒有其他訊息,這些結果將被畫出來。
//點的集合
POINT aptPentagon[6] = {50,2, 98,35, 79,90, 21,90, 2,35, 50,2},
aptHexagon[7] = {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2};
POINT *ppt = aptPentagon;
int cpt = 6; //預設頂點書
.
.
.
case WM_CHAR:
switch (wParam)
{
case '5': //使用者輸入了5
ppt = aptPentagon;
cpt = 6;
break;
case '6': //使用者輸入了6
ppt = aptHexagon;
cpt = 7;
break;
}
InvalidateRect(hwnd, NULL, TRUE);
return 0L;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rc);
SetMapMode(hdc, MM_ANISOTROPIC);
SetWindowExtEx(hdc, 100, 100, NULL);
SetViewportExtEx(hdc, rc.right, rc.bottom, NULL);
Polyline(hdc, ppt, cpt); //畫線
EndPaint(hwnd, &ps);
return 0L;
在這個例子中,InvalidateRect的NULL參數表示整個客戶區,TRUE參數導致背景被擦除,如果你不想應用程式等待應用程式的訊息佇列中沒有其他訊息再更新,你可以調用UpdateWindow函數來強迫立即發送WM_PAINT訊息。如果客戶區有任何無效的部分UpdateWindow將發送WM_PAINT訊息到指定的window程式。