- 1、本文档共50页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第06章 输 出0
第6章 输 出 在多任务环境下,屏幕,打印机等硬件设备都是许多应用程序共享的,因此,任何一个应用程序都不能任意地进行输出操作,所有的输出,如屏幕、打印机、绘图机等,都必须通过GDI(图形设备接口 Graphics Device Interface)函数来完成输出。 本章表面上是讨论的字符串输出,实际上是讨论与设备无关的程序设计基础。本章例举了三个例程来说明应用程序的输出。 6.1 客户区的绘制和更新 Windows应用程序能在窗口的客户区显示文字和图形,但是不能确保客户区内显示的内容会一直保留下去。 必要时,Windows操作系统会发出通知(消息),要求应用程序更新客户区的失效的内容。 使得窗口的无效区域得以重新绘制并显示出 Windows是通过发送WM_PAINT消息給窗口函数,窗口函数接到WM_PAINT消息后,重新绘制窗口内容。 6.1.1 WM_PAINT消息 WM_PAINT消息和客户区的重画或绘制密切相关 窗口函数一定会接收到一个WM_PAINT消息的情况: 在用户移动窗口或显示窗口,窗口中先前被隐藏的区域重新变成可见时 用户改变窗口大小(窗口类具有CS_HREDRAW和CS_VREDRAW风格) 程序使用了ScrollWindow或ScrollDC函数滚动客户区的一部分 程序代码中使用了InValidateRect或InvalidataRgn函数刻意产生WM_PAINT消息。 可能会收到WM_PAINT消息的情况 菜单下拉出来,然后又关闭(释放) 显示工具栏提示 6.1.1 WM_PAINT消息 应用程序应该保留绘制客户区需要的所有信息 应程序中需要将内容输出到客户区的相关语句,都得放在WN_PAINT的消息响应里。 否则将会出现显示不正确 参考例子:rec.c和snd.c 当接到Windows系统发送WM_PAINT消息时,应用程序就得应该对显示区(工作区)的内容进行重新绘制。 如果程序有必要在其它时间需要更新客户区内容,则可强制Windows系统产生一个WM_PAINT消息给自己的程序。 6.1.1 有效矩形和无效矩形 无效矩形 当窗口的客户区发生变化时(程序会收到WM_PAINT消息),需要重画的矩形区域 显示窗口中的无效区最多只有一个无效区域。 有效区域=客户区—无效区 有效区与无效区的生成 人为指定无效区——发送WM_PAINT消息 InvalidateRect()函数 InvalidateRgn()函数 客户区内任意矩形区变为有效 ValidateRect()函数 BeginPaint()函数 有时必须要使客户区内任意矩形区变为有效,否则Windows会永不停止的发送WM_PAINT消息 6.1.1 有效矩形和无效矩形 无效矩形的坐标的获得 接收WM_PAINT消息时,窗口函数可获得 任何时候,GetUpdateRect()函数 6.2 GDI简介 要在客户区显示字符串或绘制图形,就得使用图形界面接口(GDI)函数 TextOut( hDC, x, y, psText, iLength); 功能:向窗口的客户区写入字符串 参数: psText:要写的字符串指针 iLength:字符串中字符的个数(长度) x, y:字符串在客户区的开始坐标(地址) hDC:设备描述符代号(句柄) 6.2.1 设备描述表 1、什么是设备描述表(device context,简称DC) 记录了设备输出时的一种结构(表) 这个结构记录了设备输出时,所需求的详细数据信息。 例如,输出时文字的颜色、线条的宽度、画图的坐标、……以及输出时调用的驱动程序等 这个数据结构称为设备描述表,简称DC。 6.2.1 设备描述表 2、 hdc 是指向DC的代号(句柄、指针) 每个输出用的GDI函数其第1个参数就是hdc,hdc 是指向DC的指针,GDI函数通过设备进行输出就变成通过DC进行输出。 3、当程序需要绘图时,必须先取得设备描述表代号hDC。 HDC hDC=GetDC(hWnd); 4、注意事项: 当程序在客户区绘图完毕后,必须释放设备描述表DC,DC被程序释放后就不再有效 ReleaseDC(hWnd, hDC); 程序必须在同一个消息处理的分支(case)中取得和释放代号 6.2.1 设备描述表 5、例如“用Rectangle()画一个红色矩形” Rectangle(hDC, 10, 20, 200, 300); 所步骤为: step0:声明(定义)变量 HDC hDC; HBRUSH hRedBrush, hOldBrush; step1:获取某设备描述符的代号存入hDC里 hDC=GetDC(hWnd); step2:建立一个红色的画笔,将代号存入hRedBrush hRedBrush
文档评论(0)