理解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会填充内部 所以对角线消失了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值