ImageVerifierCode 换一换
格式:DOCX , 页数:52 ,大小:239.43KB ,
资源ID:1784364      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-1784364.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC++60入门第五章图形和文本输出.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

VC++60入门第五章图形和文本输出.docx

1、VC+60入门第五章 图形和文本输出第5章 图形和文本输出精讲Windows使用图形设备接口(GDI)进行图形输出和文本输出,MFC封装了GDI对象,提供了CGdiObject类和CDC类支持图形输出和文本输出,本章你将学习使用CGdiObject类和CDC类在视图中输出各种图形和文本的方法和技巧。5.1图形设备接口和CDC5.1.1图形设备接口(GDI)Windows操作系统通过图形设备接口,简称GDI (Graphics Device Interface),管理Windows程序的所有图形输出,包括显示在屏幕上的窗口,屏幕保护程序的运行,文档的打印。GDI处理与不同输出设备的连接,从而应用

2、程序开发者不需要去考虑基础硬件设备之间的不同。应用程序可以使用GDI创建3种类型的图形输出:矢量图形、光栅图形和文本。1矢量图形矢量图形输出是指创建线和填充图形,包括点、直线、曲线、多边形、扇形和矩形。2光栅图形光栅图形输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。在屏幕上表现为对若干行和列的像素操作,在打印机上则是若干行和列的点阵输出。光栅图形是直接从内存到显存的拷贝操作,所以速度快,但是对内存要求高。3文本文本输出是GDI的另一项任务。输出文本时文本的输出位置的计算不是以行为单位,而是以逻辑坐标为单位计算。用户可以设置文本的各种效果,如加粗、斜体、设置颜色

3、等。MFC处理图形输出是通过设备上下文CDC类和图形对象CGdiObject类来完成的。5.1.2 绘图工具GDI对象CGdiObjectCGdiObject是MFC提供绘图工具的类,它的派生类包括画笔(CPen)、画刷(CBrush)、字体(CFont)、位图(CBitmap)、调色板(CPalette)、区域(CRgn)等,它们的继承关系如图5-1所示。图5-1 CGdiObject类的构成各个派生类的任务是:1画笔(CPen)封装GDI画笔,用于绘制对象的边框以及直线和曲线。默认画笔用于绘制与一个像素等宽的黑色实线。2画刷(CBrush)封装GDI画刷。画刷是用来填充一个封闭的图形对象(

4、如矩形,圆形)的内部区域。默认的画刷颜色是白色。3字体(CFont)封装GDI字体对象,用户可以建立一种GDI字体,并使用CFont的成员函数来访问它。主要影响文本输出的效果,包括文字的大小、是否加粗、是否斜体、是否加下划线等。4位图(CBitmap)封装GDI位图,提供成员函数装载和位图操作,位图可以用于填充区域。5调色板(CPalette)封装GDI调色板,保存系统可用的色彩信息,是应用程序和彩色输出设备上下文的接口。6区域(CRgn)封装GDI区域。区域是窗口内的一块多边形或椭圆形区域。CRgn用于设备上下文(通常是窗口)内的区域操作。CRgn通常与CDC类中与裁剪(clipping)有

5、关的成员函数配合使用。5.1.3设备描述表(DC)设备上下文(Device Context),简称DC,是由GDI创建用来代表设备连接的数据结构。DC的主要功能有:(1)允许应用程序使用一个输出设备。(2)提供窗口应用程序,设备驱动,和输出设备之间的连接。(3)保存当前信息,例如在一个窗口内绘图使用的颜色,画笔的宽度、画刷的类型等等。(4)保存窗口剪取区域(clipping region),限制程序输出到输出设备中窗口覆盖的区域。5.1.4设备上下文类(CDC)MFC封装了DC,提供CDC类及它的子类访问GDI,如图5-2所示,各类作用介绍如下。CObjectCDCCClientDCCMeta

6、FileDCCPanitDCCWindowDC图5-2 CDC及子类1CDC类封装了所有图形输出函数,包含了一个DC的创建和初始化,及通用GDI对象的操作,包括画简单图形(如线、矩形、椭圆)和复杂的功能(如区域、位图、剪切区域)的操作。CDC类的适应范围最广,不仅能支持窗口,还能支持打印机。2ClientDC类CClientDC又名客户区设备上下文,用于客户区的输出,一般在响应非窗口消息并对客户区绘图时要用到该类,例如在鼠标双击时要输出文本等。3CPaintDCCPaintDC用于响应窗口重绘消息(WM_PAINT)的绘图输出,不仅可对客户区进行操作,还可以对非客户区进行操作。4CWindow

7、DCCWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制,除非要自己绘制窗口的边框和按钮,否则一般不用它。5CMetaFileDCCMetaFileDC专门用于图元文件的绘制。图元文件记录一组GDI操作命令,可以通过这一组GDI命令重建图形输出。使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中。5.1.5 OnDraw函数当用AppWizard创建单文档或多文档应用程序时,视图类包含成员函数OnDraw()函数,CDC指针被传递给OnDraw()函数,下面的程序清单5-1显示了在视图窗口中输出一行文本的一个

8、简单的OnDraw()函数。程序清单5-1:用于输出的OnDraw()函数void CExam5View:OnDraw(CDC* pDC) CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-TextOut(1,1,”hello world!”);当视图窗口或窗口的一部分需要重绘时,系统会发给窗口一个WM_PAINT消息,MFC的窗口框架会将该消息映射到CWnd:OnPaint()函数,OnPaint()函数创建一个DC,并调用视图的OnDraw(

9、) 函数。5.1.6 WM_PAINTWM_PAINT消息是最重要的绘图消息,它要求窗口重新绘制内容。产生WM_PAINT消息的场合通常有:(1)窗口移动后及最大化,最小化后的刷新。(2)被覆盖区域的刷新,如下拉菜单覆盖的区域。(3)无效区域产生后的刷新,如执行滚动条操作,将一区域移动至不可见。有时数据发生变化时,需要人为生成一个绘制消息,重绘窗口,可以调用几个CWnd的函数。表5-1 产生绘制消息的函数函数举例说 明Invalidate(TRUE);此函数声明整个客户区无效CRect Rect(1,1,300,300)InvalidateRect(&Rect, TRUE)此函数声明选定的区域

10、无效,这样可以减少因重绘而产生的屏幕闪烁5.1.7 获取设备上下文(DC)绘图前必须准备好设备上下文(DC),在一个MFC应用程序获得DC的常用方法有两种:一种是接受一个参数为指向CDC对象的指针,另一种是构造CClientDC对象。一些消息处理函数可以通过参数接受指向CDC对象的指针,如OnDraw()函数。程序清单5-2:用于输出一个黑点的OnDraw()函数void CExam5View:OnDraw(CDC* pDC) CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for nativ

11、e data here /在坐标为10,10的位置上画一点,颜色为黑色 pDC-SetPixel(CPoint(10,10),RGB(0,0,0); 也可以使用CClientDC类创建一个局部DC对象,例如,在键盘响应消息处理函数和鼠标响应消息处理函数中要进行文本输出或图形绘制时,通常要创建一个这样的对象,并使用this指针为该对象赋值。程序清单5-3:在鼠标点击画一红点的鼠标左键单击消息处理函数void CExam5View:OnLButtonDown(UNIT nFlags,CPoint point)/ TODO: add draw code for native data hereCCl

12、ientDC dc(this); /this 指针将CExam5View赋值给创建的dc对象 dc.SetPixel(point,RGB(255,0,0);CView: OnLButtonDown( nFlags,point);5.1.8 编程实例【例5-1】编写一个单文档MFC(EXE)程序Exam5_1,在视图类增加成员变量,追踪鼠标左键双击的最新坐标,并输出坐标信息,运行效果如图5-3所示。图5-3 实例Exam5_1运行效果1使用AppWizard创建一个单文档MFC(EXE程序)2为视图类增加成员变量记录坐标并初始化(1)选择WorkSpace的ClassView标签,右键单击CEx

13、am5_1View类。在弹出的快捷菜单中选择Add Member Variable菜单项,增加CPoint类的公有成员变量m_LPoint。 (2)在CExam5_1View类的构造函数CExam5_1View()中,初始化变量m_LPoint为0,0。如程序清单5-4所示。程序清单5-4:CPoint类型对象引用CExam5_1View:CExam5_1View() / TODO: add construction code here m_LPoint.x=0; m_LPoint.y=0;3在OnDraw()函数中添加代码,在第一行输出成员变量的值。如程序清单5-5粗体部分所示。程序清单5-

14、5:在视图中输出整型数据的OnDraw()函数void CExam5_1View:OnDraw(CDC* pDC) CExam5_1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data hereCString str;str.Format(“鼠标左键双击的位置是%d,%d”,m_LPoint.x,m_LPoint.y); pDC-TextOut(0,0,str);4在视图类增加鼠标左键双击的消息映射,修改成员变量,更新视图(1)打开ClassWizard,选择Message Ma

15、p标签,Class Name列表中选择CExam5_1View,Object IDS列表中选择CExam5_1View,Messages列表中选择WM_LBUTTONDBLCLK,单击“Add Function”按钮,添加鼠标左键双击消息映射。(2)单击“Edit Code”按钮,添加处理代码,用当前鼠标位置Point值替换m_LPoint的值,并设置无效区域,刷新视图。程序清单5-6:产生重绘消息的鼠标消息处理函数void CExam5_1View: OnLButtonDblClk(UINT nFlags, CPoint point)/ TODO: Add your message hand

16、ler code here and/or call default m_LPoint=point; Invalidate(TRUE); CView:OnLButtonDblClk(nFlags, point);5编译、链接、执行,可得到如图5-3所示的结果5.2 处理文本在窗口应用程序中经常使用GDI处理文本输出,文本的输出过程包括文本的属性设置、字体设置、文本格式化、调用文本输出函数输出文本等具体的过程,下面将分别讲述。5.2.1设置文本颜色在窗口操作系统中采用32位来表示颜色,MFC和SDK采用COLORREF数据结构表示颜色,COLORREF的结构如图5-4所示,采用8位(值域范围为0-

17、255)分别表示红、蓝、绿三色。定义颜色的最简单的方法是使用RGB()宏,它采用三个参数,用0-255的值来表示红色、蓝色、绿色。同样使用宏GetRValue(),GetGValue(),GetBValue()可以从一个COLORREF类型的变量中分离三元色。.图5-4 颜色的表示常用设备颜色清单/基本三元色COLORREF crRed=RGB(255,0,0);COLORREF crGreen=RGB(0,255,0);COLORREF crBlue=RGB(0,0,255)/ 16-color设备支持颜色const COLORREF g_crBlack = RGB(0,0,0);const

18、 COLORREF g_crYellow = RGB(255,255,0);const COLORREF g_crDkYellow = RGB128,128,0);const COLORREF g_crRed = RGB(255,0,0);const COLORREF g_ crDkRed = RGB(128,0,0);const COLORREF g_crMagenta = RGB(255,0,255);const COLORREF g_ crDkMagenta = RGB128,0,128);const COLORREF g_crBlue= RGB(0,0,255);const COLOR

19、REF g_ crDkBlue = RGB(0,0,128);const COLORREF g_crCyan = RGB(0,255,255);const COLORREF g_ crDkCyan = RGB(0,128,128);const COLORREF g_crGreen = RGB(0,255,0);const COLORREF g_ crDkGreen = RGB(0,128,0);const COLORREF g_crGray = RGB(192,192, 192);const COLORREF g_ crDkGray = RGB(128, 128, 128);const COL

20、ORREF g_crWhite = RGB(255,255,255);/ 256色设备支持的颜色举例const COLORREF g_crLtYellow = RGB(255,251,240);const COLORREF g_crLtGreen = RGB(192,220,192);const COLORREF g_crLtBlue = RGB(166,202,240);const COLORREF g_crMedGreen = RGB(160,160,164);设置颜色的场合有设置文本颜色、设置画笔和画刷的颜色。设置画笔和画刷的颜色的方法我们将在介绍GDI对象时讲述,设置文本颜色包括设置前

21、景色和背景色。(1)为了设置在绘制文本的前景像素时使用的颜色,调用CDC:SetTextColor(),函数定义如下:COLORREF SetTextColor(COLORREF crColor);(2)为了设置在绘制文本的背景像素时使用的颜色,调用CDC:SetBkColor(),函数定义如下:COLORREF SetBkColor(COLORREF crColor);对Exam5_1程序增加实现产生黑色背景,红色文本的视图。程序清单见下面粗体部分:程序清单5-7:在视图中设置颜色的OnDraw()函数void CExam5_1View:OnDraw(CDC* pDC) CExam5_1Do

22、c* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-SetTextColor (RGB(255,0,0); pDC-SetBkColor (RGB(0,0,0); CString str; str.Format(鼠标左键双击的位置是%d,%d,m_LPoint.x, m_LPoint.y); pDC-TextOut(0,0,str);5.2.2设置文本显示属性 CDC还提供了设置文本显示属性的函数,下表5-2列出了三组控制文本的显示属性常用函数:表5-2 文本属性

23、设置函数函 数说 明SetBkMode和GetBkMode设置和获得背景模式SetTextAlign和GetTextAlign设置和获得对齐方式SetTextJusttification SetTextCharaterExtra调整文本文本背景模式的默认设置是OPAQUE,它要求GDI用户要使用背景颜色,可替换设置为TRANSPARENT,要求GDI用户在绘制文本时,不要使用背景色,函数的格式:int CDC:SetBkMode ( int nBkMode );SetBkMode()函数返回先前的背景模式,nBkMode表示背景模式,只有两种:OPAQUE和TRANSPARENT。int CD

24、C:GetBkMode ( ) const;GetBkMode()函数返回当前使用的背景模式。文本对齐描述了(x,y)文本坐标和文本框之间的关系。默认设置将文本与文本坐标右下方对齐。可使用SetTextAlign函数设置文本对齐,函数格式:UINT SetTextAlign ( UINT nFlags );nFlag 为表5-3中列出的标志的组合,各栏中的标志之间相互排斥,只能从一栏中取一种标志,第一行为系统的默认设置值,例如:pDC-SetTextAlign(TA_RIGHT|TA_TOP);表5-3文本对齐风格X轴对齐Y轴对齐更新当前位置TA_LEFTTA_TOPTA_NOUPSATECP

25、TA_CENTERTA_BASELINETA_UPDATECPTA_RIGHTTA_BOTTOM如果准备将不同字体,不同字号的文本混合在一行,使用y轴默认设置TA_TOP将产生奇怪的现象,这时应该更改y轴默认设置为 TA_BOTTOM。SetTextJusttification()和SetTextCharaterExtra()函数用于设置文本属性:文本调整和文本额外间隔。这两种属性能够帮助填补文本行。填补文本行是为了生成WYSIWYG(所见即所得)输出。在大多数情况下,它意味着显示屏幕输出变形,以模仿打印输出的效果。 SetTextJusttification()函数能够指定添加到各个间隔字符

26、的像素数,如果需要更多地填充,则应调用SetTextCharaterExtra()函数,将额外的像素添加到各个字符(而不是间隔字符)。5.2.3 设置字体字体是一组复杂的图形图像,大小和设计都是统一的,用于表示字符数据。字体通常由磅值、名称和风格标识的,如8磅粗体Arial这样的风格。处理字体的最简单的方法是使用GDI的常备字体,如要自己设置显示字体的风格需要创建一个CFont的对象,具体步骤如下:1定义CFont对象2调用CreateFont()函数创建字体3将创建的字体对象选入DC,并保存前一个被选入DC的字体对象CreateFont()函数包括大量参数,具体解释如下:(1)格式:BOOL

27、 CreateFont( int nHeight, /字体所需高度,为0使用默认值int nWidth, /字符的宽度值,为0表示设备的纵横比匹配可用字体的纵横比int nEscapement, /字体转义,指定转义矢量和x轴的夹角int nOrientation, /字体方向,指定字符基线和x轴的夹角(以0.1度为单位)int nWeight, /字体厚度BYTE bItalic,/是否斜体,布尔值BYTE bUnderline, /是否带有下划线,布尔值BYTE cStrikeOut, /是否带有删除线,布尔值BYTE nCharSet, /使用的字符集BYTE nOutPrecision

28、, /输出精度BYTE nClipPrecision, /剪取精度BYTE nQuality, /输出质量BYTE nPitchAndFamily, /字符间距和字族LPCTSTR lpszFacename /字体的字样名称);(2)返回值:如果成功,返回非0值;失败,返回0值。(3)参数:nWeight 字体厚度常用参数有:FW_NORMAL、FW_REGULAR和FW_BOLDnCharSet 字符集常用参数有:ANSI_SHARSET、DEFAULT_CHARSET、SYBOL_CHARSET、SHIFTJIS_CHARSET、OEM_CHARSET等nOutPrecision 输出精确

29、度定义。输出与请求使用的字体的高度、宽度、字符走向、转义和字间距的匹配程度,常用参数有:OUT_CHARACTER_PRECIS、 OUT_STRING_PRECIS、OUT_DEFAULT_PRECIS、OUT_DEVICE_PRECIS等等。nClipPrecision 剪取精度定义。如何剪取部分位于剪取区域之外的字符,常用参数有:CLIP_CHARACTER_PRECIS、 CLIP_DEFAULT_PRECIS、CLIP_MASK。nQuality 字体的输出质量定义。GDI怎样才能将逻辑字体属性与实际物理字体匹配起来,常用参数值:DEFAULT_QUALITY、DRAFT_QUALI

30、TY和PROOF_QUALITY。 nPitchAndFamily 通常是字符间距与字族的组合值,如:DEFAULT_PITCH|FF_DONTCARE 下面通过实例显示字体对象的创建和使用。运行效果如图5-5所示:图5-5 设置字体效果程序清单5-8:在视图中创建并使用字体对象的OnDraw()函数void CExam5View:OnDraw(CDC* pDC) CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CFont NewFont; NewFont.CreateFont (65,65,0,0,FW_DONTCARE,true,false,false,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,黑体); CFont *pOldFont; pOldFont=pDC-SelectObject (&NewFont); pDC-TextOut(10,10, 倾斜的黑体字); 5.2.4 格式化文本Windows系统不参与窗口客户区的管理,这就意味着在客户区

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2