Visual C++面向对象编程教程 第8章 图形处理.ppt

上传人:qwe****56 文档编号:70019711 上传时间:2023-01-14 格式:PPT 页数:92 大小:782KB
返回 下载 相关 举报
Visual C++面向对象编程教程 第8章 图形处理.ppt_第1页
第1页 / 共92页
Visual C++面向对象编程教程 第8章 图形处理.ppt_第2页
第2页 / 共92页
点击查看更多>>
资源描述

《Visual C++面向对象编程教程 第8章 图形处理.ppt》由会员分享,可在线阅读,更多相关《Visual C++面向对象编程教程 第8章 图形处理.ppt(92页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、版权所有版权所有 复制必究复制必究Windows是一个图形操作系统,其所有的图形可视效果都是通过绘制操作而完成的。图形显示的实质就是利用Windows提供的图形设备接口将图形绘制在显示器上。大多数应用程序都需要在客户区绘制一些图形,如绘制文本、几何图形、位图和光标等。前面几章已经涉及到有关图形处理的内容,只是使用了Windows系统默认的图形设备接口和设备环境,绘制的图形没有颜色、线型和字体的变化。本章主要学习内容:本章主要学习内容:l图形处理的基本原理:图形设备接口图形设备接口设备环境设备环境GDI坐标系坐标系映射模式映射模式l使用画笔和画刷绘制图形l文本与字体l位图、图标和光标8.1 图形

2、设备接口图形设备接口lWindows提 供 了 一 个 称 为 图 形 设 备 接 口GDI(Graphics Device Interface)的抽象接口。GDI作为Windows的重要组成部分,它负责管理用户绘图操作时功能的转换。用户通过调用GDI函数与设备打交道,GDI通过不同设备提供的驱动程序将绘图语句转换为对应的绘图指令,避免了直接对硬件进行操作,从而实现所谓的设备无关性。l编程时采用MFC方法绘制图形也很方便,MFC对GDI函数和绘图对象进行了封装。l图形设备接口GDI管理Windows应用程序图形的绘制,在应用程序中,通过调用GDI函数绘制不同尺寸、颜色、风格的几何图形、文本和位

3、图。这些图形处理函数组成了图形设备接口GDI。lGDI是形成Windows核心的三种动态链接库之一,MFC将GDI函数封装在一个名为CDC的设备环境类中,因此我们可以通过调用CDC类的成员函数来完成绘图操作。l所谓设备无关性,是指操作系统屏蔽了硬件设备的差异,使用户编程时一般无需考虑设备的类型,如不同种类的显示器或打印机。8.1.1 概述概述Windows绘图过程和设备无关性的实现绘图过程和设备无关性的实现:GDI处于设备驱动程序的上一层,当程序调用绘图函数时,GDI将绘图命令传送给当前设备的驱动程序,以调用驱动程序提供的接口函数。驱动程序的接口函数将Windows绘图命令转化为设备能够执行的

4、输出命令,实现图形的绘制。不同设备具有不同的驱动程序,设备驱动程序是设备相关的。8.1.2 设备环境设备环境l为了实现设备无关性,应用程序的输出不直接面向显示器等物理设备,而是面向一个称之为设备环境DC(DeviceContext)的虚拟逻辑设备。l设备环境也称设备描述表或设备上下文,它是由Windows管理的一个数据结构,它保存了绘图操作中一些共同需要设置的信息,如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜色和背景等影响图形输出的绘图模式。l形象地说,一个设备环境提供了一张画布和一些绘画的工具,我们可以使用不同颜色的工具在上面绘制点、线、圆和文本。l设备环境中的“设备”是指任何类

5、型的显示器或打印机等输出设备,绘图时用户不用关心所使用设备的编程原理和方法。所有的绘制操作必须通过设备环境进行间接的处理,Windows自动将设备环境所描述的结构映射到相应的物理设备上。l从根本上来说,设备环境DC是一个Windows数据结构,该结构存储着程序向设备输出时所需要的信息,应用程序利用它定义图形对象及其属性,并实现应用程序、设备驱动程序和输出设备之间绘图命令的转换。l在Windows中不使用DC无法进行输出,在使用任何GDI绘图函数之前,必须建立一个设备环境。获取获取设备环境设备环境DC的方法:的方法:l在程序中不能直接存取DC数据结构,只能通过系统提供的一系列函数或使用设备环境的

6、句柄HDC来间接地获取或设置设备环境结构中的各项属性,如显示器高度和宽度、支持的颜色数及分辨率等。l如果采用SDK方法编程,获取DC的方法有两种:在 WM_PAINT消 息 处 理 函 数 中 通 过 调 用 API函 数 BeginPaint()获取设备环境,在消息处理函数返回前调用API函数EndPaint()释放设备环境。在其他函数中通过调 用 API函 数 GetDC()获 取 设 备 环 境,调 用 API函 数 ReleaseDC()释放设备环境。l如果采用MFC方法编程,MFC提供了不同类型的DC类,每一个类都封装了DC句柄,并且它们的构造函数自动调用获取DC的API函数,析构函

7、数自动调用释放DC的API函数。因此,在程序中通过声明一个MFC设备环境类的对象就自动获取了一个DC,而当该对象被销毁时就自动释放了获取的DC。MFCAppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。lMFC的DC类包括CDC、CPaintDC、CClientDC、CWindowDC和 CMetaFileDC等,其 中 CDC类 是MFC设备环境类的基类,其它的MFC设备环境类都是CDC的派生类。lCDC类既作为其它MFC设备环境类的基类,又可以作为一个一般的设备环境类使用。利用它可以访问设备属性和设置绘图属性。CDC类对GDI的所有绘图函数进行了封装。lCPain

8、tDC类是OnPaint()函数使用的设备环境类,它代表一个窗口的绘图画面。如果添加WM_PAINT消息处理函数OnPaint(),就需要使用CPaintDC类来定义一个设备环境对象。lCClientDC类代表了客户区设备环境。当在客户区实时绘图时,需要利用CClientDC类定义一个客户区设备环境。lCWindowDC类代表了整个程序窗口设备环境,可以在整个窗口区域绘图。MFC设备环境类:设备环境类:8.1.3 GDI坐标系和映射模式坐标系和映射模式 lWindows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动

9、或按下鼠标的鼠标位置是采用设备坐标。l逻辑坐标系是面向DC的坐标系,这种坐标不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标。l设备坐标系是面向物理设备的坐标系,这种坐标以像素或设备所能表示的最小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点位置(0,0)不限定在设备显示区域的左上角。l设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。l屏幕坐标系以屏幕左上角为原点,一些与整个屏幕 有 关 的 函 数 均 采 用 屏 幕 坐 标,如 GetCursorPos()、SetCursorPos()、CreateWind

10、ow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。l窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。l客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。屏幕坐标系、窗口坐标系和客户区坐标系屏幕坐标系、窗口坐标系和客户区坐标系坐标之间的相互转换坐标之间的相互转换l编程时,有时需要根据当前的具体情况进行三种设备坐标之间或与逻辑坐标的相互转换。lMFC提供了两个函数CWnd:ScreenToClient()和CWnd:ClientToScree

11、n()用于屏幕坐标与客户区坐标的相互转换。lMFC提供了两个函数CDC:DPtoLP()和CDC:LPtoDP()用于设备坐标与逻辑坐标之间的相互转换。例例修改例5-13中的程序MyDraw,采用将设备坐标转换为逻辑坐标的方法实现滚动视图的功能。Windows鼠标位置使用设备坐标系,以客户区窗口原点作为基准,而在OnDraw()函数中使用逻辑坐标。因此,为了在滚动视图中重绘图形,必须在存储线段起点和终点之前将其坐标转换为逻辑坐标。实质上,OnDraw()函数由OnPaint()函数调用,在调用OnDraw()函数前,OnPaint()函数已经调用了函数OnPrepareDC()对设备环境进行了

12、调整。打开应用程序项目MyDraw,修改单击鼠标和鼠标移动的消息处理函数。voidCMyDrawView:OnLButtonDown(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehere.CClientDC dc(this);OnPrepareDC(&dc);/调整设备环境的属性调整设备环境的属性dc.DPtoLP(&point);/将设备坐标转换为逻辑坐标将设备坐标转换为逻辑坐标SetCapture();/捕捉鼠标:SetCursor(m_hCross);/设置十字光标m_ptOrigin=point;m_bDragging=T

13、RUE;/设置拖拽标记/CScrollView:OnLButtonDown(nFlags,point);voidCMyDrawView:OnMouseMove(UINTnFlags,CPointpoint)if(m_bDragging)CMyDrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);pDoc-AddLine(m_ptOrigin,point);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigi

14、n=point;/CScrollView:OnMouseMove(nFlags,point);映射模式映射模式l映射模式确定了在绘制图形时所依据的坐标系,它定义了逻辑单位的实际大小、坐标增长方向,所有映射模式的坐标原点均在设备输出区域(如客户区或打印区)的左上角。此外,对于某些映射模式,用户还可以自定义窗口的长度和宽度,设置视图区的物理范围。lWindows定义了8种映射模式:MM_TEXT、MM_LOMETRIC、MM_HIMETRIC、MM_LOE-NGLISH、MM_HIENGLISH、MM_TWIPS、MM_ISOTROPIC、MM_ANISOTROPICl映射模式使得程序员可不必考虑

15、输出设备的具体设备坐标系,而在一个统一的逻辑坐标系中进行图形的绘制。映射模式映射模式逻辑单位逻辑单位坐标系设定坐标系设定MM_TEXT一个像素X轴正方向朝右,Y轴正方向朝下MM_LOMETRIC0.1毫米X轴正方向朝右,Y轴正方向朝上MM_HIMETRIC0.01毫米X轴正方向朝右,Y轴正方向朝上MM_LOENGLISH0.01英寸X轴正方向朝右,Y轴正方向朝上MM_HIENGLISH0.001英寸X轴正方向朝右,Y轴正方向朝上MM_TWIPS1/1440英寸X轴正方向朝右,Y轴正方向朝上MM_ISOTROPIC系统确定X、Y轴可任意调节,X、Y轴比例为1:1MM_ANISOTROPIC系统确

16、定X、Y轴可任意调节,X、Y轴比例任意Windows映射模式映射模式 设置原点的坐标:设置原点的坐标:l通过调用函数CDC:SetWindowOrg()设置设备环境的窗口原点的坐标,调用CDC:SetViewportOrg()重新设置设备的视口原点的坐标。这里,窗口是对应于逻辑坐标系(设备环境)由用户设定的一个区域,而视口是对应于实际输出设备由用户设定的一个区域。l窗口原点是指逻辑窗口坐标系的原点在视口(设备)坐标系中的位置,视口原点是指设备实际输出区域的原点。l除了映射模式,窗口和视口也是决定一个点的逻辑坐标如何转换为设备坐标的一个因素。一个点的逻辑坐标按照如下式子转换为设备坐标:设备(视口

17、)坐标=逻辑坐标窗口原点坐标+视口原点坐标例例 分别在分别在OnDraw()函数中添加如下代码,设置不函数中添加如下代码,设置不同的窗口原点和视口原点,结果有什么不同。同的窗口原点和视口原点,结果有什么不同。(1)pDC-SetMapMode(MM_TEXT);pDC-Rectangle(CRect(50,50,100,100);(2)pDC-SetMapMode(MM_TEXT);pDC-SetWindowOrg(50,50);pDC-Rectangle(CRect(50,50,100,100);(3)pDC-SetMapMode(MM_TEXT);pDC-SetViewportOrg(50

18、,50);pDC-Rectangle(CRect(50,50,100,100);(4)pDC-SetMapMode(MM_TEXT);pDC-SetViewportOrg(50,50);pDC-SetWindowOrg(50,50);pDC-Rectangle(CRect(50,50,100,100);8.1.4 颜色的设置颜色的设置lWindows用COLORREF类型的数据存放颜色,它是一个32位整数。任何一种颜色都是由红、绿、蓝三种基本颜色组成,COLORREF类型数据的低位字节存放红色强度值,第2个字节存放绿色强度值,第3个字节存放蓝色强度值,高位字节为0,每一种颜色分量的取值范围为0

19、到255。l直接设置COLORREF数据不太方便,Windows提供了RGB宏用于设置颜色,将其中的红、绿、蓝分量值转换为COLORREF类型的颜色数据:RGB(byRed,byGreen,byBlue)其中参数byRed、byGreen和byBlue分别表示红、绿、蓝分量值(范围0到255)。RGB宏的使用:宏的使用:很 多 涉 及 到 颜 色 的 GDI函 数 都 需 要 使 用COLORREF类型的参数,如设置背景色的成员函数 CDC:SetBkColor()、设 置 文 本 颜 色 的 成 员 函 数 CDC:SetTextColor()。例如:COLORREFrgbBkClr=RGB

20、(192,192,192);/定义灰色pDC-SetBkCorlor(rgbBkClr);/背景色为灰色pDC-SetTextColor(RGB(0,0,255);/文本颜色为兰色标准彩色的标准彩色的RGB值值 颜色颜色RGBRGB分量值分量值颜色颜色RGBRGB分量值分量值浅红255,0,0深红128,0,0浅绿0,255,0深绿0,128,0浅蓝0,0,255深蓝0,0,128浅黄255,255,0深黄128,128,0浅青0,255,255深青0,128,128紫色255,0,255灰色192,192,192白色255,255,255黑色0,0,0l在默认状态下,当用户创建一个设备环境并

21、在其中绘图时,系统使用设备环境缺省的绘图工具及其属性。如果要使用不同风格和颜色的绘图工具进行绘图,用户必须重新为设备环境设置自定义的画笔和画刷等绘图工具。l画笔和画刷是Windows中两种最重要的绘图工具,画笔用于绘制点、线、矩形和椭圆等几何图形,画刷用指定的颜色和图案来填充绘图区域,这些绘图工具又统称为GDI对象。8.2 画笔和画刷画笔和画刷 8.2.1 GDI对象对象lWindowsGDI提供了一些绘图对象,程序通过这些GDI对象设置绘图的工具和风格,这里的对象是指Windows数据结构,而不是C+类的对象。lGDI对象是Windows图形设备接口的抽象绘图工具。除了画笔和画刷,其它GDI

22、对象还包括字体、位图和调色板。lMFC对GDI对象进行了很好的封装,提供了封装GDI对 象 的 类,如 CPen、CBrush、CFont、CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类。CDC类提供了成员函数SelectObject()选择用户自己创建的GDI对象,该函数有多种重载形式,可以选择用户已定制好的画笔、画刷、字体和位图等不同类型的GDI对象。CPen*SelectObject(CPen*pPen);CBrush*SelectObject(CBrush*pBrush);virtualCFont*SelectObject(CFont*pFont

23、);CBitmap*SelectObject(CBitmap*pBitmap);函数参数是一个指向用户已定制好的GDI对象的指针,选择操作成功函数将返回以前GDI对象的指针,否则返回NULL。选择一个选择一个GDI对象对象:8.2.2 使用画笔使用画笔 当用户创建一个用于绘图的设备环境时,该设备环境自动提供了一个宽度为一个像素单位、风格为实黑线(BLACK_PEN)的缺省画笔。如果要在设备环境使用自己的画笔绘图,首先需要创建一个指定风格的画笔,然后将创建的画笔选入设备环境,最后,在使用该画笔绘图结束后需要释放该画笔。1.创创建画笔建画笔创建画笔最简单的方法是调用CPen类的一个带参数的构造函数

24、来构造一个CPen类画笔对象,以下代码创建了一个红色虚线画笔:CPenPenNew(PS_DASH,1,RGB(255,0,0);创建画笔的第二种方法是首先构造一个没有初始化的CPen类画笔对象,然后调用成员函数CPen:CreatePen()创建定制的画笔工具:CPenPenNew;PenNew.CreatePen(PS_DASH,1,RGB(255,0,0);函数CreatePen()的参数类型与带参数的CPen类构造函数完全一样。当画笔对象的声明与创建不在同一个地方时(如需要多次改变画笔)只有采用这种方法。样样 式式说说 明明样样 式式说说 明明PS_SOLID实线PS_DASHDOTD

25、OT双点划线PS_DOT点线PS_NULL空的边框PS_DASH虚线PS_INSIDEFRAME边框实线PS_DASHDOT点划线创建画笔后必须调用成员函数CDC:SelectObject()将创建的画笔选入当前设备环境。如果选择成功,函数SelectObject()将返回以前画笔对象的指针。选择新的画笔时应该保存以前的画笔对象,如下代码所示:CPen*pPenOldpPenOld=pDC-SelectObject(&PenNew);2.选择创建的画笔选择创建的画笔 创建和选择画笔工具后,应用程序就可以使用该画笔绘图。当绘图完成后,应该通过调用成员函数CDC:SelectObject()恢复设

26、备环境以前的画笔工具,并通过调用成员函数CGdiObject:DeleteObject()释放GDI对象所占的内存资源,如下代码所示:pDC-SelectObject(pPenOld);/恢复设备环境DC中原来的画笔PenNew.DeleteObject();/删除底层的GDI对象3.还原画笔还原画笔 在OnDraw()函数中添加如下所示的代码:CPen*pPenOld,PenNew;intnPenStyle=PS_SOLID,/实线PS_DOT,/点线PS_DASH,/虚线PS_DASHDOT,/点划线PS_DASHDOTDOT,/双点划线PS_NULL,/空的边框PS_INSIDEFRAM

27、E,/边框实线;char*strStyle=Solid,Dot,Dash,DashDot,DashDotDot,Null,InsideFrame;pDC-TextOut(60,10,用不同样式的画笔绘图);例例编写一个SDI应用程序,绘制不同风格、宽度和颜色的直线。for(inti=0;iSelectObject(&PenNew);/选择画笔pDC-TextOut(10,30+20*i,strStylei);pDC-MoveTo(100,40+20*i);pDC-LineTo(200,40+20*i);pDC-SelectObject(pPenOld);/恢复原来的画笔PenNew.Delet

28、eObject();/删除底层的GDI对象elseMessageBox(不能创建画笔!);char*strWidth=1,2,3,4,5,6,7;pDC-TextOut(260,10,用不同宽度的画笔绘图);for(i=0;iSelectObject(&PenNew);/选择画笔pDC-TextOut(260,30+20*i,strWidthi);pDC-MoveTo(300,40+20*i);pDC-LineTo(400,40+20*i);pDC-SelectObject(pPenOld);/恢复原来的画笔PenNew.DeleteObject();/删除底层的GDI对象elseMessag

29、eBox(不能创建画笔!);char*strColor=红,绿,蓝,黄,紫,青,灰;COLORREFrgbPenClr=RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),RGB(255,255,0),RGB(255,0,255),RGB(0,255,255),RGB(192,192,192);pDC-TextOut(460,10,用不同颜色的画笔绘图);for(i=0;iSelectObject(pPenNew);/选择创建的画笔pDC-TextOut(460,30+20*i,strColori);pDC-MoveTo(500,40+20*i);pDC-LineTo

30、(600,40+20*i);pDC-SelectObject(pPenOld);/恢复原来的画笔deletepPenNew;/自动删除底层的GDI对象l当创建一个设备环境时,该设备环境自动提供了一个填充色为白色(WHITE_BRUSH)的缺省画刷。与画笔一样,也可以利用MFC画刷类CBrush创建自己的画刷,用于填充图形的绘制。l画刷有三种基本类型:纯色画刷、阴影画刷和图案画刷,CBrush类提供了多个不同重载形式的构造函数。以下创建三种不同类型的画刷:CBrushbrush1(RGB(255,0,0);/创建纯色画刷CBrushbrush2(HS_DIAGCROSS,RGB(0,255,0)

31、;/创建阴影画刷CBrushbrush3(&bmp);/创建图案画刷8.2.3 使用画刷使用画刷 l创建画刷也可先构造一个没有初始化的CBrush类画刷对象,然后调用CBrush类的初始化成员函数创建定制的画刷工具。CBrush类提供的常用创建函数有:CreateSolidBrush()用指定的颜色创建一个纯色画刷;CreateHatchBrush()用指定的阴影样式和颜色创建一个阴影画刷;CreatePatternBrush()用位图创建一个图案画刷;CreateSysColorBrush()用系统默认颜色创建一个指定阴影样式的画刷。l如下代码创建了一个填充色为红色、图案为垂直相交阴影线的画

32、刷:CBrushBrushNew;BrushNew.CreateHatchBrush(HS_CROSS,RGB(255,0,0);1建立一个基于对话框的应用程序UseBrush,为对话框类CUseBrushDlg添加一个CBrush类型的成员变 量 m_BrushBkClr。在 对 话 框 初 始 化 成 员 函 数 OnInitDialog()中创建一个自定义颜色的画刷。BOOLCUseBrushDlg:OnInitDialog()./TODO:Addextrainitializationherem_BrushBkClr.CreateSolidBrush(RGB(0,0,255);/创建一个

33、蓝色画刷returnTRUE;/returnTRUEunlessyousetthefocus.例例编写一个对话框应用程序,并重新设置对话框的背景色。2利用ClassWzard为对话框类CUseBrushDlg添加WM_CTLCOLOR的消息处理函数,返回用户自己创建的画刷m_BrushBkClr。HBRUSHCUseBrushDlg:OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)/HBRUSHhbr=CDialog:OnCtlColor(pDC,pWnd,nCtlColor);/不使用缺省的画刷/TODO:Returnadifferentbrushift

34、hedefault.returnm_BrushBkClr;lWindows预定义了一些简单风格的GDI对象,用户使用这些GDI对象时,无需自己创建它们,可以直接将它们选入当前的设备环境,这些GDI对象称作为堆(堆(Stock)对象对象。堆对象包括堆画笔、堆画刷和堆字体等。l通过调用成员函数CDC:SelectStockObject()可以选择一个堆对象绘图工具,以下代码将堆画笔和堆画刷作为当前的绘图工具:pPenOld=(CPen*)pDC-SelectStockObject(NULL_PEN);/使用堆画笔对象pBrhOld=(CBrush*)pDC-SelectStockObject(LT

35、GRAY_BRUSH);/使用堆画刷对象8.2.4 使用使用GDI堆对象堆对象堆画笔、画刷的样式及说明堆画笔、画刷的样式及说明 样样 式式说说 明明样样 式式说说 明明BLACK_PEN黑色画笔WHITE_PEN白色画笔NULL_PEN空画笔BLACK_BRUSH黑色画刷WHITE_BRUSH白色画刷NULL_BRUSH空画刷GRAY_BRUSH灰色画刷DKGRAY_BRUSH深灰色画刷LTGRAY_BRUSH浅灰色画刷HOLLOW_BRUSH虚画刷也可以利用CGdiObject:CreateStockObject()将GDI对象设置成指定的堆对象,这时需要首先声明一个GDI对象,最后还需要调

36、用函数SelectObject()将与堆对象关联的GDI对象选入当前的设备环境,如下代码所示:CBrush*pBrhOld,BrhNew;BrhNew.CreateStockObject(LTGRAY_BRUSH);/设置堆画刷对象pBrhOld=pDC-SelectObject(&BrhNew);利用MFCAppWizard向导创建一个SDI应用程序UseStock,利用ClassWizard为类CUseStockView添加WM_PAINT消息处理函数OnPaint():voidCUseStockView:OnPaint()CPaintDCdc(this);/devicecontextfo

37、rpainting/TODO:AddyourmessagehandlercodehereCPen*pPenOld,PenNew;CBrush*pBrhOld,BrhNew;pPenOld=(CPen*)dc.SelectStockObject(BLACK_PEN);/使用堆画笔对象例例 编写一个SDI应用程序,使用堆画笔和堆画刷绘制图形。pBrhOld=(CBrush*)dc.SelectStockObject(GRAY_BRUSH);/使用堆画刷对象dc.Rectangle(100,100,300,300);PenNew.CreateStockObject(NULL_PEN);/NULL_P

38、EN用于绘制无边界的填充图形dc.SelectObject(&PenNew);BrhNew.CreateStockObject(LTGRAY_BRUSH);dc.SelectObject(&BrhNew);dc.Ellipse(400,100,600,200);dc.SelectObject(pPenOld);/恢复系统默认的GDI对象dc.SelectObject(pBrhOld);dc.Ellipse(400,210,600,310);/DonotcallCView:OnPaint()forpaintingmessagesl生成设备环境、设置绘图属性和选择绘图工具后,就可以开始绘制不同形状

39、的几何图形,Windows中可以绘制的基本几何图形包括点、直线、曲线、矩形、椭圆、弧、扇形、弦形和多边形等。lGDI为提供了绘制基本图形的成员函数,这些函数封装在MFC的CDC类中。l绘图函数使用的坐标都是逻辑坐标。8.2.5 绘制基本图形绘制基本图形 函函 数数功功 能能SetPixel用指定的颜色在指定的坐标画一个点MoveTo移动当前位置到指定的坐标,函数返回以前位置的坐标。LineTo从当前位置到指定位置画一条直线Polyline从当前位置开始,根据函数参数绘制多条折线。PolyBezier根据两个端点和两个控制点绘制贝济埃(Bezier)曲线。Rectangle根据指定的左上角和右下

40、角坐标绘制一个矩形RoundRect绘制一个圆角矩形。Ellipse根据指定的矩形绘制一个内切椭圆Arc根据指定的矩形绘制内切椭圆上的一段弧边ArcTo该函数功能与Arc函数相同,不同之处在于画弧成功后Pie绘制扇形Chord绘制弦形,弦形是一条椭圆弧和其对应的弦所组成的封闭图形。Polygon根据两个或两个以上顶点绘制一个多边形DrawIcon在指定位置画一个图标,如果成功函数返回非0,否则返回0。利 用 MFC AppWizard建 立 一 个 SDI应 用 程 序,在 OnDraw()函数中添加如下程序代码:voidCMyGraphView:OnDraw(CDC*pDC)CMyGraph

41、Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherefor(intxPos=20;xPosSetPixel(xPos,30,RGB(0,0,0);/绘制像素点POINTpolylpt5=10,100,50,60,120,80,80,150,30,130;pDC-Polyline(polylpt,5);/绘制五条折线例例编写一个绘图程序,利用表8-6中的成员函数绘制几种常见的几何图形。POINTpolybpt4=150,160,220,60,300,180,330,20;pDC-PolyBezie

42、r(polybpt,4);/绘制贝济埃曲线CBrush*pBrhOld;pBrhOld=(CBrush*)pDC-SelectStockObject(LTGRAY_BRUSH);/使用浅灰色堆画刷pDC-RoundRect(400,30,550,100,20,20);/绘制圆角矩形pDC-Arc(20,200,200,300,200,250,20,200);/绘制椭圆弧pDC-Pie(220,200,400,380,380,270,240,220);/绘制扇形pDC-Chord(420,120,540,240,520,160,420,180);/绘制弦形POINTpolygpt5=450,20

43、0,530,220,560,300,480,320,430,280;pDC-Polygon(polygpt,5);/绘制五边形pDC-SelectObject(pBrhOld);/恢复系统默认的画刷l很多Windows应用程序都需要显示文本,并且,文本还是一些应用程序的主要处理对象,如MSWord字处理软件。l文本与字体密切相关,输出文本时选择不同类型的字体在很大程度上影响程序的界面风格,合适的字体可以增强程序的感染力。因此,对软件用户来说,文本输出也是很重要的。lWindows为文本的显示提供了多种物理字体支持,而在程序中我们可以创建不同风格的逻辑字体来输出文本。8.3 文本与字体文本与字体

44、 l以图形方式进行文本的输出是Windows操作系统一个特性,文本输出实际上是按照指定的字体样式将文本中的每个字符绘制出来。lWindows图形设备接口GDI提供了很多有关文本输出的函数,MFC的CDC类对这些GDI文本输出函数进行了封装。l编程时最常用的文本输出函数是TextOut()函数,该函数只能输出单行文本。要绘制多行文本可以调用DrawText()函数,另一个函数ExtTextOut()可以用一个矩形框对输出文本串进行裁剪。8.3.1 绘制文本绘制文本 在缺省情况下绘制文本时,字体颜色是黑色,背景颜色是白色,背景模式为不透明模式。可以通过调用CDC类成员函数重新设置字体颜色、背景颜色

45、和文本对齐方式等文本属性。SetTextColor()设置显示文本的颜色GetTextColor获得当前文本的颜色SetBkColor()设置显示文本的背景颜色GetBkColor()获得当前文本的背景颜色SetBkMode()设置文本的背景模式GetBkMode()获得当前文本的背景模式SetTextAlign()设置显示文本的对齐方式GetTextAlign()获得当前文本的对齐方式l文本与字体密切相关,输出文本的大小和外观是由字体描述的。字体是指采用某种字样的一套字符和符号,每一种字体都有字符集。l决定字体的三个要素是字样、风格和大小。字样是字母的样式和文本的视觉外观,字体的风格是字体的

46、粗细和倾斜度。lWindows支持光栅字体、矢量字体和TrueType三种字体。光栅字体即点阵字体,这种字体需要为每一种大小的字体创建独立的字体文件。矢量字体以一系列线段存储字符。TrueType字体是与设备无关的字体,字符以轮廓的形式存储,包括线段和曲线。8.3.2 字体概述字体概述 lTrueType字体正成为真正的主流,这种字体能够以一种非常出色的字体技术绘制文本。TrueType字体能够缩放为任何大小的字体,而不会降低图形的质量。Windows中提供的TrueType字体主要有Arial、Courier、Symbol、TimeNewRoman等,可以通过Windows“控制面板|字体”

47、浏览系统已安装的字体。l输出文本时,默认情况下使用系统提供的缺省字体,如果需要可以改变显示文本的字体。与画笔和画刷一样,字体也是一种GDI对象,MFC类CFont对GDI字体对象进行了封装,我们一般利用CFont类创建自己的字体(GDI对象),然后把创建的字体选入设备环境,以用于在设备环境中绘制文本。除了选择任意尺寸TrueType字体,也可以选择固定尺寸的系统字体(堆堆字字体体)。当选择堆字体作为文本输出的字体时,无需创建字体对象,只需简单地调用成员函数CDC:SelectStockObject()将堆字体对象选入设备环境。Windows提供了以下六种堆字体对象:ANSI_FIXED_FON

48、T、ANSI_VAR_FONT、SYSTEM_FONT、SYSTEM_FIXED_FONT、DEVICE_DEFAULT_FONT、OEM_FIXED_FONT。例如:pDC-SelectStockObject(ANSI_FIXED_FONT);选择堆字体:选择堆字体:输出文本时,Windows使用一个矩形框以位图的方式绘制出每一个字符的形状。文本的显示是以像素为单位,有时需要精确地知道文本的详细属性,如高度、宽度等。编程时我们可以通过访问TEXTMETRIC结构来获取显示器关于文本字符的属性信息,因为每一种物理字体的信息由数据结构TEXTMETRIC描述。调用函数CDC:GetTextMet

49、rics()可得到当前字体的TEXTMETRIC结构。TEXTMETRIC结构:结构:8.3.3 创建字体创建字体lWindows本身提供了丰富的字体,直接选用其中的字体就能满足一般需要。也可以根据Windows提供的字体创建自己的字体,但利用CFont类创建自定义字体并不是创建一种新的物理字体,而是创建一种逻辑字体。l逻辑字体是一种抽象的字体描述,是用与设备无关的方式来描述一个字体。逻辑字体只定义了字体的一般特征,如高度、宽度、旋转角度、黑体、斜体及下划线等宏观特性,它并没有描述字体详细的微观特性,也没有生成对应的字库文件。l值得注意的是,有时不知道机器上是否安装了需要的字体,因此,程序运行

50、时显示文本的字体可能并不是你想要的字体。实际上,在程序中创建一种字体并不是真正创建一种完全满足程序要求的字体,而是仅寻找匹配的Windows字体并与之相关联。l当 利 用 CFont类 创 建 逻 辑 字 体 并 利 用 成 员 函 数 CDC:SelectObject()将它选入设备环境时,GDI字体映射器根据逻辑字体给出的特性,从现有的物理字体中选择与之最匹配的物理字体,这就是所谓的字体实现(Fontrealization)。1.使用成员函数CFont:CreatPointFont()2.使用成员函数CFont:CreateFontIndirect()3.使用成员函数CFont:Creat

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁