第6章 绘图工具的使用一_第1页
第6章 绘图工具的使用一_第2页
第6章 绘图工具的使用一_第3页
第6章 绘图工具的使用一_第4页
第6章 绘图工具的使用一_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、12 本章内容包括设备环境(DC)与绘图程序(GDI)的关系,设备环境主要功能在MFC对应的CDC类,利用设备环境类CDC操纵文本(文本的字体、颜色和属性控制),利用设备环境类CDC实现简单图形的绘制(点、线、椭圆、矩形和弧等),各种绘图工具(画笔、画刷)使用。 设备环境(Device Context,DC),又称设备描述表或设备上下文、设备环境 , 是一种Windows的数据结构。 36.1 Windows绘图机制6.2 Windows绘图工具与绘图工具类本章内容46.1图形绘制的基本知识 6.1.1 图形操作的接口GDI6.1.2 图形操作有关的CDC类6.1.3 CDC的内容56.1.1

2、 图形操作的接口GDI 任何图形程序的输出,都离不开图形设备接口GDI(Graphic Device Interface),它是管理Windows应用程序在窗口内的绘图操作。如图形设备(打印机、显示器)的信息、绘图工具的当前状态(什么样的画笔、画刷、文本的前景色与背景色、文本所使用的字体)。 Windows的GDI绘制的各种图形(点、线、圆、多边形、矩形等)是与设备无关的,即在屏幕的窗口内绘图与在打印机上绘图是相似的。 GDI是一个可执行程序,它接收Windows应用程序的绘图请求(表现为GDI调用),并将它们传送给相应的设备驱动程序,再由设备驱动程序驱动相应的硬件设备,如打印机或显示器输出。

3、66.1.1续 应用程序使用GDI可以对三种类型的图形进行操作:文本操作、矢量图形操作和光栅图形操作(图像操作)。(1)文本操作是以逻辑坐标为单位来计算文本的输出位置,用户可以通过各种GDI函数来作出具有各种效果的文本。(2)矢量图形指的是利用画点、直线、曲线(折线、贝塞尔曲线等)、多边形、扇形、矩形等函数所绘制的图形。(3)光栅图形操作是指以光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出,其在屏幕上表现为对若干个行和列的像素操作76.1.2 图形操作有关的CDC类 1设备描述表(DC) 又称设备环境又称设备环境(Device Context,DC), 设备描述表是一个

4、用来确定任何设备(如显示器、打印机)的GDI输出位置和内容属性的集合,是Windows系统下的一个保存GDI 内部数据的数据结构,它与特定的显示设备相关。对于显示器,设备描述表总是与显示器上的特定窗口相关。 设备描述表中保存了显示图形所需要的各种参数值,如显示颜色、显示坐标、显示方式和背景颜色。在Windows下程序员对所有的绘图功能的调用,都是通过设备描述表来进行的。86.1.2 续 2. 设备环境类CDC基类 CDC(Class of Device-Context )类是DC类的基类. 封装了使用设备环境的各种各种GDI函数函数,它用于定义一个设备环境对象,定义一个设备环境对象,并提供了在

5、显示器、打印机和窗口的客户程序区域上画图的方法。(1)在视图类的OnDraw()函数中绘图 它带有一个指向设备环境对象设备环境对象的指针pDC,MFC的绘图成大多都是通过pDC这个指针来加以访问的。void CPenTestView:OnDraw(CDC* pDC) CRect ct;pDC-Rectangle(ct ); 96.1.3 CDC的内容 1.1派生类CPaintDC(1)CPaintDC是从CDC派生出来的设备描述表类,它常常在窗口的OnPaint函数中使用。在WM_PAINT消息需要响应时才起作用,通常是在应用程序的OnPaint响应函数中使用。106.1.3 续1 1.2派生

6、类CClientDC(管理客户区) CClientDC类只能在客户区绘图。所谓客户区是指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等以外的部分,它是用户可以操作的区域。例如在使用CClientDC进行绘图时,一般要调用GetClientRect函数来获取客户区域的大小。 CClientDC对象的窗口句柄保存在成员变量m_hWnd,为构造CClientDC,需将CWnd作为参数传递给构造函数。116.1.4续2 1.3派生类CWindowDC(管理框架窗口) CWindowDC类直接从CDC派生,它使调用和释放整个窗口(包括客户区和非客户区)的设备环境过程自动化。CWindowDC对象在

7、构造时调用Windows API函数GetWindowDC, 在析构时调用相应的API函数ReleaseDC,这意味着CWindowtDC对象可访问CWnd所指向的整个屏幕区域。126.2.1画点与画线函数操作1画点 CDC的成员函数SetPixel用来在指定位置上绘制一个特定的像素点,其原型为:COLORREF SetPixel( POINT point, COLORREF crColor ); 其中参数point指定所绘制的点,crColor指定画点所用的颜色。倘若要在屏幕的(100,100)处画一个红色点,则代码为:pDC- SetPixel(CPoint(100,100),RGB(25

8、5,0,0);136.2.2 绘制封闭图形 Windows提供了Rectangle、Ellipse、RoundRect、Chord、Pie等五个函数用来绘制并填充图形。1画矩形BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPCRECT lpRect ); 此函数成功调用后返回非0值,否则返回0。其中参数(x1,y1)为指定矩形的左上角逻辑x与y坐标;(x2,y2)为指定矩形右下角的逻辑x与y坐标。参数LpRect为一个矩形结构的指针,用它来表示矩形的四个角。146.2.2 续12画椭圆或圆 使用CDC的成员函

9、数Ellipse,可以使用当前笔绘制一个用当前画刷填充的椭圆或圆。其函数原型如下:BOOL Ellipse(int x1, int y1, int x2, int y2 );BOOL Ellipse( LPCRECT lpRect ); 这两个函数画椭圆成功后返回非0值,否则返回0。所画椭圆高度为y2-y1,宽度为x2-x1。在该函数中,椭圆是由其外接矩形来确定的。外接矩形的中心与椭圆中心重合,矩形的长和宽和椭圆的长短轴相等。函数中的参数与画矩形的相仿,分别表示椭圆外接矩形的左上角和右下角坐标。156.2Windows绘图工具 6.2.1 绘图工具的划分6.2.2 使用画笔 6.2.3 使用画

10、刷16概要 VC绘图需要两个要素:设备描述表(DC)和基本绘图工具。设备描述表是由CDC类及其派生类来描述,它是一个画图的画布,提供绘图的场地和环境。画布一般是窗口的客户区,每个窗口CWnd对象都提供一个设备环境,在该环境中有一套默认的基本绘图工具。176.4.1 绘图工具的划分 绘图工具,又称绘图对象,使用他们可以在Windows设备环境中绘制具有各种效果的图形。如果把设备描述表设备描述表(DC)比作画布,程序员比作画家的话,那么绘图工具就是画家手中的画笔、画刷、调色板等。 任何一个画家,不论他的技艺有多么高超(类似于程序员要掌握绘图原理),在没有任何绘图工具的情况下,都无法在画布上画图。

11、Windows的绘图工具包括画笔、画刷、字体、位图、调色板和区域。在MFC中这些绘图工具被封装到相应的类中。 186.4.2 使用画笔 画笔是最简单的一种绘图工具,同时也是最重要的一种绘图对象。Windows也是利用这种面向对象的描述事物的方法,把笔作为一个对象,和现实世界一样,不同的笔产生不同的线。 1 画笔类CpenCPen对象封装了Windows GDI笔,并提供与CPen对象一起工作的几种方法。196.4.2续1 2画笔工具的操作步骤(1)声明CPen对象。(2)初始化画笔。通过调用CreatePen成员函数可以初始化笔,该函数的原型为:BOOL CreatePen( int nPen

12、Style, int nWidth, COLORREF crColor );(3)将新建的画笔对象选进设备场景中,同时保存原画笔对象的指针:pOldPen=pDC-SelectObject(&pen);(4)调用绘图函数生成图形。(5)选择设备场景的原有笔对象。206.4.2续2 3画笔工具的操作实例【例6-4】一个演示画笔的例子。首先利用MFC AppWizard(exe)创建一个新工程,工程的名字为PenTest,除了应用程序的类型选为单文档模式外,向导的每个操作步骤都采用缺省的。(1) 编辑视图类CPenTestView的虚函数OnDraw,实现画笔工具的操作演示。(2)程序运行结果如图

13、6.4所示21void CPenTestView:OnDraw(CDC* pDC)int i; CPen*pOldPen; for(i=0;iSelectObject( &NewPen );pDC-MoveTo(60,60+i*30);pDC-LineTo(200,60+i*30); /用新创建的笔画直线pDC-SelectObject( pOldPen ); /恢复设备描述表中原有笔elseAfxMessageBox(_T(不能创建笔!); /给出错误提示return ;pDC-TextOut(60,60+i*30,_T(不同风格的笔);22/设置颜色表设置颜色表structtagColor

14、 int r,g,b; color6= 255,0,0,0,255,0,0,0,255,255,255,0,255,0,255,0,255,255 ;for(i=5;i=0;i-) /用不同颜色笔画圆用不同颜色笔画圆 CPen NewPen; /声名一个笔对象声名一个笔对象if( NewPen.CreatePen( PS_SOLID, 3, RGB(colori.r,colori.g,colori.b) ) ) pOldPen = pDC-SelectObject( &NewPen );/用新创建的笔画圆用新创建的笔画圆pDC-Ellipse( 400-(i+1)*15, 150-(i+1)*

15、15, 400+(i+1)*15,150+(i+1)*15);pDC-SelectObject( pOldPen ); /恢复设备描述表中的原有的笔恢复设备描述表中的原有的笔else AfxMessageBox(_T(不能创建笔不能创建笔!);return ;pDC-TextOut(400-(i+4)*15,150+(i+9)*15,_T(不同颜色的笔不同颜色的笔); 23CreatePen(int nPenStyle, int nWidth, COLORREF crColor);说明用指定的样式、宽度和颜色创建一个画笔参数表nPenStyle 指定画笔样式,可以是下述常数之一PS_SOLID

16、:画笔画出的是实线PS_DASH:画笔画出的是虚线(nWidth必须不大于1)PS_DOT:画笔画出的是点线(nWidth必须不大于1)PS_DASHDOT:画笔画出的是点划线(nWidth必须不大于1)PS_DASHDOTDOT:画笔画出的是点-点-划线(nWidth必须不大于1)PS_NULL:画笔不能画图PS_INSIDEFRAME:在封闭图形放入框架中绘制直线,如椭圆和矩形函数24图6.4 画笔的各种效果演示256.4.3 使用画刷画笔对象是用来绘制图形边界的,而画刷则是给图形内部着色的。大多数CDC的绘图函数都要同时使用画笔和画刷使用画笔来来绘制各种图形的边界,使用画刷来填充图形的内

17、部。1常用的两类画刷(1)纯色画刷 又称实画刷,事实上它是一个定义了8像素8像素的含有64个相同颜色的像素。在绘制时,Windows将多个这样的纯色位图平铺来填充封闭图形的内部。 创建纯色画刷首先创建一个非初始化的CBrush对象,然后调用CBrush:CreateSolidBrush()函数来初始化纯色画刷。266.4.3续1(2)阴影画刷 阴影画刷是用某种颜色的阴影线在封闭图形内填充。它也是一个定义了8像素8像素的含有64个像素单位位图,该位图就是一个阴影。在绘制时,Windows将多个这样含有阴影的位图平铺来填充封闭图形内部。 创建阴影画刷首先创建一个非初始化的CBrush对象,然后调用

18、CBrush: CreateHatchBrush()函数来初始化阴影画刷。 当使用阴影绘图时,Windows使用默认的背景颜色将阴影线段之间的空间填满。但是,若使用CDC:SetBkColor()函数改变了当前设备描述表的背景颜色,或者通过使用CDC:SetBkMode()函数从OPAQUE到TRANSPARENT改变背景模式,以便关闭背景填充时,这些默认值就被相应地改变了。276.4.3续22画刷类CBrush CBrush对象封装了Windows GDI刷子,并提供与CBrush对象一起工作的一些函数,如表6.6所示。3画刷工具的使用步骤(1)生成CBrush的实例。刷子以多种样式和颜色出

19、现在CBrush:CBrush(): CBrush( ); CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); 28表6.6画刷类CBrush的成员函数成员函数成员函数说明说明CreateBrushIndirect创建具有在LOGBRUSH结构内指定的样式、颜色和图案的刷子,并将它连接至CBrush对象CreateHatchBrush创建具有阴影线图案和颜色的刷子,并将它连接至CBrush对象CreateSolidBrush创建具有指定实线颜色的刷子,并将它连接至CBrush对象CreateSysColorBr

20、ush创建默认系统颜色刷子,并将它连接至CBrush对象FromHandle从Windows HBRUSH对象返回指向CBrush对象的指针Operator HBRUSH返回连接到CBrush对象的Windows句柄296.4.3续3上述函数的参数crColor指定刷子颜色;nIndex参数指定刷子图案,其值如表6.7所示。(2)调用相应的成员函数初始化刷子。(3)将所创建的画刷选入设备环境,同时保存原画刷对象的指针。(4)调用绘图函数生成图形。(5)恢复原先设备环境中的画刷。 4画刷工具的操作实例【例6-5】一个演示各种画刷的例子。首先利用MFC AppWizard(exe)创建一个新工程,

21、工程的名字为BrushTest,除了应用程序的类型选为单文档模式外,向导的每个操作步骤都采用缺省的。(1) 编辑视图类CBrushTestView的虚函数OnDraw,实现画刷工具的操作演示。(2)程序运行结果如图6.5所示。30void CBrushTestView:OnDraw(CDC* pDC)CBrushTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);int i;CBrush* pNewBrush,*pOldBrush; /定义一个新画刷和旧画刷的指针变量定义一个新画刷和旧画刷的指针变量/设置纯色画刷的颜色表设置纯色画刷的颜色表stru

22、cttagColor int r,g,b; color7=255,0,0,0,255,0,0,0,255,255,255,0,255,0,255,0,255,255;for(i=0;iCreateSolidBrush(RGB(colori.r, colori.g, colori.b)pOldBrush = pDC-SelectObject( pNewBrush ); /将新建的新画刷选入设备环境将新建的新画刷选入设备环境pDC-Rectangle(40,20+i*40,200,50+i*40);/绘制矩形绘制矩形pDC-SelectObject( pOldBrush );/恢复设备描述表中原有

23、画刷恢复设备描述表中原有画刷delete pNewBrush;/删除新画刷删除新画刷pDC-TextOut(100,20+i*40,_T(纯色画刷纯色画刷);31/实体画刷的图案索引值实体画刷的图案索引值int nBrushPattern6=HS_BDIAGONAL,HS_CROSS,HS_DIAGCROSS, HS_FDIAGONAL,HS_HORIZONTAL,HS_VERTICAL; /实体画刷的图案名称实体画刷的图案名称CString cBrush6=_T(HS_BDIAGONAL),_T(HS_CROSS),_T(HS_DIAGCROSS), _T(HS_FDIAGONAL), _T(HS_HORIZONTAL),_T(HS_VERTICAL); for(i=0;iCreateHatchBrush(nBrushPatterni,RGB(0,0,255) pOldBrush = pDC-SelectObject( pNewBrush );/选择新画刷选择新画刷pDC-Ellipse(260,20+i*40,420,50+i*40);/绘制椭圆绘制椭圆pDC-TextOut(440,50-20+i*40,cBrushi); /输出画刷的风格输出画刷的风格pDC-SelectObject( pOldBrush ); /恢复设备描述

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论