




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章图像编程与文字处理 精雕细琢 美化应用程序 教学内容 6 1图形设备接口 6 2常用绘图函数 6 3绘图工具 6 4字体与文字处理 6 5位图 6 6综合实例 建立宾馆管理系统的启动界面 6 7小结思考与练习 6 1图形设备接口 6 1 1设备环境类在Windows程序中 应用程序的输出并不直接面向物理的设备 如显示屏或打印机 而是针对一个称之为设备环境 DeviceContext 的逻辑设备进行操作 设备环境与实际设备之间的信息传送由Windows直接管理 在MFC应用程序中 所有的绘制调用均通过相应的设备环境对象实现 设备环境对象封装了相应的WindowsAPI功能 由一个32位的HDC类型句柄标识 在MFC类库中 用CDC类封装设备文本对象 6 1图形设备接口 6 1 1设备环境类1 设备环境类 CDC CDC类直接继承自CObject类 它是设备上下文对象的基类 CDC基类定义了设备描述表对象 并且提供在显示器 打印机或Windows用户区上绘图的方法 它封装了使用设备环境的GDI函数 所有的绘图操作都是直接或间接运用了CDC的成员函数 这些函数有的进行设备描述表操作 有的是用来画图的 还有的函数是用来获取或设置绘图属性 为映像和视图服务的 2 派生类CPaintDCCPaintDC是从CDC派生出来的设备描述表类 它常常在窗口的OnPaint函数中使用 查看MFC的源代码 Studio VC98 MFC SRC viewcore cpp 中的OnPaint函数的实现可以知道 OnPaint函数首先构造一个CPaintDC对象 再调用OnPrepareDC 函数将其准备好 最后以这个准备好的CPaintDC对象指针为参数 来调用OnDraw函数进行各种图形处理 6 1图形设备接口 6 1 1设备环境类3 派生类CClientDC 管理客户区 CClientDC类只能在客户区绘图 所谓客户区是指窗口区域中去掉边框 标题栏 菜单栏 工具栏 状态栏等以外的部分 它是用户可以操作的区域 例如打开Word文档将是将某个 doc文件显示在其客户区域中 在使用CClientDC进行绘图时 一般要调用GetClientRect函数来获取客户区域的大小 4 派生类CWindowDC 管理框架窗口 CWindowDC类直接从CDC派生 它使调用和释放整个窗口 包括客户区和非客户区 的设备环境过程自动化 CWindowDC对象在构造时调用WindowsAPI函数GetWindowDC 在析构时调用相应的API函数ReleaseDC 这意味着CWindowtDC对象可访问CWnd所指向的整个屏幕区域 6 1图形设备接口 6 1 2使用GDI对象在选择GDI对象进行绘图时 往往遵循着下列的步骤 1 在堆栈中定义一个GDI对象 如CPen CBrush对象 然后用相应的函数 如CreatePen CreateSolidBrush 创建此GDI对象 2 将构造的GDI对象选入当前设备环境中 但不要忘记将原来的GDI对象保存起来 3 绘图结束后 恢复当前设备环境中原来的GDI对象 4 由于GDI对象是在堆栈中创建中 当程序结束后 框架会自动删除程序创建的GDI对象 6 1图形设备接口 6 1 3坐标映射Windows的GDI graphicsdeviceinterface 支持两种坐标系 即逻辑坐标系和物理坐标系 分别连接应用程序和图形物理设备 物理坐标是指物理设备的坐标系 它的单位是真正的长度单位 有英寸 in 和毫米 mm 两种 它的原点在屏幕的左上角 X轴向右递增 Y轴向下递增 逻辑坐标指的是在窗口下的坐标 逻辑坐标的单位是逻辑像素 在Windows系统中 总共有三种物理坐标 又叫设备坐标 分别是屏幕坐标 用户区坐标 全窗口坐标 1 客户区坐标系统 客户区坐标系统是最常见的坐标系统 以窗口客户区左上角为原点 0 0 主要用于窗口客户区绘图输出以及处理窗口的一些消息 鼠标消息WM LBUTTONDOWN WM MOUSEMOVE传给框架的消息参数以及CDC一些用于绘图的成员都是使用客户区坐标 2 屏幕坐标系统 屏幕坐标系统是另一类常用的坐标系统 以屏幕左上角为原点 0 0 一些与窗口客户区不相关的函数均以屏幕坐标为单位 例如设置和取得光标位置的函数SetCursorPos 和GetCursorPos 由于光标可以在任何一个窗口之间移动 它不属于任何一个单一的窗口 因此使用屏幕坐标 弹出式菜单使用的也是屏幕坐标 另外 CreateWindow 和MoveWindow 等函数用于设置窗口相对于屏幕的位置 使用的也是屏幕坐标系统 3 窗口坐标系统 窗口坐标系统以窗口左上角为坐标原点 它包含了窗口控制菜单 标题栏等内容 一般情况下很少在窗口标题栏上绘图 因此这种坐标系统很少使用 6 1图形设备接口 6 1 4与绘图有关的类和结构在图形绘制操作中 常常需要使用MFC中的CPoint CSize和CRect等简单数据类由于CPoint 点 CSize 大小 和CRect 矩形 是对Windows的POINT SIZE和RECT结构的封装 因此它们可以直接使用各自结构的数据成员 如下所示 typedefstructtagPOINT LONGx 点的x坐标LONGy 点的y坐标 POINT typedefstructtagSIZE LONGcx 矩形的长度LONGcy 矩形的宽度 SIZE typedefstructtagRECT LONGleft 矩形左上角点的x坐标LONGtop 矩形左上角点的y坐标LONGright 矩形右下角点的x坐标LONGbottom 矩形右下角点的y坐标 RECT 6 2常用绘图函数 6 2 1画点与画线1 画点画点是最基本的绘图操作之一 它是通过调用CDC SetPixel或CDC SetPixelV函数来实现的 这两个函数都是用来在指定的坐标上设置指定的颜色 只不过SetPixelV函数不需要返回实际像素点的RGB值 正是因为这一点 函数SetPixelV要比SetPixel快得多 COLORREFSetPixel intx inty COLORREFcrColor COLORREFSetPixel POINTpoint COLORREFcrColor BOOLSetPixelV intx inty COLORREFcrColor BOOLSetPixelV POINTpoint COLORREFcrColor 其中参数point指定所绘制的点 crColor指定画点所用的颜色 倘若要在屏幕的 100 100 处画一个红色点 则代码为 pDC SetPixel CPoint 100 100 RGB 255 0 0 实际显示像素的颜色未必等同于crColor所指定的颜色值 因为有时受设备限制 不能显示crColor所指定的颜色值 而只能取其近似值 与上述函数相对应的GetPixel函数是用来获取指定点的颜色 COLORREFGetPixel intx inty const COLORREFGetPixel POINTpoint const 6 2常用绘图函数 6 2 1画点与画线2 画线画线也是特别常用的绘图操作之一 CDC的LineTo和MoveTo函数就是用来实现画线功能的两个函数 通过这两个函数的配合使用 可完成任何直线和折线的绘制操作 CDC MoveTo用来移动当前点到指定点 返回当前点的坐标 它有两种调用形式 其函数原型如下 CPointMoveTo intx inty CPointMoveTo POINTpoint 参数x为新位置的x坐标 y为新位置的y坐标 point为新位置的坐标 CDC LineTo函数用来绘制一条从当前点到指定点的直线 返回是否绘制成功的标志 其原型如下 BOOLLineTo intx inty BOOLLineTo POINTpoint 参数x为指定点的x坐标 y为指定点的y坐标 point为指定点的坐标 6 2常用绘图函数 6 2 1画点与画线3 折线除了LineTo函数可用来画线之外 CDC中还提供了一系列用于画各种折线的函数 它们主要是Polyline PolyPolyline和PolylineTo 这三个函数中 Polyline和PolyPolyline既不使用当前位置 也不更新当前位置 而PolylineTo总是把当前位置作为起始点 并且在折线画完之后 还把折线终点所在位置设为新的当前位置 这几个函数的原型如下 BOOLPolyline LPPOINTlpPoints intnCount BOOLPolylineTo constPOINT lpPoints intnCount 这两个函数用来画一系列连续的折线 参数lpPoints是POINT或CPoint的顶点数组 nCount表示数组中顶点的个数 它至少为2 BOOLPolyPolyline constPOINT lpPoints constDWORD lpPolyPoints intnCount 此函数可用来绘制多条折线 其中lpPoints同前定义 lpPolyPoints表示各条折线所需的顶点数 nCount表示折线的数目 6 2常用绘图函数 6 2 2矩形和圆角矩形CDC提供的Rectangle和RoundRect函数分别用于矩形和圆角矩形的绘制 它们的原型如下 BOOLRectangle intx1 inty1 intx2 inty2 BOOLRectangle LPCRECTlpRect BOOLRoundRect intx1 inty1 intx2 inty2 intx3 inty3 BOOLRoundRect LPCRECTlpRect POINTpoint 参数lpRect的成员left top right bottom分别表示x1 y1 x2 y2 point的成员x y分别表示x3 y3 而x1 y1表示矩形的左上角坐标 x2 y2表示矩形的右上角坐标 x3 y3表示绘制圆角的椭圆大小 6 2常用绘图函数 6 2 3圆弧和椭圆通过调用CDC的Arc函数可以画一条椭圆弧线或者整个椭圆 这个椭圆的大小是由其外接矩形 本身并不可见 所决定的 Arc函数的原型如下 BOOLArc intx1 inty1 intx2 inty2 intx3 inty3 intx4 inty4 BOOLArc LPCRECTlpRect POINTptStart POINTptEnd 使用CDC的成员函数Ellipse 可以使用当前笔绘制一个用当前画刷填充的椭圆或圆 其函数原型如下 BOOLEllipse intx1 inty1 intx2 inty2 BOOLEllipse LPCRECTlpRect 6 3绘图工具 6 2 1画笔画笔是最简单的一种绘图工具 同时也是最重要的一种绘图对象 在现实世界中 可以用不同的笔产生不同的线 这正如绘图用的彩笔 不同颜色笔产生不同颜色的线 Windows也是利用这种面向对象的描述事物的方法 把笔作为一个对象 和现实世界一样 不同的笔产生不同的线 一个画笔通常具有宽度 风格和颜色三种属性 画笔的宽度用来确定所画的线条宽度 它是用设备单位表示的 默认的画笔宽度是一个像素单位 画笔的颜色确定了所画的线条颜色 画笔的风格确定了所绘图形的线型 它通常有实线 虚线 点线 点划线 双点划线 不可见线和内框线等七种风格 6 3绘图工具 6 2 1画笔1 画笔的创建创建一个修饰画笔 可以使用CPen类的CreatePen函数 其原型如下 BOOLCreatePen intnPenStyle intnWidth COLORREFcrColor 参数nPenStyle nWidth crColor分别用来指定画笔的风格 宽度和颜色 此外 还有一个CreatePenIndirect函数也是用来创建画笔对象 它的作用与CreatePen函数是完全一样的 只是画笔的三个属性不是直接出现在函数参数中 而是通过一个LOGPEN结构间接地给出 BOOLCreatePenIndirect LPLOGPENlpLogPen 此函数用由LOGPEN结构指针指定的相关参数创建画笔 LOGPEN结构如下 typedefstructtagLOGPEN UINTlopnStyle 画笔风格 同上POINTlopnWidth POINT结构的y不起作用 而用x表示画笔宽度COLORREFlopnColor 画笔颜色 LOGPEN 6 3绘图工具 6 2 1画笔2 使用画笔在VC NET 通常按照如下步骤来使用画笔 1 声明CPen对象 2 初始化画笔 通过调用CreatePen成员函数可以初始化笔 3 将新建的画笔对象选进设备场景中 同时保存原画笔对象的指针 pOldPen pDC SelectObject 4 调用绘图函数生成图形 5 选择设备场景的原有笔对象 3 画笔工具的操作示例 6 3绘图工具 6 2 2画刷1 画刷的属性画刷的属性通常包括填充色 填充图案和填充样式三种 画刷的填充色和画笔颜色一样 都是使用COLORREF颜色类型 画刷的填充图案通常是用户定义的8 8位图 而填充样式往往是CDC内部定义的一些特性 它们都是以HS 为前缀的标识 2 画刷的创建CBrush类根据画刷属性提供了相应的创建函数 例如创建填充色画刷和填充样式画刷的函数为CreateSolidBrush和CreateHatchBrush 它们的原型如下 BOOLCreateSolidBrush COLORREFcrColor 创建填充色画刷BOOLCreateHatchBrush intnIndex COLORREFcrColor 创建填充样式画刷其中 nIndex用来指定画刷的内部填充样式 而crColor表示画刷的填充色 与画笔相类似 也有一个LOGBRUSH逻辑结构用于画刷属性的定义 并通过CBrush的成员函数CreateBrushIndirect来创建 其原型如下 BOOLCreateBrushIndirect constLOGBRUSH lpLogBrush 6 3绘图工具 6 2 2画刷3 画刷的使用在VC NET 通常按照如下步骤来使用画刷 1 生成CBrush的实例 刷子以多种样式和颜色出现在CBrush CBrush CBrush CBrush COLORREFcrColor CBrush intnIndex COLORREFcrColor 上述函数的参数crColor指定刷子颜色 nIndex参数指定刷子图案 其值如表8 7所示 2 调用相应的成员函数初始化刷子 3 将所创建的画刷选入设备环境 同时保存原画刷对象的指针 4 调用绘图函数生成图形 5 恢复原先设备环境中的画刷 6 3绘图工具 6 2 2画刷3 画刷的使用 6 3绘图工具 6 2 3绘图示例EX06B 6 4字体与文字处理 6 4 1字体的属性字体的属性有很多 但其主要属性有字样 风格和尺寸三个 字样是字符书写和显示时表现出的特定模式 例如 对于汉字 通常有宋体 楷体 仿宋 黑体 隶书以及幼圆等多种字样 字体风格主要表现为字体的粗细和是否倾斜等特点 字体尺寸是用来指定字符所占区域的大小 通常用字符高度来描述 字体尺寸可以取毫米或英寸作为单位 但为了直观起见 也常常采用一种称为 点 的单位 一点约折合为1 72英寸 对于汉字 还常用 号 数来表示字体尺寸 初号字最大 以下依次为小初 一号 小一 二号 小二 如此类推 字号越大 字体尺寸越小 6 4字体与文字处理 6 4 2字体的创建在VC NET中 创建字体需要调用CFont类的成员函数CreateFont Indirect 或CreatePointFont Indirect 来初始化 创建字体函数CFont类的字体创建成员函数的原型为 BOOLCreateFont intnHeight intnWidth intnEscapement intnOrientation intnWeight BYTEbItalic BYTEbUnderline BYTEcStrikeOut BYTEnCharSet BYTEnOutPrecision BYTEnClipPrecision BYTEnQuality BYTEnPitchAndFamily LPCTSTRlpszFaceName BOOLCreateFontIndirect constLOGFONT lpLogFont BOOLCreatePointFont intnPointSize LPCTSTRlpszFaceName CDC pDC NULL BOOLCreatePointFontIndirect constLOGFONT lpLogFont CDC pDC NULL 其中CreatePointFont提供了创建字体的一种简单方法 nPointSize为字体的大小 以0 1点 像素 墨点 磅数 为单位lpszFaceName为字体名称字符串的指针若pDC非空 则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位 6 4字体与文字处理 6 4 3文本输出函数文本的最终输出不仅依赖于文本的字体 而且还跟文本的颜色 对齐方式等有很大关系 CDC类提供了四个输出文本的成员函数 TextOut ExtTextOut DrawText和TabbedTextOut virtualBOOLTextOut intx inty LPCTSTRlpszString intnCount BOOLTextOut intx inty constCString 6 4字体与文字处理 6 4 4文本属性控制1 设置文本的背景色缺省时 在绘制图形或者输出文本时 背景颜色是白色 可以使用CDC的成员函数SetBkColor函数来设置新的背景颜色 函数原型为 virtualCOLORREFSetBkColor COLORREFcrcolor 2 控制文本的背景色背景模式可用函数SetBkMode来设置 它设置当前的背景模式并返回原来的背景模式 该函数的原型为 intSetBkMode intnBkMode 参数nkbmode指定背景模式 其值可以是OPAQUE或者TRANSPARENT 如果值为OPAQUE 则显示时背景都改变为当前背景颜色 如果值为TRANSPARENT 则不改变背景颜色 此时 任何SetBkColor函数调用都无效 缺省的背景模式为OPAQUE 3 设置文本的排列方式在文本显示时遇到的另一个问题是文本的排列方式 它控制文本和给定点的相对位置 在一个图形中加字符说明时 常常知道一个字符串的某一个边界 如左边界不应超过某个位置 或右边界不应超过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国家事业单位招聘2025海洋出版社有限公司招聘应届毕业生岗位笔试历年参考题库附带答案详解
- 国家事业单位招聘2025中国地质科学院岩溶地质研究所招聘拟聘用人员笔试历年参考题库附带答案详解
- 四川省2025年四川省减灾中心招聘编外工作人员(第二批)笔试历年参考题库附带答案详解
- 商品混凝土员工安全培训课件
- 北京市2025北京市金融发展促进中心招聘2人笔试历年参考题库附带答案详解
- 2025青海西矿稀贵金属有限公司招聘38人笔试参考题库附带答案详解
- 2025湖南高速工程咨询有限公司招聘专业技术人员22人笔试参考题库附带答案详解
- 2025浙江杭州市建德市林业总场下属林场招聘10人笔试参考题库附带答案详解
- 2025河南洛阳市新安县龙潭大峡谷荆紫仙山景区招聘23人笔试参考题库附带答案详解
- 2025广东省广晟控股集团校园招聘2025人笔试参考题库附带答案详解
- DBJT15-147-2018 建筑智能工程施工、检测与验收规范
- 华为鸿蒙课件
- 全站仪使用课件
- 中国心房颤动管理指南(2025)解读
- 2025年成人高考专升本民法真题及答案
- 2024年云南省公务员考试行测真题参考答案详解
- 初中普法主题教育
- 多发骨折病人疑难病例讨论
- 草果种植技术课件大全
- 2025年水利A证考试题及答案
- 新疆就业政策课件
评论
0/150
提交评论