BOOL InvalidateRect(
__in HWND hWnd,
__in const RECT *lpRect,
__in BOOL bErase
);//該函數調用後會產生 WM_PAINT消息
hWnd 哪個窗口要更新 爲NULL表示所有窗口(不僅僅是本程序窗口) 不推薦設成NULL
lpRect 要更新的矩形區域
bErase 如果是TRUE 表示BeginPaint函數調用時lpRect所指的區域被擦除 否則不擦除
案例說明: 客戶區有一方框rect(0,0,100,100) 單擊在方框裏畫一對角線 再單擊消失 再單擊又出現
static BOOL bFlag;//bFlag是1時顯示 0時消失
case WM_LBUTTONDOWN:
bFlag ^= 1;
InvalidateRect(hwnd, &rect, FALSE);//究竟應該TRUE 還是FALSE呢
return 0;
case WM_PAINT :
hdc = BeginPaint( hwnd,&ps);
hBrush = GetStockObject( GRAY_BRUSH);
SelectObject( hBrush);
SetRect(&rect, 0, 0, 100, 100);//畫矩形 僅僅 邊框不填充內部
FrameRect(hdc, &rect, hBrush);
// Rectangle( hdc, 0, 0, 100, 100);//邊框 且 填充內部
if(bFlag)
LineTo(100,100);
EndPaint(hwnd,&ps);
return 0 ;
現象:InvalidateRect函數 bErase=FALSE時 用FrameRect對角線出現後再次單擊 對角線不消失
bErase=TRUE時 用FrameRect對角線出現後再次單擊 對角線消失
bErase=FALSE時 用Rectangle對角線出現後再次單擊 對角線消失
bErase=TRUE時 用Rectangle對角線出現後再次單擊 對角線消失
分析:bErase=FALSE時 不擦除lpRect所指區域 WM_PAINT中已經不畫對角線 而FrameRect只畫邊框內部不填充 所以對角線仍然存在(是上次畫的)
bErase=FALSE時 不擦除lpRect所指區域 雖然WM_PAINT中已經不畫對角線Rectangle會填充內部 所以對角線消失了