MFC——OnPaint无限循环导致CPU占用高

本文探讨了从MFC的GDI转向GDI+后遇到的CPU占用率异常升高的问题。通过分析OnPaint函数及其内部CPaintDC的使用方式,指出了BeginPaint和EndPaint函数对于避免WM_PAINT消息死循环的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原本一直使用mfc对应的Gdi方法绘图,所以没出现这个问题。当我开始使用Gdi+之后,发现打开程序后风扇声音变得很大,看了一下发现CPU占用非常高,经过检查发现是OnPaint函数的问题。

在使用CDC重绘的时候,都会有CPaintDC dc(this)代码,这行代码构造函数会自动调用BeginPaint函数,析构函数自动调用EndPaint函数。

BeginPaint函数的作用就是将窗口需要重绘的区域设置为空(也就是Update Region置空)。

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

而当你响应这个消息的时候又不调用BeginPaint来清空,窗口的Update Region就一直是非空的,系统就会一直发送WM_PAINT消息。这样就形成了一个处理WM_PAINT消息的死循环。因此其他消息也就被阻塞了。

所以OnPaint中代码有三种情况:

void CNotchEntity::OnPaint()
{
    // 1.创建CPaintDC处理WM_PAINT消息
    // CPaintDC dc(this);
    // 2.使用父类的OnPaint
    CWnd::OnPaint();
    // 3.显示使用BeginPaint和EndPaint,不推荐
}

如果不使用CPaintDC的情况下,通常在函数末尾调用父类的OnPaint就可以解决这个问题,QT中也类似需要调用父类PaintEvent,虽然不是因为这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值