关于WINDOWS SDK WM_PAINT的一些想法

来源:互联网 发布:收到短信源端口 编辑:程序博客网 时间:2024/06/06 00:46

      看了很多关于WM_PAINT的BLOG ,发现网上一些误区,我翻看了WINDOWS程序设计参考一些意见,现总结如下(仅供参考):

     1。Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」。如果在窗口消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。即只为每个窗口保存1个无效区域,换句话说,WIN_PAINT处理的时候只处理1个无效区域(只有一个WIN_PAINT消息)。

     2。在处理WM_PAINT消息处理期间,窗口消息处理程序在呼叫了BeginPaint之后,整个显示区域即变为有效。程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除。BEGINPAINT处理显示区域从无效到有效,而不是ENDPAINT。一旦调用BEGINPAINT,VALIDATERECT之后,任何WM_PAINT消息就不存在。

    3。当操作系统标记窗口上某个区域为无效区域时,操作系统将向窗口过程发送WM_PAINT消息,要求更新该区域,以使其有效。也就是说,如果有无效区域,一定是由WM_PAINT消息来完成处理。当然如果不让它发出消息也是可以的。

 4。有些时候移动和更新并不造成窗口重绘,当窗口被移动(不考虑被遮盖)以及鼠标划过时候。

 5。只有当程序空闲时,操作系统才会去检查程序窗口是否存在无效区域(WM_PAINT的优先级是最低的。这也就是为什么系统很忙时窗口往往会出现刷新不了、产生拖拽痕迹等现象的原因)。

 我从WINDOWS 程序设计&网上查到一些说的很有道理的话整合在一起,希望对大家有帮助,如果有什么错误请指教,:)