理解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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章