窗口绘制的知识汇总

来源:互联网 发布:java快速开发平台 开源 编辑:程序博客网 时间:2024/06/04 22:16

今天周末,有幸看了一会儿Windows相关书.针对我这种不善于总结的人来说,督促自己写写笔记是一个不错的选择.能将自己当时的思绪和想法记录下来.言归正传,

开始我正式的总结

  话说回来哈,窗口绘制来说无非主要针对WM_PAINT消息来展开的。因为基本都是向当前应用程序通知描绘新的数据内容或者擦除无效内容。基本是如下情况会触发

  1. WM_PAINT消息

      1.应用程序同时打开2个窗口(A,B)以上,移动一个窗口A内容遮挡了B窗口部分内容.当B窗口被遮挡部分再度不被遮挡时,Windows系统会对B窗口消息队列里面放入WM_PAINT消息,目的是重新描绘被遮挡部分

     2.用户改变目前窗口大小的时候(窗口可以改变大小需要窗口类定义中加入CS_HREDRAW | CS_VREDRAW 类风格)

         ---Windows系统添加WM_SIZE和WM_PAINT消息,其中WM_SIZE修改大小,后者是针对大小调整内容

     3.程序中用户主动使用了ScrollWindow或者ScrollDC函数滚动客户区一部分

     4.程序中使用InvalidateRect或者InvalidateRgn函数显示的产生WM_PAINT消息

     5. 在某些情况下,客户区的一部分被临时覆盖,Windows试图临时保存一个显示区域,为了以后能恢复他,但这并不是每次都能成功。下面这些情况下Window可能发送WM_PAINT消息,并非一定发送哦~~~

       5.1 Winodws擦除覆盖了部分窗口的对话框或者消息框

      5.2.菜单下拉出来,然后释放

      5.3 显示工具提示

 2.有效矩形或者无效矩形获取方法

       不仅仅是在WM_PAINT消息中能获取无效矩形,其实可以在程序任何角落通过GetUpdateRect函数获取

       同时也可以通过ValidateRect函数使客户区内的任何矩形区域变为有效,但是如果这个函数执行后则当前队列中的WM_PAINT中含有该区域的部分将去除该区域。最坏情况是

      这条调用将整个无效区域变成有效区域,则当前队列中的所有WM_PAINT将被删除


3.设备描述表

      设备描述表定义 

           要在窗口的客户区绘图,可以使用Windows的图形设备接口(GDI)函数,设备描述表是什么呢?,实际上是GDI内部保存的数据结构,它与特定的显示设备(显示器/打印机)相关

       使用中注意点:

            1.程序中必须在单个消息期间获取和释放句柄

            2.设备描述表中默认的背景色与窗口类中定义的画刷不是一个,不要认为窗口类的画刷颜色会影响设备描述表中默认的背景色.设备描述表中的默认背景设为白色背景,

           在向显示器显示文本的时候Winodws使用这个背景色来填充字符周围的矩形空间(其实就是包含字符大小矩形),窗口类的背景色是一个刷子,它是一种纯色或者非纯色组成的刷子,Windows用它来擦除客户区,大多数程序使用White_Brush,以便默认的设备描述表的默认文本背景色与Windows用以擦除客户区的背景刷子颜色相同。

      获取设备描述表的方法

         1.BeginPaint中的PAINTSTRUCT结构中获取

         2.GetDC 通过传入窗口句柄,获取对应窗口的客户区DC

         3.GetWindowDC 通过传入窗口句柄,获取对应窗口的DC

        这里面最大的区别在于BeginPaint获取的DC指定绘图区域只是PAINTSTRUCT限定的无效区域内,GetDC只是客户区也就是说不包括菜单栏,状态栏部分

        GetWindowDC部分就是包括了状态栏,菜单栏部分的矩形区域。