标签:
什么时候会触发WM_PAINT消息消息呢?
以下内容来自大名鼎鼎的《Windows程序设计(第五版)》
大多数Windows程序在WinMain中进入消息循环之前的初始化期间都要呼叫函数UpdateWindow。Windows利用这个机会给窗口消息处理程序发送第一个WM_PAINT消息。这个消息通知窗口消息处理程序:必须绘制显示区域。此后,窗口消息处理程序应在任何时刻都准备好处理其它WM_PAINT消息,必要的话,甚至重新绘制窗口的整个显示区域。在发生下面几种事件之一时,窗口消息处理程序会接收到一个WM_PAINT消息:
在某些情况下,显示区域的一部分被临时覆盖,Windows试图保存一个显示区域,并在以后恢复它,但这不一定能成功。在以下情况下,Windows可能发送WM_PAINT消息:
在某些情况下,Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是:
但实际上,在win7下编写的程序,有可能遇到下面的情况:
当把程序窗口最大化时,触发WM_PAINT消息;当移动窗口时,有时会触发WM_PAINT消息,有时不会触发;而当其他窗口遮挡程序的窗口时,一定不会发出WM_PAINT消息,这又是为什么呢?
其实这跟你的windows7的设置有关,在“控制面板”的“性能信息和工具”一栏中,选择“调整视觉效果”,将“启用桌面组合”去掉,就可以了。
当触发WM_PAINT消息时,就会准备处理整个区域。可实际上,系统只是重绘无效区。比如,当你把窗口A从窗口B上移开时,不是整个重绘窗口B,而是,B的其他部分不动,只是重绘漏出来的部分。要是你想整个重绘,需要使用InvalidateRect (hwnd, NULL, TRUE)指明无效区是整个客户区。
那么WM_PAINT消息该如何使用呢?
windows绘图,是通过GDI(图形设备接口)完成。简单的说,GDI是由:DC(设备描述表),GDI函数,GDI基本图形和一些其他的东西组成的。要想使用GDI绘图,必须拿到DC。因为DC与特定的显示(打印设备相关)。只有拿到了DC,才能正确的输出图形。举一个简单的例子,光栅设备(简单的说,就是显示的时候以像素为单位的)和矢量设备(显示的时候,告诉他起点和终点,它会给你自动连线的)的成像原理不同,所以只有知道了他们的成像原理(DC里面有),才能画图。
那么怎么拿到DC呢,方法很多,但是在WM_PAINT消息下,只能使用BeginPaint获取hdc,用完之后使用EndPaint释放它。在二者之间写GDI函数。即使你在WM_PAINT消息下什么都不做,也得写上这两句。原因是因为WM_PAINT会导致无效区域的背景被擦除。
http://blog.csdn.net/thefutureisour/article/details/7533497
WM_PAINT消息详解,使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息(WIN7里有变化,“调整视觉效果”,将“启用桌面组合”去掉)
标签:
原文地址:http://www.cnblogs.com/findumars/p/5183559.html