OnPaint不停刷新的问题

自定义控件响应WM_PAINT消息,在OnPaint中,默认有CPaintDC dc(this);
如果注释掉CPaintDC dc(this);则程序不停地刷新(计数器不停地飞涨!!),可是如果保留


则是正常响应。虽然问题解决了,但不知道具体原因???

 

答:原因得从CPaintDC说起。CPaintDC为窗口的OnPaint函数所使用的设备环境类。该类的构造

函数会自动调用BeginPaint函数,析构函数自动调用EndPaint函数。
      BeginPaint函数的作用就是将窗口需要重绘的区域设置为空(也就是Update Region置空)

。在正常情况下,我们接收到了WM_PAINT消息后,窗口的Update Region都是非空的(如果为空

就不需要发送WM_PAINT消息了)。而当你响应这个消息的时候又不调用BeginPaint来清空,窗口

的Update Region就一直是非空的,系统就会一直发送WM_PAINT消息。这样就形成了一个处理

WM_PAINT消息的死循环。这就是我出现错误的原因,低级错误。
      BeginPaint和WM_ERASEBKGND消息也有关系。当窗口的Update Region被标志为需要擦除背

景时,BeginPaint会发送WM_ERASEBKGND消息来重画背景,同时在其返回信息里有一个标志表明

窗口背景是否被重画过。当我们用InvalidateRect和InvalidateRgn来把指定区域加到Update

Region中时,可以设置该区域是否需要被擦除背景,这样下一个BeginPaint就知道是否需要发送

WM_ERASEBKGND消息了。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值