西北工业大学 第8章利用CDC实现绘图程序_第1页
西北工业大学 第8章利用CDC实现绘图程序_第2页
西北工业大学 第8章利用CDC实现绘图程序_第3页
西北工业大学 第8章利用CDC实现绘图程序_第4页
西北工业大学 第8章利用CDC实现绘图程序_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

1、Visual C+Visual C+第第8章章 利用利用CDC类实现绘图程序类实现绘图程序学习目标:学习目标:n了解了解MFC类库中实现绘图功能的类类库中实现绘图功能的类: 设备环设备环境类境类(CDC,C Device Context类)类)n学会使用学会使用CDC类中文本的输出函数类中文本的输出函数 (包括文本的字体、颜色和属性控制)(包括文本的字体、颜色和属性控制)n掌握掌握CDC类中绘制图形的函数类中绘制图形的函数 (包括点、线、椭圆、矩形和弧等)(包括点、线、椭圆、矩形和弧等)n掌握掌握CDC类中各种绘图工具类中各种绘图工具(画笔、画刷)(画笔、画刷) 的使用的使用n掌握位图的使用掌

2、握位图的使用 Visual C+Visual C+ 主要内容主要内容 8.1 图形绘制的基本知识图形绘制的基本知识 8.2 CDC的文本输出操作的文本输出操作 8.3 CDC的绘图操作的绘图操作 8.4 Windows绘图工具绘图工具 8.5 位图的加载与显示位图的加载与显示Visual C+Visual C+8.1.18.1.1一个简单的图形程序一个简单的图形程序 MFC绘制图形程序的过程:绘制图形程序的过程: 首先首先利用利用MFC AppWizard向导生成应向导生成应用程序框架用程序框架(哪些类哪些类);编写界面绘图的代码编写界面绘图的代码,放到放到MFC应用程序应用程序架构中。架构中

3、。(注意添加代码的位置(注意添加代码的位置) )Visual C+Visual C+【例【例8-1】利用】利用MFC编写一个简单的绘图程序编写一个简单的绘图程序1.利用利用AppWizard生成应用程序架构生成应用程序架构(1)启动)启动VC6.0,选择选择“File”菜单的菜单的“New”命令,在命令,在弹出的弹出的“New”对话框中选择对话框中选择“Project”选项卡。在该选项卡。在该选项卡的列表中选择选项卡的列表中选择“MFC AppWizard(exe)”项,在项,在“Project Name”编辑框中输入要创建的工程名称编辑框中输入要创建的工程名称SingleDraw,在在“Lo

4、cation”编辑框中设置工程的存编辑框中设置工程的存放位置,单击放位置,单击“OK”按钮。按钮。(2)在弹出的)在弹出的“MFC AppWizard-Step1” 对话框中选对话框中选择择“single document”,即应用程序的类型为单文档即应用程序的类型为单文档模式,然后单击模式,然后单击“Finish”按钮。按钮。(3)在弹出的)在弹出的“New Project information” 对话框中对话框中单击单击“OK”按钮,完成应用程序框架的创建。按钮,完成应用程序框架的创建。 Visual C+Visual C+ 2应用程序架构包含的主要类应用程序架构包含的主要类 该程序主要

5、包含的类有该程序主要包含的类有CAboutDlg关关于对话框类、于对话框类、CMainFrame主框架类、主框架类、CSingleDrawDoc文档类、文档类、CSingleDrawView视图类。视图类。 有关绘制功能的实现,一般是在视图类有关绘制功能的实现,一般是在视图类中完成,因此,这一章的实例都是对视中完成,因此,这一章的实例都是对视图类图类CSingleDrawView的操作。的操作。 Visual C+Visual C+ 3将代码放到将代码放到MFC的某个类的虚函数或消息映的某个类的虚函数或消息映射函数中射函数中 绘图功能的实现,一般要超载视图类的绘图功能的实现,一般要超载视图类的

6、OnDraw()虚函数,虚函数,打开打开WorkSpace的的ClassView选项卡,展开选项卡,展开CSingleDrawView视图类,可以看到视图类,可以看到该类中有一个虚该类中有一个虚函数函数OnDraw(),双击该函数,就把光标定位到该函数双击该函数,就把光标定位到该函数的实现处,在其中编写代码如下:的实现处,在其中编写代码如下: void CSingleDrawView:OnDraw(CDC* pDC)CSingleDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(100,100,“在视图类的在视图类的 On

7、Draw虚函数中输出的最简单的一个图虚函数中输出的最简单的一个图 形程序形程序); Visual C+Visual C+4运行程序运行程序 编译并运行该程序(按编译并运行该程序(按Ctrl+F5热键),热键),在屏幕上显示了一行文本。利用在屏幕上显示了一行文本。利用MFC的应用程序的应用程序向导,我们仅写了一行代码,就完成了一个简单向导,我们仅写了一行代码,就完成了一个简单的图形程序的图形程序输出文本图形。输出文本图形。 Visual C+Visual C+8.1.2 图形操作的接口图形操作的接口GDI Windows中绘制的各种图形(点、线、中绘制的各种图形(点、线、圆、多边形、矩形等)都是

8、与设备无关的圆、多边形、矩形等)都是与设备无关的,即在屏幕的窗口内绘图与在打印机上绘图即在屏幕的窗口内绘图与在打印机上绘图是相似的。是相似的。 GDI(Graphic Device Interface)是是Windows提供的绘图接口,它接收应用程提供的绘图接口,它接收应用程序的绘图请求(表现为序的绘图请求(表现为GDI调用),并将它调用),并将它们传送给相应的设备驱动程序,再由设备们传送给相应的设备驱动程序,再由设备驱动程序驱动相应的硬件设备,如打印机驱动程序驱动相应的硬件设备,如打印机或显示器输出。或显示器输出。Visual C+Visual C+8.1.3 MFC中的中的CDC类类 1.

9、 MFC中的中的CDC类类 CDC (C Device Context)类类它封装了它封装了GDI函数函数。所有的绘图操作都是。所有的绘图操作都是直接或间接运用了直接或间接运用了CDC的的成员函数成员函数,这些函数有的是用来画图的,有的函数是,这些函数有的是用来画图的,有的函数是用来获取或设置绘图属性。用来获取或设置绘图属性。 在由在由AppWizard创建的创建的MFC应用程序中,视图类的应用程序中,视图类的OnDraw成员函数是一个处理图形的函数,它带有一成员函数是一个处理图形的函数,它带有一个指向设备环境对象的指针个指向设备环境对象的指针pDC,MFC的绘图成大多的绘图成大多都是通过都是

10、通过pDC这个指针来加以访问的。这个指针来加以访问的。 Visual C+Visual C+2设备描述表(设备描述表(Device Context) 设备描述表是设备描述表是Windows系统下的一系统下的一个数据结构,用来保存显示图形所需要的个数据结构,用来保存显示图形所需要的各种参数值,如显示颜色、显示坐标、显各种参数值,如显示颜色、显示坐标、显示方式和背景颜色。示方式和背景颜色。Visual C+Visual C+CDCCDC类成员函数分类类成员函数分类 用途用途 位图函数位图函数 操作位图和像素的函数操作位图和像素的函数 剪裁函数剪裁函数 定义和操作剪裁设备边界的函数定义和操作剪裁设备

11、边界的函数坐标函数坐标函数 在物理设备和逻辑设备之间转换的函数在物理设备和逻辑设备之间转换的函数 设备描述表函数设备描述表函数 获取有关获取有关DCDC及其属性信息的函数及其属性信息的函数绘图属性函数绘图属性函数 为为DCDC获取和设置颜色及模式的函数获取和设置颜色及模式的函数 绘图工具函数绘图工具函数 枚举在枚举在DCDC中可用的笔和刷子的函数中可用的笔和刷子的函数 椭圆和多边形函数椭圆和多边形函数绘制椭圆和多边形函数绘制椭圆和多边形函数字体函数字体函数 获取字体属性的函数获取字体属性的函数线输出函数线输出函数在在DCDC上绘制线的函数上绘制线的函数映像函数映像函数创建、获取和控制原点,扩展

12、窗口和视及为创建、获取和控制原点,扩展窗口和视及为DCDC获取和设置映像模式的函数获取和设置映像模式的函数区域函数区域函数 填充区域和控制区域颜色的函数填充区域和控制区域颜色的函数 简单绘图函数简单绘图函数提供简单矩形和图标的绘制特性函数提供简单矩形和图标的绘制特性函数 文本函数文本函数 输出文本并获取输出文本并获取DCDC当前选中的字体信息的函数当前选中的字体信息的函数 Visual C+Visual C+8.1.4 CDC的派生子类的派生子类CObjectCObjectCDCCDCCPaintDCCPaintDCCClientDCCClientDCCWindowDC CWindowDC C

13、MetaFileDCCMetaFileDCVisual C+Visual C+8.1.4 CDC的派生子类的派生子类 1派生类派生类CPaintDC(客户区客户区)CPaintDC是从是从CDC派生出来的类,它代表了派生出来的类,它代表了应用程序窗口的客户区。一般用在应用程序窗口的客户区。一般用在CView类的类的OnDraw函数中进行各种图形处理,该函数声函数中进行各种图形处理,该函数声明为:明为:OnDraw(CDC* pDC)应用程序窗口在每次创建及刷新时都会发送应用程序窗口在每次创建及刷新时都会发送WM_PAINT消息,该消息将自动调用响应函消息,该消息将自动调用响应函数数OnDraw

14、(CDC* pDC ),),这个这个pDC指针就是指向指针就是指向CPaintDC对象的指针,在函数中就可以调用该类的成对象的指针,在函数中就可以调用该类的成员函数来绘制图形了员函数来绘制图形了。Visual C+Visual C+ 2派生类派生类CClientDC(客户区客户区) CClientDC类由类由CDC派生而来,派生而来, 也只能在客户区也只能在客户区绘图绘图。除了可以响应。除了可以响应WM_PAINT消息外,还可消息外,还可以响应其他消息,包括用户定义的消息。以响应其他消息,包括用户定义的消息。 在使用在使用CClientDC类进行绘图时,一般要调用类进行绘图时,一般要调用Get

15、ClientRect()函数来获取客户区域的大小。函数来获取客户区域的大小。Visual C+Visual C+ 3派生类派生类CWindowDC(整个窗口整个窗口) CWindowDC类直接从类直接从CDC派生,该类可以在派生,该类可以在显示器的任意位置绘图(包括客户区和非客户区)显示器的任意位置绘图(包括客户区和非客户区) ,坐标原点在整个窗口的左上角坐标原点在整个窗口的左上角。由于使用。由于使用CWindowDC可以在整个窗口类绘图,这给了程序可以在整个窗口类绘图,这给了程序员很大的自由度,但使用不当会带来麻烦。员很大的自由度,但使用不当会带来麻烦。 在使用在使用CWindowDC进行绘

16、图时,一般要调用进行绘图时,一般要调用GetWindowRect函数来获取整个应用程序窗口区函数来获取整个应用程序窗口区域的大小。域的大小。 Visual C+Visual C+ 4派生类派生类CMetaFileDC(图元文件)(图元文件) CWindowDC类直接从类直接从CDC派生,该类用在创派生,该类用在创建与设备无关的并且可以回放的图像时使用。建与设备无关的并且可以回放的图像时使用。 Visual C+Visual C+8.2 VC的文本操作的文本操作 文本输出函数文本输出函数 文本属性控制文本属性控制 文本的字体文本的字体 文本处理实例文本处理实例Visual C+Visual C+

17、1 文本输出函数文本输出函数1 1)文本输出函数)文本输出函数TextOutTextOut()()函数原型:函数原型: BOOL TextOut( HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString);功能功能:在屏幕的指定位置处显示字符串。:在屏幕的指定位置处显示字符串。参数说明:参数说明:hdchdc是设备环境句柄,是设备环境句柄,nXStartnXStart与与n Y S t a r tn Y S t a r t 为 指 定 正 文 开 始 绘 制 的 逻 辑 坐 标为 指 定 正 文 开 始 绘 制 的 逻

18、 辑 坐 标 , , lpStringlpString是包含将绘制的正文字符串,是包含将绘制的正文字符串,cbStringcbString为为待输出的文本中所含字符的个数待输出的文本中所含字符的个数。Visual C+Visual C+2.在给定的矩形区域内的文本输出函数在给定的矩形区域内的文本输出函数BOOL ExtTextOut( int x, int y; /输出的位置输出的位置 UINT nOptions;/指定矩形的类型指定矩形的类型 LPCRECT lpRect;/输出的字符的矩形区域输出的字符的矩形区域 const CString& str;/欲输出的字符欲输出的字符 L

19、PINT lpDxWidths ;/字符间距字符间距);功能说明:功能说明:该函数用来在一个给定的矩形该函数用来在一个给定的矩形lpRect区区域内输出字符串域内输出字符串str,此矩形可以设置为透明的(此矩形可以设置为透明的(nOptions=ETO_OPAQUE)或不透明的,当矩形或不透明的,当矩形区域为不透明时,用当前的背景色填充矩形。区域为不透明时,用当前的背景色填充矩形。Visual C+Visual C+8.2.2 文本属性控制文本属性控制 1 设置文本的背景色函数设置文本的背景色函数SetBkColor()()缺省时,文本和绘图的背景颜色是白色。缺省时,文本和绘图的背景颜色是白色

20、。SetBkColor函数可以设置新的背景颜色,函数可以设置新的背景颜色,函数原型为:函数原型为: Virtual COLORREF SetBkColor(COLORREF crcolor); 其中,参数其中,参数crcolor用于指定新的背景颜色。用于指定新的背景颜色。例如:要将背景颜色设为红色,可以用以下语例如:要将背景颜色设为红色,可以用以下语句:句: SetBkColor(RGB(255,0,0);Visual C+Visual C+ 2控制文本的背景色控制文本的背景色可用函数可用函数SetBkMode来设置背景模式,它设置来设置背景模式,它设置当前的背景模式并返回原来的背景模式,该函

21、数当前的背景模式并返回原来的背景模式,该函数的原型为:的原型为: int SetBkMode(int nBkMode); 参数参数nkbmode指定背景模式,其值可以是指定背景模式,其值可以是OPAQUE或者或者TRANSPARENT,如果值为如果值为OPAQUE,则显示时背景都改变为当前背景颜色。则显示时背景都改变为当前背景颜色。如果值为如果值为TRANSPARENT,则不改变背景颜色则不改变背景颜色.Visual C+Visual C+ 3设置文本的排列方式设置文本的排列方式利用利用CDC的成员函数的成员函数SetTextAlign函数实现文函数实现文本的排列方式,函数原型为:本的排列方式

22、,函数原型为: UINT SetTextAlign (UINT nFlags); 其中,其中,nFlags为文本的对齐方式,其值如下:为文本的对齐方式,其值如下:TA_LEFT 将点同边界矩形的水平中心对齐将点同边界矩形的水平中心对齐TA_BASELINES 将点同所选字体的基线对将点同所选字体的基线对TA_BOTTOM 将点同边界矩形的底线对齐将点同边界矩形的底线对齐 Visual C+Visual C+ 4设置文本的字体颜色设置文本的字体颜色 利用利用CDC的成员函数的成员函数SetTextColor函数实现设函数实现设置文本的字体颜色,函数原型为:置文本的字体颜色,函数原型为: virt

23、ual COLORREF SetTextColor( COLORREF crColor ); 其中,其中, crColor 为为RGB颜色值颜色值例如:将字体设为蓝色例如:将字体设为蓝色 SetTextColor(RGB(0,0,255);Visual C+Visual C+8.2.3文本的字体文本的字体 字体反映了字符外观特性,如汉字有宋体、字体反映了字符外观特性,如汉字有宋体、楷体、黑体等,西文也有字体如楷体、黑体等,西文也有字体如Arial、Roman等,等,同一个字符以不同的字体输出时同一个字符以不同的字体输出时外观会不太一样外观会不太一样。VC提供了丰富的字体控制提供了丰富的字体控制

24、功能,不仅功能,不仅可以使用可以使用Windows提供的字体,提供的字体,还可以自己创建字体还可以自己创建字体,这使得,这使得Windows下文下文本输出具有很大的灵活性,可以最大限度地满本输出具有很大的灵活性,可以最大限度地满足用户对复杂文本的输出要求。足用户对复杂文本的输出要求。Visual C+Visual C+8.2.3续续1 1使用库存字体使用库存字体 Windows系统本身提供了一些库存字体,对于大多系统本身提供了一些库存字体,对于大多数应用程序,使用库存字体即可完成基本的文本输出功数应用程序,使用库存字体即可完成基本的文本输出功能。能。 要想使用库存字体,需要使用要想使用库存字体

25、,需要使用CDC的成员函数的成员函数SelectStockObject()来完成,例如:来完成,例如: SelectStockObject(OEM_FIXED_FONT); 该语句把终端字体选入设备环境,这样,用该语句把终端字体选入设备环境,这样,用TextOut输出文本时,将使用输出文本时,将使用DOS命令窗口的字体。命令窗口的字体。其实,每个设备环境都有一个缺省字体,对于显示器其实,每个设备环境都有一个缺省字体,对于显示器而言,缺省字体就是而言,缺省字体就是SYSTEM_FONT系统字体,如系统字体,如果应用程序不需要执行很复杂的文本输出,使用缺省果应用程序不需要执行很复杂的文本输出,使用

26、缺省字体即可。字体即可。Visual C+Visual C+字体名称字体名称 说明说明ANSI_FIXED_FONANSI_FIXED_FONTT 基于基于WindowsWindows字符集的固定字宽的字体,通常使用字符集的固定字宽的字体,通常使用CourierCourier字体字体 ANSI_VAR_FONTANSI_VAR_FONT基于基于WindowsWindows字符集的变宽字体,通常使用字符集的变宽字体,通常使用Ms Sans SerifMs Sans Serif字体字体 DEVICE_DEFAULT_DEVICE_DEFAULT_FONTFONT特定设备的缺省字体。该字体取决于特定

27、设备的缺省字体。该字体取决于GDIGDI字体的映射程序如何字体的映射程序如何解释字体请求,因此对于不同的设备,其字体宽度可能不同解释字体请求,因此对于不同的设备,其字体宽度可能不同 OEM_FIXED_FONTOEM_FIXED_FONTWindowsWindows在在DOSDOS命令提示窗口中使用的字体,又称终端字体,它命令提示窗口中使用的字体,又称终端字体,它是一种固定宽度的字体,随系统的不同而不同是一种固定宽度的字体,随系统的不同而不同 SYSTEM_FONTSYSTEM_FONT系统字体,是基于系统字体,是基于windowswindows字符集的变宽字体。系统使用该字字符集的变宽字体。

28、系统使用该字体来显示窗口的标题、菜单和对话框中的文本。系统字符集总体来显示窗口的标题、菜单和对话框中的文本。系统字符集总是可用的,而其他字符集则需要安装后才可使用是可用的,而其他字符集则需要安装后才可使用 WindowsWindows库存字体库存字体Visual C+Visual C+8.2.3续续2 2使用自定义字体使用自定义字体 CFont类类 CreatePointFont(120, “Arial”, &dc);/初始初始化逻辑字体的函数化逻辑字体的函数 dc.SelectObject(&font); /将新建的字体将新建的字体font选入设备环境选入设备环境Visual

29、 C+Visual C+8.2.3续续3下面为使用该函数的典型代码:下面为使用该函数的典型代码: CClientDC dc(this);/声明客户区设备环境变量声明客户区设备环境变量dc CFont font; /声明逻辑字体变量声明逻辑字体变量font font.CreatePointFont(120, “Arial”, &dc);/初始初始化逻辑字体化逻辑字体 CFont* def_font = dc.SelectObject(&font); /将将新建的字体新建的字体font选入设备环境选入设备环境 dc.TextOut(5, 5, Hello, 5); /以所建的字体显

30、示以所建的字体显示hello dc.SelectObject(def_font); /恢复旧字体恢复旧字体 font.DeleteObject(); /删除所建立的字体删除所建立的字体 Visual C+Visual C+8.2.4 文本处理实例文本处理实例 【例例8-2】利用】利用MFC编写文本处理的应用程序。编写文本处理的应用程序。 1程序功能描述程序功能描述 使用库存字体和自定义字体,设置文本的前景色、使用库存字体和自定义字体,设置文本的前景色、背景色、对齐方式、背景模式,利用背景色、对齐方式、背景模式,利用TextOut和和ExtTextOut函数在屏幕上输出文本。函数在屏幕上输出文本

31、。2利用利用MFC AppWizard(exe)创建程序步骤创建程序步骤(1)运行)运行VC6.0,在在File菜单中选择菜单中选择New命令,在打开的命令,在打开的New对话框中选中对话框中选中Projects标签,在左边的列表框中选标签,在左边的列表框中选择择MFC AppWizard(exe)选项,在右边的选项,在右边的Project name文本框中输入工程名文本框中输入工程名TextTest,并选择合适的路径。并选择合适的路径。Visual C+Visual C+【例【例8-2】续】续1(2)单击)单击OK按钮,启动按钮,启动AppWizard,在第在第一步中选择一步中选择Singl

32、e Document单选按钮。单选按钮。(3)从第)从第2步到第步到第6步使用缺省选项,最后生步使用缺省选项,最后生成工程成工程TextTest。 3编辑视图类编辑视图类CTextTestView 中的中的OnDraw函函数,实现文本的各种属性控制及输出。附数,实现文本的各种属性控制及输出。附CTextTestView.txtVisual C+Visual C+8.3 CDC的绘图操作的绘图操作 8.3.1 画点与画线函数操作画点与画线函数操作 8.3.2 绘制封闭图形绘制封闭图形 8.3.3 设置绘图参数设置绘图参数8.3.4 绘图模式绘图模式 8.3.5 绘图操作实例绘图操作实例Visua

33、l C+Visual C+8.3.1 画点与画线函数操作画点与画线函数操作1画点函数画点函数SetPixel()() CDC的成员函数的成员函数SetPixel用来在指定位置上绘制一个用来在指定位置上绘制一个特定的像素点,其原型为:特定的像素点,其原型为:COLORREF SetPixel( POINT point, COLORREF crColor ); 其中参数其中参数point指定所绘制的点,指定所绘制的点,crColor指定画点所指定画点所用的颜色。用的颜色。例如:例如:pDC- SetPixel(CPoint(100,100),RGB(255,0,0);Visual C+Visual

34、 C+2画直线函数画直线函数LineTo( ) 画直线时先用到画直线时先用到MoveTo()函数函数,将画笔的坐将画笔的坐标移至某一点。标移至某一点。例如:例如:MoveTo(20,20);); LineTo( )函数用于画一条直线。函数用于画一条直线。例如:例如:LineTo(100,100); 即从起点(即从起点(20,20)处画一条直线至终点)处画一条直线至终点(100,100)处。)处。如何画一个菱形?如何画一个菱形?Visual C+Visual C+8.3.1 续续1 3画弧线画弧线 使用使用CDC的成员函数的成员函数Arc和和ArcTo,可以用缺省的笔画一段不填可以用缺省的笔画一

35、段不填充的椭圆弧。充的椭圆弧。Arc函数的原型如下:函数的原型如下: BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 这两个函数画弧成功返回非这两个函数画弧成功返回非0,否则返回,否则返回0,函数中各参数的含义,函数中各参数的含义如下:如下:参数参数x1与与y1为包围弧的矩形的左上角为包围弧的矩形的左上角x、y坐标;坐标;x2与与y2为包围弧为包围弧的矩形的右下角的矩形的右下角x、

36、y坐标;坐标;x3与与y3为弧的起点为弧的起点x、y坐标;坐标;x与与y为弧的终点为弧的终点x、y坐标。坐标。 参数参数lpRect表示围绕弧的矩形表示围绕弧的矩形,它可以是,它可以是LPRECT 或或CRect对象,对象,ptStart表示弧的起点的表示弧的起点的CPoint 或或POINT对象,该点不必精确地位对象,该点不必精确地位于弧上;于弧上;PtEnd表示弧的终点表示弧的终点的的CPoint 或或POINT对象,该点不必精对象,该点不必精确地位于弧上。确地位于弧上。Visual C+Visual C+8.3.2 绘制封闭图形绘制封闭图形 Windows提供了提供了Rectangle、

37、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为一个矩形结构的指针,用它来表示为一

38、个矩形结构的指针,用它来表示矩形的四个角。矩形的四个角。2画椭圆或圆画椭圆或圆 使用使用CDC的成员函数的成员函数Ellipse,可以使用当前笔绘制一个用当前可以使用当前笔绘制一个用当前画刷填充的椭圆或圆。其函数原型如下:画刷填充的椭圆或圆。其函数原型如下:Visual C+Visual C+8.3.2 续续1BOOL Ellipse(int x1, int y1, int x2, int y2 );BOOL Ellipse( LPCRECT lpRect ); 这两个函数画椭圆成功后返回非这两个函数画椭圆成功后返回非0值,否则返回值,否则返回0。所画椭圆高度为。所画椭圆高度为y2-y1,宽度

39、为宽度为x2-x1。在该函数中,椭圆是由其外接矩形来确定的。外在该函数中,椭圆是由其外接矩形来确定的。外接矩形的中心与椭圆中心重合,矩形的长和宽和椭圆的长短轴相等。函接矩形的中心与椭圆中心重合,矩形的长和宽和椭圆的长短轴相等。函数中的参数与画矩形的相仿,分别表示椭圆外接矩形的左上角和右下角数中的参数与画矩形的相仿,分别表示椭圆外接矩形的左上角和右下角坐标。坐标。3画圆角矩形画圆角矩形BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 ); 该函数用于绘制一个圆角矩形,并用当前的画刷来填充该圆角矩该函数用于绘制一个圆角矩形

40、,并用当前的画刷来填充该圆角矩形的内部区域。其中参数形的内部区域。其中参数(x1,y1)为指定矩形的左上角位置为指定矩形的左上角位置x与与y坐标;坐标;(x2,y2)为指定矩形右下角位置为指定矩形右下角位置x与与y坐标,坐标,(x3,y3)用于定义矩形四用于定义矩形四个角上的边角内切椭圆的宽度和高度个角上的边角内切椭圆的宽度和高度,值越大,圆角矩形的角就越明显。,值越大,圆角矩形的角就越明显。如果如果x3=x2-x1,并且并且y3=y2-y1,则所绘制的圆角矩形变为一个椭圆。则所绘制的圆角矩形变为一个椭圆。Visual C+Visual C+8.3.2 续续24 画饼图扇形画饼图扇形饼图是一条

41、弧和从弧的两个端点到中心的连线组成的图形。饼图是一条弧和从弧的两个端点到中心的连线组成的图形。CDC的成员函数的成员函数Pie可用于画饼图,函数原型如下:可用于画饼图,函数原型如下:BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 该函数的参数与该函数的参数与Arc函数的参数的含义相仿,只不过函数的参数的含义相仿,只不过Pie函数画的函数画的是封闭图形,是封闭图形,Arc画的是非封闭图

42、形。各参数参见画的是非封闭图形。各参数参见8.3.1节介绍。节介绍。5 画弓形画弓形弓形图是一条椭圆弧和连接该弧线两个端点的弦,并用当前的画弓形图是一条椭圆弧和连接该弧线两个端点的弦,并用当前的画刷来填充其内部区域的封闭图形。刷来填充其内部区域的封闭图形。Chord原型如下:原型如下:BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); 该函数参数与该函数参数与Pie函数参数的含义相仿。函数参数的含义相仿。 Visual C+Visual C+8.3.4 绘图模式绘图模式 当当Windows使

43、用画笔画线时,它实际上是在画笔像素和目使用画笔画线时,它实际上是在画笔像素和目标位置处原像素之间执行一种按位布尔运算,称为标位置处原像素之间执行一种按位布尔运算,称为“光栅操光栅操作作”(Raster Operation),简记为简记为“ROP”。由于画线操作由于画线操作只涉及两种像素(画笔像素和目标像素),所以这种布尔运只涉及两种像素(画笔像素和目标像素),所以这种布尔运算又称为算又称为“二元光栅操作二元光栅操作”(ROP2)。Windows定义了定义了16种种ROP2码,用来表示画笔像素和目标像素各种不同的组合方式。码,用来表示画笔像素和目标像素各种不同的组合方式。可以调用可以调用CDC的

44、成员函数的成员函数SetROP2改变绘图模式,函数原型改变绘图模式,函数原型为:为:int SetROP2(int nDrawMode); 参数参数nDrawMode指定所要求的绘图模式指定所要求的绘图模式 Visual C+Visual C+注意注意:(1) 在画线时在画线时,如果绘图模式为如果绘图模式为R2_NOT,则画出的线的颜色为原先则画出的线的颜色为原先屏幕颜色的反色。这样画的线均可见,而且第二次画同一条线屏幕颜色的反色。这样画的线均可见,而且第二次画同一条线时,将自动擦除该线并恢复为当前显示颜色。时,将自动擦除该线并恢复为当前显示颜色。(2) R2_NOP绘图模式等效于同时选择绘图

45、模式等效于同时选择NULL画笔和画笔和NULL画刷。画刷。(3) 在在R2_XORPEN的操作模式下,用相同的参数两次调用某一的操作模式下,用相同的参数两次调用某一条绘图命令时(包括文字输出函数),其结果仍然保留原样,条绘图命令时(包括文字输出函数),其结果仍然保留原样,利用这种方式,我们可以实现图形动画效果。利用这种方式,我们可以实现图形动画效果。(4) 在画虚线时,用于填充线间的空白颜色取决于当前背景模式在画虚线时,用于填充线间的空白颜色取决于当前背景模式和背景颜色。和背景颜色。(5) 在在R2_NOTXORPEN的操作的操作模式下,其功能有二,第一,将模式下,其功能有二,第一,将同一直线

46、绘制两次,将删除该直线;第二,无论背景是何颜色,同一直线绘制两次,将删除该直线;第二,无论背景是何颜色,第一次绘制的直线总是可见的。第一次绘制的直线总是可见的。Visual C+Visual C+8.3.5 绘图操作实例绘图操作实例 【例【例8-3】一个演示绘图模式与画线的应用程序。】一个演示绘图模式与画线的应用程序。1程序功能描述程序功能描述 利用绘图模式实现利用绘图模式实现“橡皮条橡皮条”功能的直线绘制功能的直线绘制。一般的绘图软件。一般的绘图软件(如(如AutoCAD),在画直线时的操作方法是:当按鼠标左键时,准备在画直线时的操作方法是:当按鼠标左键时,准备绘制直线,当在屏幕移动鼠标时,

47、在屏幕上画一条直线,该直线开绘制直线,当在屏幕移动鼠标时,在屏幕上画一条直线,该直线开始于原先按下鼠标左键的位置,终止于当前鼠标移动到的位置。随始于原先按下鼠标左键的位置,终止于当前鼠标移动到的位置。随着鼠标的移动,该直线也在移动,但直线的起始点不动,类似于一着鼠标的移动,该直线也在移动,但直线的起始点不动,类似于一个橡皮筋固定在一端,而在拉动它的另一端。个橡皮筋固定在一端,而在拉动它的另一端。2利用利用MFC AppWizard(exe)创建程序步骤创建程序步骤(1)生成应用程序框架)生成应用程序框架 利用应用程序向导利用应用程序向导MFC AppWizard(exe)创建一个单文档的应用程

48、序创建一个单文档的应用程序框架,该工程的名称为框架,该工程的名称为MyDraw,向导的每个步骤都使用缺省的。向导的每个步骤都使用缺省的。Visual C+Visual C+【例【例8-3】续】续1(2)在视图类)在视图类CMyDraw添加数据成员添加数据成员在工程在工程MyDraw的工作区中,选择的工作区中,选择“ClassView”选项卡,在选项卡,在类名列表窗口中选择视图类类名列表窗口中选择视图类“CMyDrawView”,然后单击鼠标右然后单击鼠标右键,在弹出的快捷菜单中选择键,在弹出的快捷菜单中选择“Add Member Variable”命令,则命令,则弹出图弹出图8.2所示的对话框

49、。在所示的对话框。在“Variable Type”编辑框中输入编辑框中输入bool,在在“Variable Name”编辑框中输入编辑框中输入m_IsDraw,选择选择Access(访访问控制属性问控制属性)为为Private(私有私有)。最后按。最后按“OK”按钮,则在视图类按钮,则在视图类CMyDrawView中添加了一个中添加了一个bool型的私有成员变量型的私有成员变量m_IsDraw,用于标记是否开始绘制直线,当该值为真时,代表开始画直线,为用于标记是否开始绘制直线,当该值为真时,代表开始画直线,为假时,代表停止画直线。假时,代表停止画直线。 另外,为了确定所画线的起始点和终止点,需

50、要在视图类中添加另外,为了确定所画线的起始点和终止点,需要在视图类中添加两个两个CPoint型的成员变量型的成员变量m_StartPoint和和m_EndPoint,前者存前者存放直线的起始点,后者存放直线的终止点,添加的方法同上。放直线的起始点,后者存放直线的终止点,添加的方法同上。Visual C+Visual C+图图8.2Visual C+Visual C+【例【例8-3】续】续2(3)对成员变量)对成员变量m_IsDraw进行初始化进行初始化 在视图类在视图类CMyDrawView的构造函数中添加如下的的构造函数中添加如下的代码可以实现对数据成员的初始化。代码可以实现对数据成员的初始

51、化。CMyDrawView:CMyDrawView() m_IsDraw=false; /开始不绘制直线开始不绘制直线(4)添加鼠标左键按下消息的映射函数)添加鼠标左键按下消息的映射函数选择选择View|ClassWizard命令,弹出命令,弹出MFC ClassWizard窗窗体,在体,在Class name 中选择中选择CMyDrawView,在在Messages中选择中选择WM_LBUTTONDOWN,然后单击然后单击“Add Function”按钮,这样就为视图类添加了按钮,这样就为视图类添加了WM_LBUTTONDOWN的消息处理函数的消息处理函数OnLButtonDown, 如下图

52、所示。如下图所示。Visual C+Visual C+图图8.3Visual C+Visual C+【例【例8-3】续】续3 最后,单击最后,单击“Edit Code”按钮,光标自动按钮,光标自动定位到定位到OnLButtonDown 实现处,在该消息映实现处,在该消息映射函数中添加后的代码如下:射函数中添加后的代码如下:void CMyDrawView:OnLButtonDown(UINT nFlags, CPoint point) m_IsDraw=true; /开始绘制直线开始绘制直线m_StartPoint=m_EndPoint=point; /开始开始画线时起始点与终止点重合画线时起

53、始点与终止点重合CView:OnLButtonDown(nFlags, point); Visual C+Visual C+【例【例8-3】续】续4(5)添加鼠标移动的消息映射函数)添加鼠标移动的消息映射函数 与上一步类似,利用与上一步类似,利用ClassWizard为视图类为视图类CMyDrawView添添加击键消息加击键消息WM_MOUSEMOVE的消息映射函数的消息映射函数OnMouseMove(),并在该函数中添加代码,以用于移动屏幕并在该函数中添加代码,以用于移动屏幕上的图形上的图形(6)添加鼠标左键弹起的消息映射函数添加鼠标左键弹起的消息映射函数 与上一步类似,利用与上一步类似,利

54、用ClassWizard为视图类为视图类CMyDrawView添添加击键消息加击键消息WM_LBUTTONUP的消息映射函数的消息映射函数OnLButtonUp(),并在该函数中添加如下代码,以用于停止并在该函数中添加如下代码,以用于停止绘图:绘图:void CMyDrawView:OnLButtonUp(UINT nFlags, CPoint point) m_IsDraw=false; /停止绘制直线停止绘制直线CView:OnLButtonUp(nFlags, point); Visual C+Visual C+第四次上机题目第四次上机题目1、利用绘图函数在客户区绘制三个菱形图、利用绘图

55、函数在客户区绘制三个菱形图形。形。2、练习、练习P166页例页例8.3。Visual C+Visual C+8.4 Windows绘图工具绘图工具 8.4.1 8.4.1 绘图工具分类绘图工具分类8.4.2 8.4.2 使用画笔使用画笔 8.4.3 8.4.3 使用画刷使用画刷8.4.4 8.4.4 使用库存工具使用库存工具Visual C+Visual C+绘图工具简介绘图工具简介 VC绘图需要两个要素:绘图需要两个要素:设备描述表设备描述表和和基本基本绘图工具绘图工具。设备描述表是由。设备描述表是由CDC类及其派生类类及其派生类来描述,它是一个来描述,它是一个画图的画布,提供绘图的场画图的

56、画布,提供绘图的场地和环境地和环境。画布一般是窗口的客户区,在该环。画布一般是窗口的客户区,在该环境中有一套默认的基本绘图工具。比如在文本境中有一套默认的基本绘图工具。比如在文本操作中,字体就是一种绘图工具。当设备环境操作中,字体就是一种绘图工具。当设备环境所提供的默认的绘图工具不能满足我们的需求所提供的默认的绘图工具不能满足我们的需求时,就需要更改默认绘图工具,达到绘制丰富时,就需要更改默认绘图工具,达到绘制丰富多彩图形的目的。多彩图形的目的。 Visual C+Visual C+8.4.1绘图工具的分类绘图工具的分类 Windows的绘图工具包括画笔、的绘图工具包括画笔、画刷、字体、位图、

57、调色板和区域画刷、字体、位图、调色板和区域。在在MFC中这些绘图工具被封装到相中这些绘图工具被封装到相应的类中。这些绘图工具中,字体应的类中。这些绘图工具中,字体在文本操作中已讲,本书主要学习在文本操作中已讲,本书主要学习画笔和画刷,其余工具自己查阅相画笔和画刷,其余工具自己查阅相关资料进行学习。关资料进行学习。 Visual C+Visual C+8.4.2 使用画笔使用画笔 画笔是最简单的一种绘图工具,同时也是最重画笔是最简单的一种绘图工具,同时也是最重要的一种绘图对象。要的一种绘图对象。在现实世界中在现实世界中,可以用不同的可以用不同的笔产生不同的线。这正如绘图用的彩笔、不同颜笔产生不同

58、的线。这正如绘图用的彩笔、不同颜色笔产生不同颜色的线。色笔产生不同颜色的线。Windows也是利用这种也是利用这种面向对象的描述事物的方法,把笔作为一个对象,面向对象的描述事物的方法,把笔作为一个对象,和现实世界一样,不同的笔产生不同的线。和现实世界一样,不同的笔产生不同的线。 1 画笔类画笔类CpenCPen对象封装了对象封装了Windows GDI笔,并提供与笔,并提供与CPen对象一起工作的几种方法。对象一起工作的几种方法。Visual C+Visual C+8.4.2续续1 2画笔工具的操作步骤画笔工具的操作步骤(1)声明)声明CPen对象。对象。(2)初始化画笔。)初始化画笔。通过调

59、用通过调用CreatePen成员函数可以初始化笔,该函数的成员函数可以初始化笔,该函数的原型为:原型为:BOOL CreatePen( int nPenStyle, int nWidth,COLORREF crColor );(3)将新建的画笔对象选进设备场景中,同时保存原)将新建的画笔对象选进设备场景中,同时保存原画笔对象的指针:画笔对象的指针:pOldPen=pDC-SelectObject(&pen);(4)调用绘图函数生成图形。调用绘图函数生成图形。(5)选择设备场景的原有笔对象。)选择设备场景的原有笔对象。Visual C+Visual C+ 表表8.5 nPenStyle

60、的取值的取值笔样式笔样式说明说明PS_SOLID (0)创建创建实线笔实线笔PS_DASH (1)当笔宽度为当笔宽度为1时,创建时,创建虚线笔虚线笔PS_DOT (2)当笔宽度为当笔宽度为1时,创建时,创建点线笔点线笔PS_DASHDOT(3)当笔宽度为当笔宽度为1时,创建时,创建虚点线笔虚点线笔PS_DASHDOTDOT(4) 当笔宽度为当笔宽度为1时,创建时,创建交替直线和交替直线和双点线的笔双点线的笔PS_NULL(5)创建创建空(不可见)笔空(不可见)笔PS_INSIDEFRAME(6) 创建在创建在Windows GDI矩形边界内矩形边界内绘制形状的笔绘制形状的笔Visual C+Visual C+8.4.2续续2 3画笔工具

温馨提示

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

评论

0/150

提交评论