理解InvalidateRect函數




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會填充內部 所以對角線消失了
發佈了65 篇原創文章 · 獲贊 17 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章