Visual C++面向对象编程教程 第8章 图形处理 2008年5月.ppt
《Visual C++面向对象编程教程 第8章 图形处理 2008年5月.ppt》由会员分享,可在线阅读,更多相关《Visual C++面向对象编程教程 第8章 图形处理 2008年5月.ppt(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、版权所有版权所有 复制必究复制必究Windows是一个图形操作系统,其所有的图形可视效果都是通过绘制操作而完成的。图形显示的实质就是利用Windows提供的图形设备接口将图形绘制在显示器上。大多数应用程序都需要在客户区绘制一些图形,如绘制文本、几何图形、位图和光标等。前面几章已经涉及到有关图形处理的内容,只是使用了Windows系统默认的图形设备接口和设备环境,绘制的图形没有颜色、线型和字体的变化。本章主要学习内容:本章主要学习内容:l图形处理的基本原理:图形设备接口图形设备接口设备环境设备环境GDI坐标系坐标系映射模式映射模式l使用画笔和画刷绘制图形l文本与字体l位图、图标和光标8.1 图形
2、设备接口图形设备接口lWindows提 供 了 一 个 称 为 图 形 设 备 接 口GDI(Graphics Device Interface)的抽象接口。GDI作为Windows的重要组成部分,它负责管理用户绘图操作时功能的转换。用户通过调用GDI函数与设备打交道,GDI通过不同设备提供的驱动程序将绘图语句转换为对应的绘图指令,避免了直接对硬件进行操作,从而实现所谓的设备无关性。l所谓设备无关性,是指操作系统屏蔽了硬件设备的差异,使用户编程时一般无需考虑设备的类型,如不同种类的显示器或打印机。Windows绘图过程和设备无关性的实现绘图过程和设备无关性的实现:GDI处于设备驱动程序的上一层
3、,当程序调用绘图函数时,GDI将绘图命令传送给当前设备的驱动程序,以调用驱动程序提供的接口函数。驱动程序的接口函数将Windows绘图命令转化为设备能够执行的输出命令,实现图形的绘制。不同设备具有不同的驱动程序,设备驱动程序是设备相关的。l图形设备接口GDI管理Windows应用程序图形的绘制,在应用程序中,通过调用GDI函数绘制不同尺寸、颜色、风格的几何图形、文本和位图。这些图形处理函数组成了图形设备接口GDI。lGDI是形成Windows核心的三种动态链接库之一。l编程时采用MFC方法绘制图形也很方便,MFC对GDI函数和绘图对象进行了封装。MFC将GDI函数封装在一个名为CDC的设备环境
4、类中,因此我们可以通过调用CDC类的成员函数来完成绘图操作。8.1.1 概述概述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()、CreateWindo
10、w()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。l窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。l客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。屏幕坐标系、窗口坐标系和客户区坐标系屏幕坐标系、窗口坐标系和客户区坐标系坐标之间的相互转换坐标之间的相互转换l编程时,有时需要根据当前的具体情况进行三种设备坐标之间或与逻辑坐标的相互转换。lMFC提供了两个函数CWnd:ScreenToClient()和CWnd:ClientToScreen
11、()用于屏幕坐标与客户区坐标的相互转换。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=TR
13、UE;/设置拖拽标记/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_ptOrigin
14、=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_DASHDOTDO
25、T双点划线PS_DOT点线PS_NULL空的边框PS_DASH虚线PS_INSIDEFRAME边框实线PS_DASHDOT点划线创建画笔后必须调用成员函数CDC:SelectObject()将创建的画笔选入当前设备环境。如果选择成功,函数SelectObject()将返回以前画笔对象的指针。选择新的画笔时应该保存以前的画笔对象,如下代码所示:CPen*pPenOldpPenOld=pDC-SelectObject(&PenNew);2.选择创建的画笔选择创建的画笔 创建和选择画笔工具后,应用程序就可以使用该画笔绘图。当绘图完成后,应该通过调用成员函数CDC:SelectObject()恢复设备
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C+面向对象编程教程 第8章 图形处理 2008年5月 C+ 面向 对象 编程 教程 图形 处理 2008
限制150内