window绘图机制预览.ppt

  1. 1、本文档共60页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows绘图机制 概述 图形设备接口GDI 理解设备描述表 理解WIN_PAINT消息 有关绘图GDI的API函数使用 句柄 在Windows编程中,会经常提到句柄这个名词。要理解句柄,应注意以下几点: 句柄是一个4字节的整数,Windows利用它标志应用程序创建和使用的资源,包括应用程序实例、窗口、菜单、控件、内存、外设、文件以及与图形相关的画笔、刷子等。 句柄是Windows内部表资源数据存储的内存索引值,Windows利用它可访问表中的信息。通常,在程序中,要访问某个资源时,需要提供该资源的句柄,因此句柄可理解为是内存的索引值。 Windows平台下,不仅可以运行多个程序,还可以对同一个程序多次加载。每加载一次,Windows会创建一个运行的备份,即实例。同时系统为每个实例分配一个唯一的句柄,该句柄称为实例句柄。常用句柄类型及其说明如下表所示。 常用句柄类型及其说明 图形设备接口GDI 设备描述表 设备描述表(Device Context,简称为DC),是GDI内部保存的数据结构。设备描述表与特定的显示设备(如显示器、打印机等)相关。对于显示器,设备描述表总是与显示器上特定的窗口相关。设备描述表中保存了显示图形所需使用的各种参数值,例如,显示的颜色、显示的坐标、显示的方式和背景的颜色等。Windows-GDI函数实际上是在设备描述表里显示正文及绘图的。 当程序显示文字或绘图时,首先必须获得一个设备描述表句柄,完成输出文字或绘图之后,还必须及时释放该句柄,否则会大大减少Windows的存储单元。释放之后的句柄就不会再有效了。一般说来,在处理某条消息时,获取和释放设备描述表句柄必须成对出现,而且不同设备描述表的获取与释放的方法也不同。而这只是所使用的函数不同而已。 DC设备 这个“万能驱动”就是Windows给我们提供的一个DC。由DC去和设备驱动程序打交道,完成图形的绘制。至于图形的效果,就要由所使用的图形设备来决定了。其实,DC也是一种资源,它也不是什么“万能驱动”,但是无论是显示,还是打印,我们都可以获取HC的句柄,然后在DC上操作,由DC映射到这些物理设备上就行了。 设备描述表 在Windows系统中,设备描述表大致可分为四种类型,分别与视频显示器、打印机、内存和信息设备相关联。获取和释放设备描述表的函数也相应地分为四类。 获取设备描述表句柄 当应用程序需要绘图的时候,必须先获得设备描述表句柄。在获得了该句柄以后,Windows会以默认的属性值填充内部的属性表结构。随后,应用程序需要调用相应的GDI函数,以指定的属性值代替需要改变的默认值。当绘图完毕后,应用程序必须释放设备描述表句柄。 通常,应用程序使用两种方法来获取设备描述表句柄。 ?在处理WM_PAINT消息时 (特别注意:设备描述表句柄的取得和释放必须成对使用,否则会引起严重问题) ? 1. 使用BeginPaint()和EndPaint()调用: ??? hdc = BeginPaint(hwnd, ps); ??? …… ??? ……??????? ??? EndPaint(hwnd, ps); 获取设备描述表句柄 变量ps是型态为PAINTSTRUCT的结构(见MSDN),该结构的hdc字段是BeginPaint传回的设备内容句柄。 ?PAINTSTRUCT结构又包含一个名为rcPaint的RECT(矩形)结构,rcPaint定义一个包围窗口显示区域无效范围的矩形。使用从BeginPaint获得的设备描述表句柄,只能在这个区域内绘图。BeginPaint调用使该区域有效。 注意:若要响应WM_PAINT消息,则无论如何都要使BeginPaint和EndPaint被执行,否则程序会出问题(CPU占用近100%)。因为,如果不调用BeginPaint函数,WM_PAINT消息不会从消息队列中移出。 需要注意的是: 如果窗口函数不处理WM_PAINT消息,则将WM_PAINT消息传递给Windows的默认窗口函数(DefWindowProc)处理。DefWindowProc函数中处理WM_PAINT消息的代码如下: WM_PAINT消息处理 case WM_PAINT: hdc = BeginPaint( hwnd, ps ); // 其他GDI操作 EndPaint( hwnd, ps ); return 0; 这段代码并不进行任何绘图操作,只是简单地将ps指定的无效矩形区域变为有效。 请注意,如果应用程序用如下方法处理WM_PAINT消息,那么用户也许将不得不强行中断程序。 case WM_PAINT: return 0; 如果当前窗口用户区的某一部分变为无效,则Windows会将一个WM_PAINT消息放到消息队列中。如果不调用BeginP

文档评论(0)

w3388825 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档