资源预览内容
第1页 / 共69页
第2页 / 共69页
第3页 / 共69页
第4页 / 共69页
第5页 / 共69页
第6页 / 共69页
第7页 / 共69页
第8页 / 共69页
第9页 / 共69页
第10页 / 共69页
亲,该文档总共69页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 利用CDC实现绘图程序,8.1 图形绘制的基本知识 8.2 VC的文本操作 8.3 CDC的绘图操作 8.4 Windows绘图工具 习题,教学要点,本章内容包括设备环境与绘图程序的关系,设备环境主要功能以在MFC对应的CDC类,利用设备环境类CDC操纵文本(文本的字体、颜色和属性控制),利用设备环境类CDC实现简单图形的绘制(点、线、椭圆、矩形和弧等),各种绘图工具(画笔、画刷)使用。 要求了解CDC编写的绘图程序调用GDI ,进而调用设备驱动程序的流程,CDC的几个派生类及其使用,掌握CDC的文本操作和图形绘制、常见的绘图参数设置函数的用法、常见的绘图工具画笔和画刷的使用,熟练掌握调用API或CDC成员函数选择库存中的绘图工具。,8.1 图形绘制的基本知识,8.1.1 一个简单的图形程序 8.1.2 图形操作的接口GDI 8.1.3 图形操作有关的CDC类 8.1.4 CDC的内容,8.1.1 一个简单的图形程序,为了理解利用MFC编制图形程序的过程,也为了理解图形程序所用到的概念和原理,我们以一个简单的图形程序(仅仅用到了文本输出函数TextOut)为例,讲解程序的生成步骤及编写代码的步骤。该程序是利用MFCAppWizard向导生成的第一个程序,我们对MFC编程的初步理解是:首先掌握AppWizard向导生成的步骤,然后理解AppWizard生成的应用程序架构包含哪些主要类,最后知道我们编写处理问题的代码放到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”,即应用程序的类型为单文档模式,然后单击“Finish”按钮。 (3)在弹出的“New Project information” 对话框中单击“OK”按钮,完成应用程序框架的创建。,【例8-1】续1,2应用程序架构包含的主要类 该程序主要包含的类有CAboutDlg关于对话框类、CMainFrame主框架类、CSingleDrawDoc文档类、CSingleDrawView视图类。 有关绘制功能的实现,一般是在视图类中完成,因此,这一章的实例都是对视图类CSingleDrawView的操作。,【例8-1】续2,3将代码放到MFC的某个类的虚函数或消息映射函数中 绘图功能的实现,一般要超载视图类的OnDraw()虚函数,打开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的应用程序向导,我们仅写了一行代码,就完成了一个简单的图形程序输出文本图形。 从代码量上是简单了,但要理解整个图形程序的显示过程,却有许多工作要作,下面就围绕与图形输出有关的内容来讲解图形程序的编写过程和原理。,8.1.2 图形操作的接口GDI,任何图形程序的输出,都离不开图形设备接口GDI(Graphic Device Interface),它是管理Windows应用程序在窗口内的绘图操作和与此相关的许多其它信息。如图形设备(打印机、显示器)的信息、绘图的坐标系统和映射模式、绘图工具的当前状态(什么样的画笔、画刷、文本的前景色与背景色、文本所使用的字体)。 Windows的GDI绘制的各种图形(点、线、圆、多边形、矩形等)是与设备无关的,即在屏幕的窗口内绘图与在打印机上绘图是相似的。 GDI是一个可执行程序,它接收Windows应用程序的绘图请求(表现为GDI调用),并将它们传送给相应的设备驱动程序,再由设备驱动程序驱动相应的硬件设备,如打印机或显示器输出。,8.1.2续,应用程序使用GDI可以对三种类型的图形进行操作:文本操作、矢量图形操作和光栅图形操作(图像操作)。 文本操作是以逻辑坐标为单位来计算文本的输出位置,用户可以通过各种GDI函数来作出具有各种效果的文本。 矢量图形指的是利用画点、直线、曲线(折线、贝塞尔曲线等)、多边形、扇形、矩形等函数所绘制的图形。 光栅图形操作是指以光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出,其在屏幕上表现为对若干个行和列的像素操作。光栅图形操作是直接从内存到显存的拷贝操作,其缺点是需要额外的内存空间,优点是操作速度快。,8.1.3 图形操作有关的CDC类,1再论设备描述表 设备描述表是一个用来确定任何设备(如显示器、打印机)的GDI输出位置和内容属性的集合,是Windows系统下的一个保存GDI 内部数据的数据结构,它与特定的显示设备相关。对于显示器,设备描述表总是与显示器上的特定窗口相关。设备描述表中保存了显示图形所需要的各种参数值,如显示颜色、显示坐标、显示方式和背景颜色。在Windows下程序员对所有的绘图功能的调用,都是通过设备描述表来进行的。,8.1.3 续,2. 类CDC CDC是后面所讲的其他DC类的基类。CDC基类定义了设备描述表对象, 并且提供在显示器、打印机或Windows用户区上绘图的方法,它封装了使用设备环境的GDI函数。 所有的绘图操作都是直接或间接运用了CDC的成员函数,这些函数有的进行设备描述表操作,有的是用来画图的,还有的函数是用来获取或设置绘图属性,为映像和视点服务的。 在由AppWizard创建的MFC应用程序中,视图类的OnDraw成员函数是一个处理图形的关键虚函数,它带有一个指向设备环境对象的指针pDC,MFC的绘图成大多都是通过pDC这个指针来加以访问的。 下面为CDC类的函数的分类,8.1.4 CDC的内容,1派生类CPaintDC CPaintDC是从CDC派生出来的设备描述表类,它常常在窗口的OnPaint函数中使用。查看MFC的源代码(StudioVC98MFCSRCviewcore.cpp)中的OnPaint函数的实现可以知道,OnPaint函数首先构造一个CPaintDC对象,再调用OnPrepareDC()函数将其准备好,最后以这个准备好的CPaintDC对象指针为参数,来调用OnDraw函数进行各种图形处理。 CPaintDC对象在构造时调用CWnd:BeginPaint函数,并返回DC用于绘图,在析构时自动调用CWnd:EndPaint函数释放DC。CPaintDC仅在WM_PAINT消息需要响应时才起作用,通常是在应用程序的OnPaint响应函数中使用。,8.1.4 续1,2派生类CClientDC(管理客户区) CClientDC类只能在客户区绘图。所谓客户区是指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等以外的部分,它是用户可以操作的区域。例如打开Word文档将是将某个.doc文件显示在其客户区域中。在使用CClientDC进行绘图时,一般要调用GetClientRect函数来获取客户区域的大小。 CClientDC类由CDC派生而来,它使调用和释放设备环境的过程自动化。CClientDC对象在构造时调用Windows API函数GetDC, 在析构时调用响应的API函数ReleaseDC,这意味着与CClientDC对象相关的设备环境是窗口的客户区。 CClientDC对象的窗口句柄保存在成员变量m_hWnd,为构造CClientDC,需将CWnd作为参数传递给构造函数。,8.1.4续2,3派生类CWindowDC(管理框架窗口) CWindowDC类直接从CDC派生,它使调用和释放整个窗口(包括客户区和非客户区)的设备环境过程自动化。CWindowDC对象在构造时调用Windows API函数GetWindowDC, 在析构时调用相应的API函数ReleaseDC,这意味着CWindowtDC对象可访问CWnd所指向的整个屏幕区域。 CWindowDC允许在显示器的任意位置绘图,坐标原点在整个窗口的左上角。由于使用CWindowDC可以在整个窗口类绘图,这给了程序员很大的自由度,但使用不当会带来麻烦。在使用CWindowDC进行绘图时,一般要调用GetWindowRect函数来获取整个应用程序窗口区域的大小。 CWindowDC对象的窗口句柄保存在成员变量m_hWnd,为构造CWindowDC,需将CWnd作为参数传递给构造函数。,8.2 VC的文本操作,8.2.1 文本输出函数 8.2.2 文本属性控制 8.2.3 文本的字体 8.2.4 文本处理实例,8.2.1 文本输出函数,在前面的API编程5.5.2节中讲了一个最简单的文本输出函数TextOut(),其实API编程模式和MFC编程模式的最大相似之处在于他们调用的API函数和MFC的成员函数的参数基本上一致,在MFC中出现了很多缺省参数,调用起来更简单,但他们的核心参数都是一样的,因此掌握了某一个API函数的用法,在利用MFC编程时,用法基本一致。API编程模式和MFC编程模式的最大不同在于其程序的框架不一样,可以说,API编程模式的程序框架操作系统已经定义好了,这个框架是最原始的操作系统框架,熟悉该框架比较容易,但框架内部需要自己做的工作还很多;而MFC是一个应用程序框架,是构建在操作系统之上的一个应用程序框架。,8.2.1 续1,文本输出除了前面讲的TextOut()外,常见的还有ExtTextOut(): 该函数的原型为: BOOL ExtTextOut int x, int y; /输出的位置 UINT nOptions;/指定矩形的类型 LPCRECT lpRect;/输出的字符的矩形区域 const CString 该函数用来在一个给定的矩形lpRect区域内输出字符串str,此矩形可以设置为透明的(nOptions=ETO_OPAQUE)或不透明的,当矩形区域为不透明时,用当前的背景色填充矩形。,8.2.1 续2,此矩形也可以设置为裁剪(nOptions=ETO_CLIPPED)性质或非裁剪性质,当设置为裁剪性质时,所有在矩形外面的字符串将被裁剪掉。 上述参数中,nOptions主要设置矩形的类型,可以为ETO_OPAQUE和ETO_CLIPPED两个值的一个或两个组合;lpDxWidths是一个指向整数数组的指针,此数组中存放以逻辑单位表示的字符间的距离,第n个数代表第n个和n+1个字符之间的距离。该参数为NULL时,则按缺省值处理。,8.2.2 文本属性控制,1 设置文本的背景色 缺省时,在绘制图形或者输出文本时,背景颜色是白色。可以使用CDC的成员函数SetBkColor函数来设置新的背景颜色,函数原型为: Virtual COLORREF SetBkColor(COLORREF crcolor); 其中参数crcolor用于指定新的背景颜色。例如要将背景颜色设为红色,可以用以下语句: SetBkColor(RGB(255,0,0);,8.2.2续1,2控制文本的背景色 在设备描述表中有两项可
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号