第8章:利用CDC实现绘图程序.ppt
《第8章:利用CDC实现绘图程序.ppt》由会员分享,可在线阅读,更多相关《第8章:利用CDC实现绘图程序.ppt(69页珍藏版)》请在三一办公上搜索。
1、第8章利用CDC实现绘图程序,8.1 图形绘制的基本知识 8.2 VC的文本操作 8.3 CDC的绘图操作 8.4 Windows绘图工具 习题,教学要点,本章内容包括设备环境与绘图程序的关系,设备环境主要功能以在MFC对应的CDC类,利用设备环境类CDC操纵文本(文本的字体、颜色和属性控制),利用设备环境类CDC实现简单图形的绘制(点、线、椭圆、矩形和弧等),各种绘图工具(画笔、画刷)使用。要求了解CDC编写的绘图程序调用GDI,进而调用设备驱动程序的流程,CDC的几个派生类及其使用,掌握CDC的文本操作和图形绘制、常见的绘图参数设置函数的用法、常见的绘图工具画笔和画刷的使用,熟练掌握调用A
2、PI或CDC成员函数选择库存中的绘图工具。,8.1图形绘制的基本知识,8.1.1 一个简单的图形程序8.1.2 图形操作的接口GDI8.1.3 图形操作有关的CDC类8.1.4 CDC的内容,8.1.1一个简单的图形程序,为了理解利用MFC编制图形程序的过程,也为了理解图形程序所用到的概念和原理,我们以一个简单的图形程序(仅仅用到了文本输出函数TextOut)为例,讲解程序的生成步骤及编写代码的步骤。该程序是利用MFCAppWizard向导生成的第一个程序,我们对MFC编程的初步理解是:首先掌握AppWizard向导生成的步骤,然后理解AppWizard生成的应用程序架构包含哪些主要类,最后知
3、道我们编写处理问题的代码放到MFC应用程序架构的什么地方。,【例8-1】利用MFC编写一个简单的绘图程序,1.利用AppWizard生成应用程序架构(1)启动VC6.0,选择“File”菜单的“New”命令,在弹出的“New”对话框中选择“Project”选项卡。在该选项卡的列表中选择“MFC AppWizard(exe)”项,在“Project Name”编辑框中输入要创建的工程名称SingleDraw,在“Location”编辑框中设置工程的存放位置,单击“OK”按钮。(2)在弹出的“MFC AppWizard-Step1”对话框中选择“single document”,即应用程序的类型为
4、单文档模式,然后单击“Finish”按钮。(3)在弹出的“New Project information”对话框中单击“OK”按钮,完成应用程序框架的创建。,【例8-1】续1,2应用程序架构包含的主要类 该程序主要包含的类有CAboutDlg关于对话框类、CMainFrame主框架类、CSingleDrawDoc文档类、CSingleDrawView视图类。有关绘制功能的实现,一般是在视图类中完成,因此,这一章的实例都是对视图类CSingleDrawView的操作。,【例8-1】续2,3将代码放到MFC的某个类的虚函数或消息映射函数中 绘图功能的实现,一般要超载视图类的OnDraw()虚函数,
5、打开WorkSpace的ClassView选项卡,展开CSingleDrawView视图类,可以看到该类中有一个虚函数OnDraw(),双击该函数,就把光标定位到该函数的实现处,在其中编写代码如下:void CSingleDrawView:OnDraw(CDC*pDC)CSingleDrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(100,100,“在视图类的 OnDraw虚函数中输出的最简单的一个图 形程序);,【例8-1】续3,4运行程序 编译并运行该程序(按Ctrl+F5热键),在屏幕上显示了一行文本。利用MFC的应用程序
6、向导,我们仅写了一行代码,就完成了一个简单的图形程序输出文本图形。从代码量上是简单了,但要理解整个图形程序的显示过程,却有许多工作要作,下面就围绕与图形输出有关的内容来讲解图形程序的编写过程和原理。,8.1.2 图形操作的接口GDI,任何图形程序的输出,都离不开图形设备接口GDI(Graphic Device Interface),它是管理Windows应用程序在窗口内的绘图操作和与此相关的许多其它信息。如图形设备(打印机、显示器)的信息、绘图的坐标系统和映射模式、绘图工具的当前状态(什么样的画笔、画刷、文本的前景色与背景色、文本所使用的字体)。Windows的GDI绘制的各种图形(点、线、圆
7、、多边形、矩形等)是与设备无关的,即在屏幕的窗口内绘图与在打印机上绘图是相似的。GDI是一个可执行程序,它接收Windows应用程序的绘图请求(表现为GDI调用),并将它们传送给相应的设备驱动程序,再由设备驱动程序驱动相应的硬件设备,如打印机或显示器输出。,8.1.2续,应用程序使用GDI可以对三种类型的图形进行操作:文本操作、矢量图形操作和光栅图形操作(图像操作)。文本操作是以逻辑坐标为单位来计算文本的输出位置,用户可以通过各种GDI函数来作出具有各种效果的文本。矢量图形指的是利用画点、直线、曲线(折线、贝塞尔曲线等)、多边形、扇形、矩形等函数所绘制的图形。光栅图形操作是指以光栅图形函数对以
8、位图形式存储的数据进行操作,它包括各种位图和图标的输出,其在屏幕上表现为对若干个行和列的像素操作。光栅图形操作是直接从内存到显存的拷贝操作,其缺点是需要额外的内存空间,优点是操作速度快。,8.1.3 图形操作有关的CDC类,1再论设备描述表 设备描述表是一个用来确定任何设备(如显示器、打印机)的GDI输出位置和内容属性的集合,是Windows系统下的一个保存GDI内部数据的数据结构,它与特定的显示设备相关。对于显示器,设备描述表总是与显示器上的特定窗口相关。设备描述表中保存了显示图形所需要的各种参数值,如显示颜色、显示坐标、显示方式和背景颜色。在Windows下程序员对所有的绘图功能的调用,都
9、是通过设备描述表来进行的。,8.1.3 续,2.类CDC CDC是后面所讲的其他DC类的基类。CDC基类定义了设备描述表对象,并且提供在显示器、打印机或Windows用户区上绘图的方法,它封装了使用设备环境的GDI函数。所有的绘图操作都是直接或间接运用了CDC的成员函数,这些函数有的进行设备描述表操作,有的是用来画图的,还有的函数是用来获取或设置绘图属性,为映像和视点服务的。在由AppWizard创建的MFC应用程序中,视图类的OnDraw成员函数是一个处理图形的关键虚函数,它带有一个指向设备环境对象的指针pDC,MFC的绘图成大多都是通过pDC这个指针来加以访问的。下面为CDC类的函数的分类
10、,8.1.4 CDC的内容,1派生类CPaintDCCPaintDC是从CDC派生出来的设备描述表类,它常常在窗口的OnPaint函数中使用。查看MFC的源代码(StudioVC98MFCSRCviewcore.cpp)中的OnPaint函数的实现可以知道,OnPaint函数首先构造一个CPaintDC对象,再调用OnPrepareDC()函数将其准备好,最后以这个准备好的CPaintDC对象指针为参数,来调用OnDraw函数进行各种图形处理。CPaintDC对象在构造时调用CWnd:BeginPaint函数,并返回DC用于绘图,在析构时自动调用CWnd:EndPaint函数释放DC。CPai
11、ntDC仅在WM_PAINT消息需要响应时才起作用,通常是在应用程序的OnPaint响应函数中使用。,8.1.4 续1,2派生类CClientDC(管理客户区)CClientDC类只能在客户区绘图。所谓客户区是指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等以外的部分,它是用户可以操作的区域。例如打开Word文档将是将某个.doc文件显示在其客户区域中。在使用CClientDC进行绘图时,一般要调用GetClientRect函数来获取客户区域的大小。CClientDC类由CDC派生而来,它使调用和释放设备环境的过程自动化。CClientDC对象在构造时调用Windows API函数Get
12、DC,在析构时调用响应的API函数ReleaseDC,这意味着与CClientDC对象相关的设备环境是窗口的客户区。CClientDC对象的窗口句柄保存在成员变量m_hWnd,为构造CClientDC,需将CWnd作为参数传递给构造函数。,8.1.4续2,3派生类CWindowDC(管理框架窗口)CWindowDC类直接从CDC派生,它使调用和释放整个窗口(包括客户区和非客户区)的设备环境过程自动化。CWindowDC对象在构造时调用Windows API函数GetWindowDC,在析构时调用相应的API函数ReleaseDC,这意味着CWindowtDC对象可访问CWnd所指向的整个屏幕区
13、域。CWindowDC允许在显示器的任意位置绘图,坐标原点在整个窗口的左上角。由于使用CWindowDC可以在整个窗口类绘图,这给了程序员很大的自由度,但使用不当会带来麻烦。在使用CWindowDC进行绘图时,一般要调用GetWindowRect函数来获取整个应用程序窗口区域的大小。CWindowDC对象的窗口句柄保存在成员变量m_hWnd,为构造CWindowDC,需将CWnd作为参数传递给构造函数。,8.2VC的文本操作,8.2.1文本输出函数 8.2.2文本属性控制 8.2.3文本的字体 8.2.4文本处理实例,8.2.1 文本输出函数,在前面的API编程5.5.2节中讲了一个最简单的文
14、本输出函数TextOut(),其实API编程模式和MFC编程模式的最大相似之处在于他们调用的API函数和MFC的成员函数的参数基本上一致,在MFC中出现了很多缺省参数,调用起来更简单,但他们的核心参数都是一样的,因此掌握了某一个API函数的用法,在利用MFC编程时,用法基本一致。API编程模式和MFC编程模式的最大不同在于其程序的框架不一样,可以说,API编程模式的程序框架操作系统已经定义好了,这个框架是最原始的操作系统框架,熟悉该框架比较容易,但框架内部需要自己做的工作还很多;而MFC是一个应用程序框架,是构建在操作系统之上的一个应用程序框架。,8.2.1 续1,文本输出除了前面讲的Text
15、Out()外,常见的还有ExtTextOut():该函数的原型为:BOOL ExtTextOutint x,int y;/输出的位置UINT nOptions;/指定矩形的类型LPCRECT lpRect;/输出的字符的矩形区域const CString 该函数用来在一个给定的矩形lpRect区域内输出字符串str,此矩形可以设置为透明的(nOptions=ETO_OPAQUE)或不透明的,当矩形区域为不透明时,用当前的背景色填充矩形。,8.2.1 续2,此矩形也可以设置为裁剪(nOptions=ETO_CLIPPED)性质或非裁剪性质,当设置为裁剪性质时,所有在矩形外面的字符串将被裁剪掉。上
16、述参数中,nOptions主要设置矩形的类型,可以为ETO_OPAQUE和ETO_CLIPPED两个值的一个或两个组合;lpDxWidths是一个指向整数数组的指针,此数组中存放以逻辑单位表示的字符间的距离,第n个数代表第n个和n+1个字符之间的距离。该参数为NULL时,则按缺省值处理。,8.2.2 文本属性控制,1 设置文本的背景色 缺省时,在绘制图形或者输出文本时,背景颜色是白色。可以使用CDC的成员函数SetBkColor函数来设置新的背景颜色,函数原型为:Virtual COLORREF SetBkColor(COLORREF crcolor);其中参数crcolor用于指定新的背景颜
17、色。例如要将背景颜色设为红色,可以用以下语句:SetBkColor(RGB(255,0,0);,8.2.2续1,2控制文本的背景色 在设备描述表中有两项可以影响背景,一个是背景色,另一个是背景模式。背景模式可以为透明的(Transparent)或不透明的(Opaque),缺省为不透明的。当背景模式为不透明时,按背景颜色的值填充字符的空余部分,如果背景模式为透明的,将不用背景颜色填充,保留屏幕上原来的颜色。背景模式可用函数SetBkMode来设置,它设置当前的背景模式并返回原来的背景模式,该函数的原型为:int SetBkMode(int nBkMode);参数nkbmode指定背景模式,其值可
18、以是OPAQUE或者TRANSPARENT,如果值为OPAQUE,则显示时背景都改变为当前背景颜色。如果值为TRANSPARENT,则不改变背景颜色,此时,任何SetBkColor函数调用都无效,缺省的背景模式为OPAQUE。,8.2.2续2,3设置文本的排列方式 在文本显示时遇到的另一个问题是文本的排列方式,它控制文本和给定点的相对位置。在一个图形中加字符说明时,常常知道一个字符串的某一个边界,如左边界不应超过某个位置,或右边界不应超过某个位置,或显示的几行字符串的中心点对齐等。利用CDC的成员函数SetTextAlign函数就能方便地实现这种控制,其原型为:UINT SetTextAlig
19、n(UINT nFlags);其中,nFlags为文本的对齐方式,其值如下:TA_LEFT 将点同边界矩形的水平中心对齐TA_BASELINES将点同所选字体的基线对齐TA_BOTTOM将点同边界矩形的底线对齐,8.2.3文本的字体,字体反映了字符外观特性,如汉字有宋体、楷体、黑体等,西文也有字体如Arial、Roman等,同一个字符以不同的字体输出时外观会不太一样。VC提供了丰富的字体控制功能,不仅可以使用Windows提供的字体,还可以自己创建字体,这使得Windows下文本输出具有很大的灵活性,可以随心所欲,最大限度地满足用户对复杂文本的输出要求。可以这样说,Word字处理程序所能应用的
20、有关字体的功能,在设备环境中都能给以支持。,8.2.3续1,1使用库存字体 Windows系统本身提供了一些库存字体,对于大多数应用程序,使用库存字体即可完成基本的文本输出功能。要想使用库存字体,需要使用CDC的成员函数SelectStockObject()来完成,例如:SelectStockObject(OEM_FIXED_FONT);该语句把终端字体选入设备环境,这样,用TextOut或TextOutEx输出文本时,将使用DOS命令窗口的字体。其实,每个设备环境都有一个缺省字体,对于显示器而言,缺省字体就是SYSTEM_FONT系统字体,如果应用程序不需要执行很复杂的文本输出,使用缺省字体
21、即可。,Windows库存字体,8.2.3续2,2使用自定义逻辑字体 逻辑字体是用和设备无关的方式来描述一个字体,它使用通用的术语来描述一个字符的宏观特性(如高度、宽度、旋转角度、是否有下划线等),但它不能描述微观特性,没有足够的信息来显示字体,是从应用的角度描述一个字体,因为在应用时没有必要把字体的细微结构都描述出来,这会使使用变得很繁琐,这些细节由物体字体描述。我们使用时用逻辑字体来描述需要的文本,GDI根据逻辑字体的描述选配最接近的物理字体,由物理字体进行输出。MFC提供的CFont类封装了逻辑字体。创建自定义字体并不是创建一种新的字体,而是创建一种逻辑字体。逻辑字体是一种字体属性的列表
22、,如高度、宽度、字符集和字样等。字体映射器按逻辑字体给出的字体特性选择与之匹配的物理字体,8.2.3续3,要创建字体,首先要声明一个CFont对象来表示逻辑字体,然后初始化CFont对象。常见的初始化方法有以下几种:(1)用CFont的成员函数CreatePointFont直接创建逻辑字体,函数原型为:BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFaceName,CDC*pDC=NULL);其中,字体的高度由nPointSize 指定,它以1/10点数为一个单位。例如如该值为100,则字体的高度为10点(1点=0.013837英寸),字体的名
23、称由lpszFaceName指定。下面为使用该函数的典型代码:CClientDC dc(this);/声明客户区设备环境变量dcCFont font;/声明逻辑字体变量fontfont.CreatePointFont(120,Arial,/初始化逻辑字体font,8.2.3续4,CFont*def_font=dc.SelectObject(该函数的参数较多,功能较强,自己查阅MSDN进行分析,我们只需要掌握第一种方法即可。,8.2.4 文本处理实例,【例8-2】利用MFC编写文本处理的应用程序。1程序功能描述 使用库存字体和自定义字体,设置文本的前景色、背景色、对齐方式、背景模式,利用Text
24、Out和ExtTextOut函数在屏幕上输出文本。2利用MFC AppWizard(exe)创建程序步骤(1)运行VC6.0,在File菜单中选择New命令,在打开的New对话框中选中Projects标签,在左边的列表框中选择MFC AppWizard(exe)选项,在右边的Project name文本框中输入工程名TextTest,并选择合适的路径。,【例8-2】续1,(2)单击OK按钮,启动AppWizard,在第一步中选择Single Document单选按钮。(3)从第2步到第6步使用缺省选项,最后生成工程TextTest。3编辑视图类CTextTestView 中的OnDraw函数,
25、实现文本的各种属性控制及输出。附CTextTestView.txt,8.3CDC的绘图操作,8.3.1 画点与画线函数操作 8.3.2 绘制封闭图形 8.3.3 设置绘图参数8.3.4 绘图模式 8.3.5 绘图操作实例,8.3.1 画点与画线函数操作,1画点 CDC的成员函数SetPixel用来在指定位置上绘制一个特定的像素点,其原型为:COLORREF SetPixel(POINT point,COLORREF crColor);其中参数point指定所绘制的点,crColor指定画点所用的颜色。倘若要在屏幕的(100,100)处画一个红色点,则代码为:pDC-SetPixel(CPoin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 CDC 实现 绘图 程序
链接地址:https://www.31ppt.com/p-5669771.html