原本一直使用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,虽然不是因为这个问题。