自定义控件响应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消息了。