VC++图形程序设计基础课件

上传人:夏** 文档编号:569323260 上传时间:2024-07-28 格式:PPT 页数:110 大小:942.07KB
返回 下载 相关 举报
VC++图形程序设计基础课件_第1页
第1页 / 共110页
VC++图形程序设计基础课件_第2页
第2页 / 共110页
VC++图形程序设计基础课件_第3页
第3页 / 共110页
VC++图形程序设计基础课件_第4页
第4页 / 共110页
VC++图形程序设计基础课件_第5页
第5页 / 共110页
点击查看更多>>
资源描述

《VC++图形程序设计基础课件》由会员分享,可在线阅读,更多相关《VC++图形程序设计基础课件(110页珍藏版)》请在金锄头文库上搜索。

1、第第2章章 Visual C+图形程序设计基础图形程序设计基础内容提要内容提要lVisual C+是在是在Microsoft C的基础上发展而来的,的基础上发展而来的,随着计算机软、硬件技术的快速发展,如今随着计算机软、硬件技术的快速发展,如今Visual C+已成为集编辑、编译、运行、调试于一体功能强已成为集编辑、编译、运行、调试于一体功能强大的集成编程环境。本章以大的集成编程环境。本章以Visual C+ 6.0为对象,为对象,主要介绍主要介绍Visual C+集成编成环境的使用、图形设备集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等接口和常用图形程序设计、鼠标

2、编程以及菜单设计等基础,目的是通过对基础,目的是通过对Visual C+的学习,掌握的学习,掌握Visual C+图形程序设计的方法,为计算机图形学原理部分图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。的算法实现提供程序工具和方法。 2.1 Visual C+ 6.0应用程序开发方法应用程序开发方法l介绍介绍Visual C+ 6.0集成开发环境,以一个简集成开发环境,以一个简单的实例介绍利用单的实例介绍利用Visual C+应用程序工程建应用程序工程建立方法和程序设计框架。立方法和程序设计框架。 2.1.1 Visual C+的集成开发环境的集成开发环境l从开始菜单

3、中启动从开始菜单中启动Visual C+ 6.0,进入开发进入开发集成环境。打开一个项目后,可以看到集成环境。打开一个项目后,可以看到Visual C+ 6.0的开发环境由标题栏、工具栏、工作的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏区窗口、源代码编辑窗口、输出窗口和状态栏组成,见图组成,见图2.1所示。所示。 图图2.1 Visual C+ 6.0集成开发环境集成开发环境 标题栏菜单栏工作区源代码编辑窗口 状态栏 标题栏用于显示应用程序名和所打开的文件名,标题标题栏用于显示应用程序名和所打开的文件名,标题栏的颜色可以表明对应窗口是否被激活。菜单栏包括栏的颜色可以

4、表明对应窗口是否被激活。菜单栏包括文件、编辑、显示、插入、工程、编译、工具、窗口文件、编辑、显示、插入、工程、编译、工具、窗口和帮助九项主菜单,包含了从源代码的编辑、界面设和帮助九项主菜单,包含了从源代码的编辑、界面设计、程序调试和编译运行在内的所有功能。工具栏列计、程序调试和编译运行在内的所有功能。工具栏列出了常用的菜单命令功能和对象方法。工具栏的下面出了常用的菜单命令功能和对象方法。工具栏的下面是两个窗口,一个是工作区窗口,用于列出工程中的是两个窗口,一个是工作区窗口,用于列出工程中的各种对象,一个是源代码编辑窗口,用于各个对象的各种对象,一个是源代码编辑窗口,用于各个对象的程序设计。输出

5、窗口显示项目建立过程中所产生的各程序设计。输出窗口显示项目建立过程中所产生的各种信息。屏幕底端是状态栏,它给出当前操作或所选种信息。屏幕底端是状态栏,它给出当前操作或所选择命令的提示信息。择命令的提示信息。2.1.2 应用程序工程的建立方法应用程序工程的建立方法 lVisual C+提提供供了了一一种种称称为为App Wizard的的工工具具,利利用用该该工工具具,用用户户可可以以方方便便地地按按照照自自己己的的需需要要创创建建符符合合需需要要的的应应用用程程序序框框架架。在在这这个个基基础础上上,用用户户可可以以进进一一步步将将自自己己编编写写的的程程序序加加入入到到这这个个框框架架中中,实

6、实现现用用户户程程序序的的功功能能。下下面面介介绍绍建建立立VcApp应应用用程程序序框框架架的的方方法法,其它应用程序的方法都与此类似。其它应用程序的方法都与此类似。l第一步:启动第一步:启动Visual C+,选择工程方法选择工程方法l 从从开开始始菜菜单单中中选选择择 Visual C+,进进入入Visual C+集集成环境。从文件菜单中选择新建成环境。从文件菜单中选择新建(New)命令,命令,2.1.2 应用程序工程的建立方法应用程序工程的建立方法 l弹弹出出图图2-2对对话话框框。切切换换到到工工程程(Projects)标标签签,项项目目类类型型选选择择MFC AppWizard(e

7、xe),输输入入工工程程的的名名字字(如如VcApp),选选择择项项目目放放置置的的位置,然后单击位置,然后单击“确定确定”按钮。按钮。图图2-2 Visual C+的的New对话框对话框 2.1.2 2.1.2 应用程序工程的建立方法应用程序工程的建立方法 l第二步:设置应用程序的特性。第二步:设置应用程序的特性。l这这些些设设置置包包括括六六个个问问题题,每每一一个个问问题题都都有有不不同同的的选选项项供供 选选 择择 。 一一 个个 问问 题题 选选 择择 完完 后后 , 通通 过过 “下下 一一 步步”(Next)选选择择下下一一个个问问题题,直直到到六六个个问问题题选选择择完完毕毕。

8、还还可可以以通通过过“上上一一步步”(Back)返返回回上上一一个个问问题题重重新新选选择择。下下面面继继续续上上面面的的例例子子,在在单单击击“确确定定”按按钮钮后后,弹出第一个问题窗口,如图弹出第一个问题窗口,如图2-3所示。所示。l第第一一个个问问题题是是建建立立什什么么类类型型的的应应用用程程序序,有有三三个个选选项项:单单个个文文档档( (Single document) )、多多重重文文档档( (Multiple document) )和基本对话和基本对话( (Dialog based) )。2.1.22.1.2 应用程序工程的建立方法应用程序工程的建立方法 l单单个个文文档档应应

9、用用程程序序主主窗窗口口中中只只有有一一个个窗窗口口,多多重重文文档档可可以以在在主主窗窗口口中中开开多多个个子子窗窗口口,基基本本对对话话主主窗窗口口是是一一个个对对话话框框。例例中中选选择择单单个个文文档档,单单击击“确确定定”,进进入入下下一一个个问问题题,如如图图2-4所示。所示。l第二个问题是数据库的支持,是否用第二个问题是数据库的支持,是否用ODBC存取数据库,存取数据库,有四个选项:不包括数据库的支持(有四个选项:不包括数据库的支持(None)、)、仅包含仅包含ODBC头文件(头文件(Header files only)、)、指定一个数据库但没指定一个数据库但没有文件支持和指定一

10、个数据库但需要文件支持。当选择了有文件支持和指定一个数据库但需要文件支持。当选择了后两项,则需要用户选择一个已经建立的数据库。例中不后两项,则需要用户选择一个已经建立的数据库。例中不需要数据库支持,选择第一个选项需要数据库支持,选择第一个选项“否否”,进入第三个问,进入第三个问题,如图题,如图2-5所示所示 图图2-3 第一个问题:选择应用程序的类型第一个问题:选择应用程序的类型 图图2-4 第二个问题:选择是否要用第二个问题:选择是否要用ODBC支持支持 l第三个问题是对第三个问题是对ActiveX的支持。有五个选项:的支持。有五个选项:(1)没有对)没有对ActiveX的支持;的支持;(2

11、)ActiveX容容器器, ,它它可可以以包包含含链链接接和和嵌嵌入入对对象象。容容器器不不能能为其它的为其它的ActiveX程序提供支持程序提供支持, ,它只能维护嵌入对象;它只能维护嵌入对象;(3)微微型型服服务务器器(Mini-server),应应用用程程序序不不能能独独立立运运行行,只能被调用为其它程序建立只能被调用为其它程序建立ActiveX对象。对象。(4)完完整整服服务务器器(Full-server),它它能能够够独独立立运运行行,并并能能够为其它应用程序建立够为其它应用程序建立ActiveX对象。对象。(5)容容器器和和服服务务器器,一一个个应应用用程程序序可可以以同同时时是是

12、容容器器和和服服务务器。器。l在例子中,选择第一个选项,没有对在例子中,选择第一个选项,没有对ActiveX的支持,单的支持,单击击“下一个下一个”(Next)进入下一个问题。进入下一个问题。 图图2-5 第三个问题:选择是否对第三个问题:选择是否对ActiveX的支持的支持 第四个问题是应用程序的特性和高级选项,如下图第四个问题是应用程序的特性和高级选项,如下图 图2-6 应用程序的特性和高级选项 例中全部采用默认选项,进入下一个问题。例中全部采用默认选项,进入下一个问题。第第五五个个问问题题是是项项目目的的风风格格、原原文文件件注注释释和和MFC库库类类型型,如如图图2-7所示。所示。在例

13、子中全部采用默认选项,进入第六个问题。在例子中全部采用默认选项,进入第六个问题。第六个问题是确定类名和文件名,如图第六个问题是确定类名和文件名,如图2-8所示。所示。 基于第一个问题到第五个问题的回答,基于第一个问题到第五个问题的回答,AppWizard会把会把将要建立的新类的名称通知用户。将要建立的新类的名称通知用户。AppWizard将为应用将为应用程序建立四个新类,程序建立四个新类,CVcAppApp是应用程序类,它是是应用程序类,它是CWinApp的派生类。的派生类。CMainFrame是一个拥有应用程序是一个拥有应用程序主窗口的类。主窗口的类。CVcAppDoc和和CVcAppVie

14、w是该应用程序是该应用程序的文档和视图类。这些名字用户可以改变。最后单击的文档和视图类。这些名字用户可以改变。最后单击“完成完成”(Finish),显示所建项目的信息,单击显示所建项目的信息,单击“确定确定”后,项目建立完成。后,项目建立完成。 图图2-7 项目的风格、原文件注释和项目的风格、原文件注释和MFC库类型库类型 图2-8 通知MFC产生的类名称 2.1.3 2.1.3 输入源程序进行程序设计输入源程序进行程序设计 l应应用用程程序序项项目目工工程程建建立立以以后后,就就为为应应用用程程序序的的开开发发建建立立了了一一个个框框架架,这这是是不不输输入入任任何何程程序序代代码码,对对该

15、该项项目目程程序序进进行行编编译译和和运运行行,可可以以生生成成一一个个完完整整的的窗窗口口程程序序。用用户户根根据据项项目目工工程程中中的的不不同同类类,输输入入自自己己设设计计的的程程序序代代码码,完完成成用用户户的程序设计。的程序设计。l例例如如,从从VcApp Classes中中找找到到CVcAppView的的OnDraw()()函函数数,如如图图2-9所所示示。双双击击OnDraw()()函函数数,这这时时系系统统会会打打开开VcAppView.cpp文文件件,而而且且光光标标正正置置于于OnDraw()()函函数数中中,在其中输入下列语句:在其中输入下列语句:lpDc-TextOu

16、t(30,30,”同同学学们们好好,欢欢迎迎使使用用VC+编编程程!”);l编译并运行该程序,运行结果如图编译并运行该程序,运行结果如图2-10所示。所示。图2-9 输入程序源代码 图2-10 运行结果 2. .2 图形设备接口和图形程序设计图形设备接口和图形程序设计 2.2.1 图形设备接口简介图形设备接口简介 l在在Windows系系统统中中,程程序序都都是是通通过过一一个个叫叫做做图图形形设设备备接接口口(GDI, Graphics Device Interface)的的抽抽象象接接口口和和硬硬件件打打交交道道,Windows会会自自动动将将设设备备环环境境表表映映射射到到相相应应的的物

17、物理理设设备备,并并且且会会提提供供正正确确的的输输入入/输出指令。输出指令。lGDI是是Windows系统核心的三种动态链接库之一,系统核心的三种动态链接库之一,它管理它管理Windows系统的所有程序的图形输出。在系统的所有程序的图形输出。在Windows系统中,系统中,GDI向程序员提供了高层次的向程序员提供了高层次的绘图函数,只要掌握这些绘图函数,就可以很方绘图函数,只要掌握这些绘图函数,就可以很方便地进行图形程序设计。便地进行图形程序设计。 lDC是是一一个个数数据据结结构构,当当程程序序向向GDI设设备备中中绘绘图图时时,需需要要访访问问该该设设备备的的DC。MFC将将GDI的的D

18、C封封装装在在C+类类中中,包包括括CDC类类和和CDC派派生生类类,这这些些类类中中的的许许多多成成员员都都是是对对本本地地GDI绘绘图图函函数数进进行行简简单单封封装装而而形形成成的的内联函数。内联函数。lDC的的作作用用就就是是提提供供程程序序与与物物理理设设备备或或者者虚虚拟拟设设备备之之间间的的联联系系,除除此此之之外外,DC还还要要处处理理绘绘图图属属性性的的设设置置,如如文文本本的的颜颜色色等等。程程序序员员可可以以通通过过调调用用专专门门的的GDI函函数修改绘图属性,如数修改绘图属性,如SetTextColor()函数。函数。lCDC类类是是GDI封封装装在在MFC中中最最大大

19、的的一一个个类类,它它表表示示总总的的DC。表。表2.1列出了列出了CDC中的一些常用绘图函数。中的一些常用绘图函数。设备描述表设备描述表(DC, Device Context)表表2.1 CDC类中常用绘图函数类中常用绘图函数 函函 数数描描 述述使用频率使用频率Arc()椭圆弧椭圆弧*BitBlt()把位图从一个把位图从一个DC拷贝到另一个拷贝到另一个DC*Draw3dRect()绘制三维矩形绘制三维矩形*DrawDragRect()绘制用鼠标拖动的矩形绘制用鼠标拖动的矩形*DrawEdge()绘制矩形的边缘绘制矩形的边缘*DrawIcon()绘制图标绘制图标*Ellipse()绘制椭圆绘

20、制椭圆*FillRect()绘制用给定的画刷颜色填充矩形绘制用给定的画刷颜色填充矩形*FillRgn()绘制用给定的画刷颜色填充区域绘制用给定的画刷颜色填充区域*FillSolidRed()绘制用给定的颜色填充矩形绘制用给定的颜色填充矩形*FloodFill()用当前的画刷颜色填充区域用当前的画刷颜色填充区域*FrameRect()绘制矩形边界绘制矩形边界*FrameRgn()绘制区域边界绘制区域边界*GetBKColor()获取背景颜色获取背景颜色*GetCurrentBitmap()获取所选位图的指针获取所选位图的指针*GetCurrentBrush()获取所选画刷的指针获取所选画刷的指针

21、*GetCurrentFont()获取所选字体的指针获取所选字体的指针*GetCurrentPalette()获取所选调色板的指针获取所选调色板的指针*GetCurrentPen()获取所选画笔的指针获取所选画笔的指针*GetCurrentPosition()获取画笔的当前位置获取画笔的当前位置*GetDeviceCaps()获取显示设备能力的信息获取显示设备能力的信息*GetMapMode()获取当前设置映射模式获取当前设置映射模式*Getpixel()获取给定像素的获取给定像素的RGB颜色值颜色值*GetPolyFillMode()获取多边形填充模式获取多边形填充模式*GetTextCol

22、or()获取文本颜色获取文本颜色*GetTextExtent()获取文本的宽度和高度获取文本的宽度和高度*GetTextMetrics()获取当前文本的信息获取当前文本的信息*GetWindow()获取获取DC窗口的指针窗口的指针*GrayString()绘制灰色文本绘制灰色文本*LineTo()绘制直线绘制直线*MoveTo()设置当前画笔位置设置当前画笔位置*Pie()绘制饼图绘制饼图*Polygon()绘制多边形绘制多边形*PolyLine()绘制一组直线绘制一组直线*RealizePalette()将逻辑调色板映射到系统调色板将逻辑调色板映射到系统调色板*Rectangle()绘制矩形

23、绘制矩形*RoundRect()绘制圆角矩形绘制圆角矩形*SelectObject()选择选择GDI绘图对象绘图对象*SelectPalette()选择逻辑调色板选择逻辑调色板*SelectStockObject()选择预定义图形对象选择预定义图形对象*l这些函数的语法和使用可以通过这些函数的语法和使用可以通过MSDN帮助查询。帮助查询。2.2.2节节主要介绍主要介绍Windows中基本图形,包括点、直线、圆、圆弧、中基本图形,包括点、直线、圆、圆弧、矩形、椭圆、扇形、折线等程序设计矩形、椭圆、扇形、折线等程序设计 SetBkColor()设置背景颜色设置背景颜色*SetMapMode()设置

24、映射模式设置映射模式*SetPixel()把像素设定为给定的颜色把像素设定为给定的颜色*SetTextColor()设置文本颜色设置文本颜色*StretchBlt()把把位位图图从从一一个个DC拷拷贝贝到到另另一一个个DC, ,并根据需要扩展或压缩位图并根据需要扩展或压缩位图*TextOut()绘制字符串文本绘制字符串文本*2.2.2 2.2.2 绘制基本图形绘制基本图形 (1)画点)画点 SetPixel()函数可以在指定的坐标位置按指定函数可以在指定的坐标位置按指定的颜色画点。函数原型说明如下:的颜色画点。函数原型说明如下: COLORREF CDC: SetPixel(int X, in

25、t Y, COLORREF crColor);l其其中中(X,Y)(X,Y)为为点点的的坐坐标标位位置置,crColor参参数数为为点点的的颜颜色色值值。如如果果函函数数调调用用成成功功,则则函函数数返返回回像像素素的的颜色值,否则返回值为颜色值,否则返回值为-1。l颜颜色色值值通通过过RGB(Red,Green,Blue)来来设设置置,其其中中三三个个参参数数取取值值0255。例例如如,在在VcAPP项项目目中中,在在CVcAppView类类中中的的OnDraw()函函数数中中加加入入下下列列画画点语句:点语句:/绘制一组彩色点绘制一组彩色点 pDC-TextOut(20,20,point:

26、);pDC-SetPixel(100,20,RGB(255,0,0); pDC-SetPixel(110,20,RGB(0,255,0);pDC-SetPixel(120,20,RGB(0,0,255);pDC-SetPixel(100,20,RGB(255,255,0);pDC-SetPixel(100,20,RGB(255,0,255);pDC-SetPixel(100,20,RGB(0,255,255);pDC-SetPixel(100,20,RGB(0,0,0);pDC-SetPixel(100,20,RGB(255,255,255);运行程序,查看运行结果。运行程序,查看运行结果。

27、(2)画直线和折线)画直线和折线 l画直线需要画直线需要LineTo()和和MoveTo()两个函数的配合使用。两个函数的配合使用。lLineTo()函函数数以以当当前前位位置置所所在在的的点点为为直直线线的的起起点点,另另指指定定一一个个点点为为直直线线的的终终点点,画画出出一一段段直直线线。直直线线的的颜颜色色通通过过画画笔笔的的颜颜色色来来设设定定,在在后后面面介介绍绍。LineTo()函函数数原原型型说明如下:说明如下:BOOL CDC: LineTo(int nXEnd, int nYEnd);l直线的终点位置由(直线的终点位置由(nXEnd, nYEnd)指定。如果函数指定。如果函

28、数调用成功,那么该点就成为当前位置,并返回调用成功,那么该点就成为当前位置,并返回TRUE,否则返回否则返回FALSE。lMoveTo()函数只是将当前位置移动到指定位置,函数只是将当前位置移动到指定位置,它并没有画出直线,其函数说明为:它并没有画出直线,其函数说明为: BOOL CDC: MoveTo (int X, int Y);示例:示例:在在CVcAppView类中的类中的OnDraw()函数中加函数中加入下列画点语句:入下列画点语句:/绘制直线绘制直线 pDC-TextOut(20,60,Line:); pDC-MoveTo(20,90); pDC-LineTo(160,90);Po

29、lyline()函函数数用用来来画画一一条条折折线线,而而PolyPolyline()函数则用来画多条折线,其函数原型说明如下:函数则用来画多条折线,其函数原型说明如下:BOOL CDC:Polyline(COUST POINT *lppt, int cPoints);BOOL CDC:PolyPolyline(COUST POINT * lppt, COUST DWORD *lpdwPolyPoints, DWORD cCount);在在Polyline()函数中,函数中,lppt是指向折线顶点数组的是指向折线顶点数组的指针,而指针,而cPoints是折线顶点数组中的顶点数。是折线顶点数组中

30、的顶点数。例如,例如,绘制一条具有绘制一条具有4个顶点的折线,程序如下:个顶点的折线,程序如下:POINT polylinepoint4=70,240,20,190, 70,190,20,240;pDC-Polyline(polylinepoint,4);在在PolyPolyline()()函函数数中中,lppt是是指指向向保保存存顶顶点点数数组组的的指指针针,而而各各条条折折线线的的顶顶点点数数则则保保存存在在lpdwPolyPoints参参数数所所指指向向的的数数组组中中,最最后后的的cCount参数指定折线的数目。参数指定折线的数目。例如:例如:POINT polypolylinePt9

31、=95,160,120,185,120,250, 145,160,120,185,90,185,150,185,80,210,160,210;DWORD dwPolyPoints4=3,2,2,2; /分分四四段段折折线线,分分别别占占用用3,2, ,2, ,2个顶点个顶点 pDC-PolyPolyline(polypolylinePt, dwPolyPoints, 4);注:由于一条折线至少需要注:由于一条折线至少需要2个顶点,因此个顶点,因此dwPolyPoints数数组中的数不应该小于组中的数不应该小于2。(3)画弧线和曲线)画弧线和曲线 通过通过Arc()函数画弧线或整个椭圆。椭圆限定

32、在一函数画弧线或整个椭圆。椭圆限定在一个矩形内,称为外接矩形。个矩形内,称为外接矩形。Arc()函数的圆形说明函数的圆形说明如下:如下: BOOL CDC: Arc(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc); l其其中中(nLeftRect, nTopRect)是是外外接接矩矩形形的的左左上上角角坐坐标标值值,(nRightRect, nBottomRect)是是外外接接矩矩形形的的右右下下角角

33、坐坐标标值值。而而椭椭圆圆中中心心与与点点(nXStartArc, nYStartArc)所所构构成成的的射射线线与与椭椭圆圆的的交交点点成成为为弧弧线线的的起起点点,椭椭圆圆中中心心与与点点(nXEndArc, nYEndArc)所所构构成成的的射射线线与与椭椭圆圆的的交交点点成成为为弧弧线线的的终终点点。椭椭圆圆上从始点到终点就形成一条弧线。上从始点到终点就形成一条弧线。l 在在Windows系统中,弧线从始点到终点的方向是系统中,弧线从始点到终点的方向是逆时针方向,但可以通过逆时针方向,但可以通过SetArcDirection()函数将函数将绘制弧线方向设置为顺时针方向。绘制弧线方向设置

34、为顺时针方向。 for (i=0;iArc(260-5*i,70-5*i,260+5*i,70+5*i,260+5*i,70,260+5*i,70);for (i=3;iArc(260-10*i, 70-10*i, 260+10*i, 70+10*i, (int)260+10*i*cos(60*3.1415926/180), (int)70+10*i*sin(60*3.1415926/180), (int)260+10*i*cos(60*3.1415926/180), (int)70-10*i*sin(60*3.1415926/180);pDC-Arc(260-10*i, 70-10*i, 2

35、60+10*i, 70+10*i, (int)260-10*i*cos(60*3.1415926/180), (int)70-10*i*sin(60*3.1415926/180), (int)260-10*i*cos(60*3.1415926/180), (int)70+10*i*sin(60*3.1415926/180);示例,用示例,用Arc()绘制圆、圆弧和椭圆,程序如下:绘制圆、圆弧和椭圆,程序如下:lBezier曲线是最常见的非规则曲线之一。曲线是最常见的非规则曲线之一。Bezier曲曲线属于三次曲线,需要四个控制顶点来确定一条线属于三次曲线,需要四个控制顶点来确定一条Bezier曲

36、线,其中曲线通过第一点和最后一点,曲线,其中曲线通过第一点和最后一点,并且第一条边和最后一条边是曲线在起点和终点并且第一条边和最后一条边是曲线在起点和终点处的切线,从而确定了曲线的走向。处的切线,从而确定了曲线的走向。PolyBezier()函数可以画出一条或多条函数可以画出一条或多条Bezier曲线,其函数原曲线,其函数原型说明如下:型说明如下: lBOOL CDC: PolyBezier(CONST POINT * lppt, DWORD cPoints); Bezier曲线其其中中,lppt参参数数是是曲曲线线控控制制顶顶点点所所组组成成的的数数组组,cPoints参参数数表表示示lpp

37、t数数组组中中的的顶顶点点数数,一一条条Bezier曲曲线线需需要要四四个个控控制制顶顶点点。如如果果lppt数数组组用用于于画画多多条条Bezier曲曲线线,第第二二条条以以后后的的曲曲线线只只需需要要三三个个控控制制顶顶点点,因因为为后后面面的的曲曲线总是把前一条曲线的终点作为自己的起点。线总是把前一条曲线的终点作为自己的起点。示示例例,给给出出四四个个控控制制顶顶点点,画画出出一一条条Bezier曲曲线线和和特特征多边形。征多边形。/绘制绘制Bezier 曲线曲线POINT polyBezier4=20,310,60,240,120,300,160,330;pDC-Polyline(po

38、lyBezier,4);pDC-PolyBezier(polyBezier,4); (4)画封闭曲线)画封闭曲线 Windows中中提提供供了了一一组组画画封封闭闭曲曲线线的的函函数数,包包括括绘绘制制矩矩形形、多多边边性性、椭椭圆圆等等,这这些些画画封封闭闭曲曲线线的的函函数数不不但但可可以以利利用用画画笔笔来来画画出出轮轮廓廓线线,同同时时还还可可以以利用画刷来填充这些封闭曲线所围成的区域。利用画刷来填充这些封闭曲线所围成的区域。 Rectangle()函数用来画矩形,其函数原型说明如下:函数用来画矩形,其函数原型说明如下: BOOL CDC: Rectangle(int nLeftRec

39、t, int nTopRect, int nRightRect, int nBottomRect); l其其中中,参参数数nLeftRect和和 nTopRect给给出出了了矩矩形形左左上上角角的的坐坐标标,而而nRightRect和和 nBottomRect则则给给出矩形的右下角坐标。出矩形的右下角坐标。lEllipse()函数的作用则是画椭圆形。在函数的作用则是画椭圆形。在Ellipse()函函数中,椭圆是由其外接矩形来确定的,外接矩形数中,椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重合,矩形的长与宽和椭圆的的中心与椭圆中心重合,矩形的长与宽和椭圆的长短轴相等。函数说明如下:长短

40、轴相等。函数说明如下: BOOL CDC: Ellipse(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); 其中的参数说明与其中的参数说明与Rectangle()函数相同。函数相同。 RoundRect()函数用来画圆角矩形,其函数的原型说函数用来画圆角矩形,其函数的原型说明如下:明如下: BOOL CDC: RoundRect(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect,int nWidth, int nHeight); 其中的前四个参数

41、与其中的前四个参数与Rectangle()函数相同,函数相同,nWidth表示圆角的宽度表示圆角的宽度, nHeight表示圆角的高度。表示圆角的高度。 Polygon()函数用来画封闭的任意多边形,其函数原函数用来画封闭的任意多边形,其函数原型说明如下:型说明如下: BOOL CDC: Polygon(COUST POINT *lpPoints, int cCount); 其中的参数说明与其中的参数说明与Polyline()函数相同。但两个函数相同。但两个函数有区别,函数有区别,Polygon()函数会自动将起点和终点相函数会自动将起点和终点相连形成封闭的多边形,而连形成封闭的多边形,而Po

42、lyline()函数则画出多条函数则画出多条折线,只有当最后一点与起点相同时才画出封闭的折线,只有当最后一点与起点相同时才画出封闭的多边形。多边形。 示示例例,绘绘制制矩矩形形、圆圆角角矩矩形形、椭椭圆圆和和多多边边形形,程序如下:程序如下:/绘制矩形、圆角矩形、椭圆和多边形绘制矩形、圆角矩形、椭圆和多边形pDC-Rectangle(190,270,250,310);pDC-RoundRect(265,270,330,310,30,20);pDC-Ellipse(260-50,200-30,260+50,200+30);POINT polygonPts3=390,160,430,220,350

43、,210;pDC-Polygon(polygonPts,3); 2.2.3 画笔与画刷画笔与画刷 (1)画笔)画笔 当当绘绘制制图图形形时时,线线条条的的属属性性,包包括括颜颜色色、宽宽度度、样样式式等等都都是是由由画画笔笔来来确确定定的的。程程序序员员可可以以创创建建画画笔笔,定定义义画画笔笔的的属属性性,从从而而画画出出多多彩彩的图形。的图形。方方法法一一:直直接接构构造造一一个个CPen对对象象,并并将将定定义义画画笔笔的参数传给它,的参数传给它,例如:例如: CPen pen(PS-SOLID,1,RGB(255,0,0); 创建一个宽度为一个像素、实线和红色的画笔。创建一个宽度为一个

44、像素、实线和红色的画笔。 方方法法二二:首首先先声声明明一一个个没没有有初初始始化化的的CPen类类对对象象,然然后再用后再用CreatePen()函数定义画笔的属性。例如,函数定义画笔的属性。例如, CPen Pen; Pen-CreatePen (PS-SOLID,1,RGB(255,0,0);方方法法三三:先先声声明明一一个个CPen类类对对象象和和一一个个描描述述画画笔笔结结构构的的LOGPEN类类对对象象,并并填填入入画画笔笔的的属属性性值值,然然后后调调用用CreatePenIndirect()函数来创建画笔。如下所示:函数来创建画笔。如下所示:CPen Pen;LOGPEN Lo

45、gPen;LogPen.lopnStyle=PS_SOLID;LogPen.lopnWidth=1;LogPen.lpenColor=RGB(255,0,0);Pen.CreatePenIndirect(&LogPen); 如果画笔被成功创建,那么两个函数返回如果画笔被成功创建,那么两个函数返回TRUE,否则返回否则返回FALSE。 画画笔笔包包括括样样式式、宽宽度度和和颜颜色色三三个个属属性性。表表2.2列出了列出了GDI画笔的样式。画笔的样式。l画笔的宽度用像素个数来确定。画笔的宽度用像素个数来确定。PS_DASH、PS_DOT、PS_DASHDOT和和PS_DASHDOTDOT参数要求画

46、笔宽度参数要求画笔宽度只能为只能为1,其它参数可以创建任意宽度的画笔。,其它参数可以创建任意宽度的画笔。l画笔的颜色是一个画笔的颜色是一个24位的位的RGB颜色,由颜色,由RGB(rColor,gColor,bColor)来定义,三个参数取值来定义,三个参数取值0255。lWindows预定义了三个实线、预定义了三个实线、1个像素宽的画笔,它们是个像素宽的画笔,它们是WHITE_PEN、BLACK_PEN和和NULL_PEN,程序中可以程序中可以直接使用这些画笔,方法如下:直接使用这些画笔,方法如下:l CPen Pen;l Pen.CreateStockObject(WHITE_PEN);l

47、示例:示例:在屏幕上绘制三组直线,第一组按不同线型绘制,在屏幕上绘制三组直线,第一组按不同线型绘制,第二组按不同宽度绘制,第三组按不同颜色绘制。程序如第二组按不同宽度绘制,第三组按不同颜色绘制。程序如下:下: /画笔的样式、宽度和颜色画笔的样式、宽度和颜色int i1;int nPenStyle= PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_INSIDEFRAME,;CPen *pNewPen;CPen *pOldPen;/用不同样式的画笔用不同样式的画笔for (i1=0;i1CreatePen(nStylei1,1

48、,RGB(0,0,0)pOldPen=pDC-SelectObject(pNewPen); /选择新笔,选择新笔,并保存旧笔并保存旧笔/画直线画直线pDC-MoveTo(20,60+i1*20);pDC-LineTo(160,60+i1*20);/恢复原有的笔恢复原有的笔pDC-SelectObject(pOldPen);else /出错提示出错提示AfxMessageBox(CreatePen Erroe!); /删除新笔删除新笔delete pNewPen;/用不同的宽度的笔绘图用不同的宽度的笔绘图for(i1=0;i1CreatePen(PS_SOLID,i1+1,RGB(0,0,0)p

49、OldPen=pDC-SelectObject(pNewPen);/画直线画直线pDC-MoveTo(200,60+i1*20);pDC-LineTo(340,60+i1*20);/恢复原有的笔恢复原有的笔pDC-SelectObject(pOldPen);else /出错提示出错提示AfxMessageBox(CreatePen Erroe!);/删除新笔删除新笔delete pNewPen;/设置颜色表设置颜色表 struct tagColor int r,g,b; color7= 255,0,0,0,255,0,0,0,255, 255,255,0,255,0,255,0,255,255

50、,0,0,0, ; /用不同颜色绘图用不同颜色绘图for(i1=0;i1CreatePen(PS_SOLID,2,RGB(colori1.r,colori1.g,colori1.b)pOldPen=pDC-SelectObject(pNewPen);/画直线画直线pDC-MoveTo(380,60+i1*20);pDC-LineTo(520,60+i1*20);/恢复原有的笔恢复原有的笔pDC-SelectObject(pOldPen);else/出错提示出错提示AfxMessageBox(CreatePen Erroe!);/删除新笔删除新笔delete pNewPen;/画笔程序结束画笔程

51、序结束 在进行区域填充或绘制封闭图形时,需要用到画刷。在进行区域填充或绘制封闭图形时,需要用到画刷。MFC把把GDI画刷封装在画刷封装在CBrush类中。画刷分三种基本类型:类中。画刷分三种基本类型:纯色画刷、阴影画刷和图案画刷。纯色画刷、阴影画刷和图案画刷。 纯色画刷纯色画刷绘图使用单色来定义,颜色由绘图使用单色来定义,颜色由RGB()函数来函数来确定。纯色画刷可以采用直接声明的方法,例如:确定。纯色画刷可以采用直接声明的方法,例如: CBrush Brush(RGB(255,0,0); 创建一个红色画刷。创建一个红色画刷。 也可以采用分步方法,由也可以采用分步方法,由CreateSolid

52、Brush()函数创建。函数创建。 CBrush Brush; Brush-Create-CreateSolidBrush(RGB(255,0,0);(2)画刷)画刷Windows预定义了七种画刷预定义了七种画刷,包括:包括:BLACK_BRUSH、 DKGRAY_BRUSH、 GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和和WHITE_BRUSH。可以参照可以参照CPen类的方法,采用类的方法,采用CreateStockObject()来使用预定义的画刷。来使用预定义的画刷。阴影画刷阴影画刷使用预定义的六种阴影样式进行绘图。表使用预定义的六种

53、阴影样式进行绘图。表2.3列列出了六种阴影样式。出了六种阴影样式。 创建阴影画刷的方法与纯色画刷的创建方法相似,例如创创建阴影画刷的方法与纯色画刷的创建方法相似,例如创建一个建一个45度方向的交叉阴影线的画刷,方法如下:度方向的交叉阴影线的画刷,方法如下: CBrush Brush(HS_DIAGCROSS,RGB(255,0,0); 或者或者 CBrush Brush; Brush-CreateHatchBrush (HS_DIAGCROSS,RGB(255,0,0); 函数中有两个参数,第一个参数是画刷的阴影样式,第二函数中有两个参数,第一个参数是画刷的阴影样式,第二个参数是阴影线的颜色。

54、示例:绘制缺省画刷的矩形,纯色画个参数是阴影线的颜色。示例:绘制缺省画刷的矩形,纯色画刷矩形和绘制刷矩形和绘制100单位的矩形,并且用白色单位的矩形,并且用白色45度交叉线阴影将度交叉线阴影将其填充,程序如下:其填充,程序如下:/画刷程序画刷程序pDC-Rectangle(300,300,400,400); /缺省的画刷,白缺省的画刷,白色色/纯色画刷纯色画刷CBrush *pNewBrush1;CBrush *pOldBrush1;pNewBrush1=new CBrush;if (pNewBrush1-CreateSolidBrush(RGB(255,0,0) /选择新画刷选择新画刷 pO

55、ldBrush1=pDC-SelectObject(pNewBrush1);/绘制矩形绘制矩形 pDC-Rectangle(200,200,300,400);/恢复原有画刷恢复原有画刷 pDC-SelectObject(pOldBrush1); delete pNewBrush1;/阴影画刷阴影画刷CBrush Brush(HS_DIAGCROSS,RGB(255,255,255);CBrush *pOldBrush;pOldBrush=pDC-SelectObject(&Brush);pDC-SetBkColor(RGB(192,192,192);pDC-Rectangle(0,0,100,

56、100);pDC-SelectObject(pOldBrush);2.2.4 文本显示文本显示 Windows可以显示很多数据,包括在窗口中显示文可以显示很多数据,包括在窗口中显示文本信息。由于文本是以图像的形式显示在窗口中的,本信息。由于文本是以图像的形式显示在窗口中的,因此需要处理设备描述表(因此需要处理设备描述表(DC),),另外还需要对文本另外还需要对文本字体的处理,包括:文本的显示、文本的颜色、字符字体的处理,包括:文本的显示、文本的颜色、字符的间距和文本的对齐方式等。的间距和文本的对齐方式等。(1)文本显示)文本显示 在拥有一个设备描述表以后,就可以调用在拥有一个设备描述表以后,就

57、可以调用TextOut()函函数来显示文本行。例如:数来显示文本行。例如: pDC-TextOut(20,20,”This is a line of text.”); TextOut()函数的三个参数分别是输出文本的函数的三个参数分别是输出文本的X坐标和坐标和Y坐标以及输出文本串。坐标以及输出文本串。(2)设置文本颜色)设置文本颜色 在默认情况下,在默认情况下,Windows绘制黑色文本。可以通过绘制黑色文本。可以通过SetTextColor()函数改变文本的颜色。例如:函数改变文本的颜色。例如: CDC *pDC=GetDC(); /声明一个设备描述表声明一个设备描述表pDC1 pDC-Se

58、tTextColor(RGB(255,0,0); /设置文本颜色为红色设置文本颜色为红色 可以通过可以通过GetTextColor()函数检索到当前文本的颜色,例如:函数检索到当前文本的颜色,例如: COLORREF color=pDC-GetTextColor(); SetBkColor()和和GetBkColor()函数用于设置背景颜色和获取函数用于设置背景颜色和获取当前的背景颜色。当前的背景颜色。(3)设置字符间距)设置字符间距 SetTextCharacterExtra()函数用来设置文本字符的间距,函数用来设置文本字符的间距,GetTextCharacterExtra()用来获得当前

59、文本字符的间距,函数说明如下:用来获得当前文本字符的间距,函数说明如下: pDC- SetTextCharacterExtra(space); int space=pDC- GetTextCharacterExtra(); 其中,其中,space表示在文本字符之间使用的额外空间的像素数。表示在文本字符之间使用的额外空间的像素数。SetTextAlign()函数用于设置显示文本的对齐方式,函函数用于设置显示文本的对齐方式,函数说明如下:数说明如下: pDC-SetTextAlign(alignment); 其中,其中,alignment参数取值:参数取值:TA_LEFT、TA_CENTER和和T

60、A_RIGHT,分别表示左对齐、居中方分别表示左对齐、居中方法和右对齐。法和右对齐。Alignment参数取值:参数取值:TA_TOP、TA_BOTTOM和和TA_BASELINE分别表示文本在垂直方分别表示文本在垂直方向的对齐方式,上对齐、下对齐和字符的基线对齐。向的对齐方式,上对齐、下对齐和字符的基线对齐。(3)设置文本的对齐方式2.3 鼠标编程鼠标编程 在图形操作系统中,鼠标是最重要的输入设在图形操作系统中,鼠标是最重要的输入设备之一。备之一。Windows系统为用户提供了统一的鼠标系统为用户提供了统一的鼠标编程接口,而不必过多了解其底层的知识。编程接口,而不必过多了解其底层的知识。Wi

61、ndows是基于消息传递、事件驱动的操作系统,是基于消息传递、事件驱动的操作系统,当用户移动鼠标、按下或释放鼠标键时都会产生当用户移动鼠标、按下或释放鼠标键时都会产生鼠标消息。应用程序可以接收鼠标消息。应用程序可以接收10种鼠标消息,表种鼠标消息,表2.3列出了这些鼠标消息和它们的描述。列出了这些鼠标消息和它们的描述。2.3.1 鼠标消息处理鼠标消息处理 MFC把鼠标消息处理函数封装在把鼠标消息处理函数封装在CView类中,它们分类中,它们分别是:别是: OnMouseMove(UINT nFlags, CPoint point); OnLButtonDblclk(UINT nFlags, C

62、Point point); OnLButtonDown(UINT nFlags, CPoint point); OnLButtonUp(UINT nFlags, CPoint point); 分别对应表分别对应表2.3中中10个鼠标消息。在鼠标处理函数中,个鼠标消息。在鼠标处理函数中,point参数代表鼠标热点处的坐标位置,参数代表鼠标热点处的坐标位置,point.x为横坐标,为横坐标,point.y为纵坐标。默认坐标原点为纵坐标。默认坐标原点(0,0)位于窗口的左上角。位于窗口的左上角。由于应用程序要求自动捕获鼠标事件,因此应当采用由于应用程序要求自动捕获鼠标事件,因此应当采用Windows

63、事件处理函数,而不是成员函数,具体使用方法事件处理函数,而不是成员函数,具体使用方法参见参见2.3.3节示例程序。节示例程序。 nFlags参数中包含了鼠标按钮和键盘组合使用标志,参数中包含了鼠标按钮和键盘组合使用标志,用来描述鼠标按钮和键盘上的用来描述鼠标按钮和键盘上的Shift键和键和Ctrl键的组合状键的组合状态。态。nFlag参数取值范围:参数取值范围:MK_LBUTTON:鼠标左键被按下;鼠标左键被按下;MK_RBUTTON:鼠标右键被按下;鼠标右键被按下;MK_MBUTTON:鼠标中键被按下;鼠标中键被按下;MK_SHIFT:键盘上的键盘上的Shift键被按下;键被按下;MK_CO

64、NTROL:键盘上的键盘上的Ctrl键被按下;键被按下; 如果想知道某个键是否被按下,可用对应的位屏蔽如果想知道某个键是否被按下,可用对应的位屏蔽值与值与nFlags参数作按位逻辑参数作按位逻辑“与与”运算,所的结果若运算,所的结果若为非零值,则表示该按钮被按下,例如:为非零值,则表示该按钮被按下,例如:if (nFlags & LBUTTON) AfxMessageBox(“LButton is pressed down!”)Else AfxMessageBox(“LButton is pressed Up!”); 如何区分两次单击和一次双击,这取决于两次按下如何区分两次单击和一次双击,这取

65、决于两次按下按钮之间的时间间隔,只有当时间间隔小于一定值时才按钮之间的时间间隔,只有当时间间隔小于一定值时才被认为是被认为是Windows默认的时间为默认的时间为500ms。可以用可以用SetDoubleClickTime()函数来重新设置时间间隔值。函数来重新设置时间间隔值。 若要使窗口函数能接收到鼠标双击产生的消息,在若要使窗口函数能接收到鼠标双击产生的消息,在注册窗口类时,必须指明该窗口具有注册窗口类时,必须指明该窗口具有CS_DBLCLKS风风格,否则,即使进行了双击操作,该窗口也只能收到两格,否则,即使进行了双击操作,该窗口也只能收到两条条“WM_LBUTTONDOWN”和和“WM_

66、LBUTTONUP”消息,例如:消息,例如:wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;2.3.2 捕捉鼠标捕捉鼠标 在交互式图形程序设计中,经常要使用鼠标在交互式图形程序设计中,经常要使用鼠标的位置拾取、拖动或拖放,这些动作必须进行鼠的位置拾取、拖动或拖放,这些动作必须进行鼠标的捕捉。标的捕捉。 鼠标捕捉只需要调用鼠标捕捉只需要调用CWnd:SetCapture()函数。用户完成鼠标捕捉工作后一般是响应一个函数。用户完成鼠标捕捉工作后一般是响应一个鼠标按下信息,要释放鼠标捕捉则是调用鼠标按下信息,要释放鼠标捕捉则是调用CWnd:Releas

67、eCapture()函数。释放被捕捉鼠标的最好时间是在响应鼠函数。释放被捕捉鼠标的最好时间是在响应鼠标弹起的时候(标弹起的时候(WM_LBUTTON)。)。 2.3.3 鼠标编程综合示例鼠标编程综合示例 示例示例1:在窗口中以文本的形式给出鼠标:在窗口中以文本的形式给出鼠标的状态,即当鼠标移动时,给出鼠标的位置;的状态,即当鼠标移动时,给出鼠标的位置;当鼠标按下鼠标左、右键时显示出鼠标按键状当鼠标按下鼠标左、右键时显示出鼠标按键状态。例如,当鼠标左键按下时,显示态。例如,当鼠标左键按下时,显示“LBUTTON DOWN!”。 第一步:第一步:建立一个建立一个myMouse工程文件;工程文件;

68、第二步:第二步:添加鼠标事件处理函数添加鼠标事件处理函数 鼠标右击视图类(如鼠标右击视图类(如CmyMouseView),),选择选择“add windows message handler”,弹弹出事件处理函数列表窗口,如图出事件处理函数列表窗口,如图2-11所示所示 图2-11 Windows事件处理函数列表窗口 从左边事件消息列表中选择从左边事件消息列表中选择“WM_LBUTTONDOWN”,然后单击然后单击“Add and Edit”按钮,即加入鼠标左键按下事按钮,即加入鼠标左键按下事件函数,并要求编辑事件处理程序。件函数,并要求编辑事件处理程序。 第三步:第三步:输入事件处理程序输入

69、事件处理程序 void CMymouseView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/获得获得pDCCDC* pDC=GetDC();pDC-CView:TextOut(20,40,”LBUTTONDOWM!”); / 输出显示信息输出显示信息OnLButtonDown(nFlags, point); 其中,阴影部分是用户输入的程序,其它内容都其中,阴影部分是用户输入的程序,其它内容都是自动生成的内容。是自动生成的内容。 第

70、四步:第四步:重复第二步和第三步,分别添加重复第二步和第三步,分别添加WM_LBUTTONUP,WM_MOUSEMOVE,WM_RBUTTONDOWN,WM_RBUTTONUP,WM_LBUTTONDBCLK, WM_RBUTTONDBCLK鼠鼠标事件,并输入以下程序:标事件,并输入以下程序:void CMouseView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); pDC-TextOut(20,40,

71、LButton UP!); CView:OnLButtonUp(nFlags, point);void CMouseView:OnRButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC-TextOut(20,60,RButton Down!); CView:OnRButtonDown(nFlags, point);void CMouseView:OnRButtonUp(UINT nFlags, CPoin

72、t point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); pDC-TextOut(20,40,RButton UP!); CView:OnRButtonUp(nFlags, point);void CMouseView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); char tbuf80

73、;sprintf(tbuf,Position:(%3d,%3d),point.x,point.y);/ 输出鼠标当前位置输出鼠标当前位置 pDC-TextOut(20,20,tbuf);CView:OnMouseMove(nFlags, point);void CMouseView:OnLButtonDblClk(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); pDC-TextOut(20,80,LButton is double

74、 clicked!);CView:OnLButtonDblClk(nFlags, point);void CMouseView:OnRButtonDblClk(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); pDC-TextOut(20,80,RButton is double clicked!);CView:OnRButtonDblClk(nFlags, point);第五步:第五步:编译程序,并验证执行结果。编译程序,并验证执

75、行结果。 鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画圆技术圆技术(简称简称C+P方法方法),首先用鼠标左击选择圆心位置,首先用鼠标左击选择圆心位置,然后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击然后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击鼠标左键时,确定圆周上的一点,从而画出相应的圆。直鼠标左键时,确定圆周上的一点,从而画出相应的圆。直线、矩形等基本图形都可以采用橡皮筋技术。线、矩形等基本图形都可以采用橡皮筋技术。 第一步:第一步:建立建立MouseSpring工程文件;工程文件; 第二步:第二步:向视图类中添加自定义的成员变量向视图

76、类中添加自定义的成员变量 用鼠标右键单击视图类,选择用鼠标右键单击视图类,选择“Add Member Variable”,添加下面三个成员变量。添加下面三个成员变量。proctected : CPoint m_bO; / 圆心圆心 CPoint m_bR; /圆上的点圆上的点 int m_ist; /圆心与圆周上点的区别,圆心与圆周上点的区别,m_ist=0,表示鼠表示鼠标左击点为圆心,标左击点为圆心,m_ist=1,表示鼠标左击点为圆周上的点表示鼠标左击点为圆周上的点 示例2:采用鼠标橡皮筋技术画圆图图2-13 添加成员变量添加成员变量操作方法如图操作方法如图2-13所示,分别添加上述三个成

77、员变量。所示,分别添加上述三个成员变量。第三步:第三步:向视图类中添加自定义的成员函数原型:向视图类中添加自定义的成员函数原型: public: void DrawCircle(CDC* pDC, CPoint cenp, CPoint ardp); int ComputeRadius(CPoint cenp,CPoint ardp); 具体操作方法:用鼠标右键单击视图类,选择具体操作方法:用鼠标右键单击视图类,选择“Add Member Function”,如图如图2-14所示。分别添加上述两个所示。分别添加上述两个成员函数,分别用于画圆和计算圆的半径。成员函数,分别用于画圆和计算圆的半径。

78、图图2-14 添加成员函数添加成员函数 第四步:第四步:在视图类在视图类CPP文件的构造函数中初始化成员变量文件的构造函数中初始化成员变量 视图类的构造函数名与该视图类的名字相同。在视视图类的构造函数名与该视图类的名字相同。在视图类中选择构造函数,如:图类中选择构造函数,如:CMouseSpringView(),用用鼠标左键双击,输入下面程序代码:鼠标左键双击,输入下面程序代码:CMouseSpringView: CMouseSpringView() /TODO: add construction code here m_bO.x=0; m_bO.y=0; /圆心圆心 m_bR.x=0; m_

79、bR.y=0; /圆上的点圆上的点 m_ist=0; /圆心与圆上的点区别圆心与圆上的点区别第五步:第五步:在视图类的在视图类的OnDraw()函数中加入下列代函数中加入下列代码,实现视图绘图。码,实现视图绘图。 void CMouseSpringView:OnDraw(CDC* pDC)CMouseSpringDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); / TODO: add draw code for native data herepDC-SelectStockObject(NULL_BRUSH);DrawCircle(pDC,m_bO,m

80、_bR); / 调用自定义调用自定义的成员函数画圆的成员函数画圆第六步:第六步:向视图类中添加两个鼠标消息响应函数,向视图类中添加两个鼠标消息响应函数,并输入鼠标处理程序代码。并输入鼠标处理程序代码。 具体操作方法与鼠标示例具体操作方法与鼠标示例1方法相同。一个是方法相同。一个是OnLButtonDown()函数,另一个是函数,另一个是OnMouseMove()函数。程序如下:函数。程序如下:void CMouseSpringView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code h

81、ere and/or call defaultCDC *pDC=GetDC(); pDC-SelectStockObject(NULL_BRUSH);if (!m_ist) /绘制圆绘制圆 m_bO=m_bR=point; /纪录第一次单击鼠标位置,定圆纪录第一次单击鼠标位置,定圆心心 m_ist+;else m_bR=point; /记录第二次单击鼠标的位置,定圆周上的点记录第二次单击鼠标的位置,定圆周上的点 m_ist-; / 为新绘图作准备为新绘图作准备 DrawCircle(pDC,m_bO,m_bR); /绘制新圆绘制新圆ReleaseDC(pDC); /释放设备环境释放设备环境CV

82、iew:OnLButtonDown(nFlags, point);void CMouseSpringView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); int nDrawmode=pDC-SetROP2(R2_NOT); /设置异或设置异或绘图模式,并保存原来绘图模式绘图模式,并保存原来绘图模式pDC-SelectStockObject(NULL_BRUSH);if(m_ist=1)CPoint pr

83、ePnt,curPnt;prePnt=m_bR; /获得鼠标所在的前一位置获得鼠标所在的前一位置curPnt=point;/绘制橡皮筋线绘制橡皮筋线DrawCircle(pDC,m_bO,prePnt); /用异或模式重复用异或模式重复画圆,擦出所画的圆画圆,擦出所画的圆 DrawCircle(pDC,m_bO,curPnt); /用当前位置作为用当前位置作为圆周上的点画圆圆周上的点画圆m_bR=point; pDC-SetROP2(nDrawmode); /恢复原绘图模式恢复原绘图模式ReleaseDC(pDC); /释放设备环境释放设备环境CView:OnMouseMove(nFlags,

84、 point);分别为两个成员函数分别为两个成员函数DrawCircle()和和ComputeRadius()添加程序代码,程序如下:添加程序代码,程序如下:void CMouseSpringView:DrawCircle(CDC *pDC, CPoint cenp, CPoint ardp) int radius=ComputeRadius(cenp,ardp); / 由圆心确定所画圆的外切区域由圆心确定所画圆的外切区域 CRect rc(cenp.x-radius,cenp.y-radius,cenp.x+radius,cenp.y+radius); pDC-Ellipse(rc); /画

85、出一个整圆画出一个整圆 第七步:第七步:添加成员函数的程序代码。添加成员函数的程序代码。int CMouseSpringView:ComputeRadius(CPoint cenp, CPoint ardp) int dx=cenp.x-ardp.x; int dy=cenp.y-ardp.y; /sqrt()函数的调用,在头文件中加入函数的调用,在头文件中加入#include math.h return (int)sqrt(dx*dx+dy*dy);第八步:第八步:编译运行程序,验证运行结果。编译运行程序,验证运行结果。2.4 菜单程序设计菜单程序设计 在在Windows应用程序设计中,菜单

86、是重要应用程序设计中,菜单是重要的用户界面对象和交互手段。的用户界面对象和交互手段。Windows支持三支持三种类型的菜单,他们分别是菜单栏种类型的菜单,他们分别是菜单栏(主菜单主菜单)、弹、弹出式菜单和上下文菜单出式菜单和上下文菜单(单击鼠标右键弹出的浮单击鼠标右键弹出的浮动菜单动菜单)。 本节主要介绍如何对菜单进行编辑、如何响本节主要介绍如何对菜单进行编辑、如何响应菜单的消息、如何运用菜单的应菜单的消息、如何运用菜单的UI机制、如何动机制、如何动态地改变菜单以及如何处理上下文菜单。态地改变菜单以及如何处理上下文菜单。2.4.1 菜单编辑器菜单编辑器 菜单编辑器用来创建并编辑菜单资源,是一个

87、可视菜单编辑器用来创建并编辑菜单资源,是一个可视化设计工具。对于化设计工具。对于MDI应用程序(多文档应用程序),应用程序(多文档应用程序),AppWizard自动生成两个菜单资源:自动生成两个菜单资源:IDR_MAINFRAME和和IDR_PrjNameTYPE (PrjName是应用程序工程名是应用程序工程名)。在。在MDI子窗口打开之前系统显示子窗口打开之前系统显示IDR_MAINFRAME菜单,菜单,在在MDI子窗口打开之后系统显示子窗口打开之后系统显示IDR_ PrjNameTYPE菜单。菜单。对于对于SDI应用程序,应用程序,AppWizard只生成一个菜单资源:只生成一个菜单资源

88、:IDR_MAINFRAME。 在一个在一个SDI文档工程项目中,在工作区窗口种选择文档工程项目中,在工作区窗口种选择ResourceView标签,列出工程项目的所有资源,选择标签,列出工程项目的所有资源,选择Menu,双击双击IDR_MAINFRAME,弹出菜单编辑器窗口,弹出菜单编辑器窗口,如图如图2-15所示。所示。图图2-15 菜单编辑器菜单编辑器 在图在图2-15中,可以创建主菜单,也可以创建菜单选项。中,可以创建主菜单,也可以创建菜单选项。可以通过可以通过Tab键键(向右移向右移)、Shift+Tab键键(向左移向左移),或鼠标,或鼠标定位,通过定位,通过Ins键在某一菜单前插入新

89、的菜单。另外,用鼠键在某一菜单前插入新的菜单。另外,用鼠标拖动菜单方框可以改变菜单项的相对位置。例如,在查标拖动菜单方框可以改变菜单项的相对位置。例如,在查看菜单前插入一个看菜单前插入一个“绘图绘图”菜单,包括直线、圆、矩形和菜单,包括直线、圆、矩形和颜色四个菜单项。颜色四个菜单项。 步骤步骤1:定位到定位到“查看查看”菜单,按下菜单,按下Ins键或键或Insert键,键,插入一个空菜单项;通过插入一个空菜单项;通过Delete键删除一个菜单项;键删除一个菜单项; 步骤步骤2:双击空菜单项,弹出菜单项对话框,并输入双击空菜单项,弹出菜单项对话框,并输入菜单信息,如图菜单信息,如图2-16所示。

90、所示。(1) 创建菜单和菜单选项创建菜单和菜单选项图图2-16 菜单对话框菜单对话框 双击双击“绘图绘图”菜单下的空菜单项,弹出菜单项菜单下的空菜单项,弹出菜单项对话框。如图对话框。如图2-17所示。所示。图图2-17 菜单项对话框菜单项对话框步骤步骤3:添加菜单项条目。添加菜单项条目。 在菜单设计中,可以为菜单或菜单项定义助记符,方在菜单设计中,可以为菜单或菜单项定义助记符,方法是在响应的字符前加符号法是在响应的字符前加符号&。菜单项的。菜单项的ID号,可以选取号,可以选取已有的已有的ID号,也可以自定义号,也可以自定义ID号,如果不输入号,如果不输入ID号,则系号,则系统自动生成一个统自动

91、生成一个ID号。另外,在菜单项对话框中还可以为号。另外,在菜单项对话框中还可以为菜单项指定风格。另外,还可以为菜单项定义快捷键,方菜单项指定风格。另外,还可以为菜单项定义快捷键,方法是在标题后直接输入,转义符法是在标题后直接输入,转义符t表示快捷键左对齐。表示快捷键左对齐。 步骤步骤4:重复第重复第3步,完成菜单设计。步,完成菜单设计。(2)弹出菜单的设计弹出菜单的设计 弹出菜单就是主菜单项的子菜单,也称为级联弹出菜单就是主菜单项的子菜单,也称为级联菜单。菜单。 创建级联菜单的方法如下:选择级联菜单项,创建级联菜单的方法如下:选择级联菜单项,在该菜单项属性对话框中选中在该菜单项属性对话框中选中

92、“弹出弹出”(Pop-up)复选项,于是该项便被标记级联菜单符复选项,于是该项便被标记级联菜单符(),且在该项的右侧出现新的菜单项空方框。添加,且在该项的右侧出现新的菜单项空方框。添加级联菜单项的方法与上述方法相同。如图级联菜单项的方法与上述方法相同。如图2-18所所示。示。 图图2-18 级联菜单设计级联菜单设计 单击鼠标右键将弹出相应的上下文菜单。为了在应用单击鼠标右键将弹出相应的上下文菜单。为了在应用程序中使用上下文菜单,首先要创建菜单本身,然后将其程序中使用上下文菜单,首先要创建菜单本身,然后将其与应用程序代码链接。创建上下文菜单的步骤如下:与应用程序代码链接。创建上下文菜单的步骤如下

93、: 步骤步骤1:创建带空标题的菜单栏。右击创建带空标题的菜单栏。右击Menu,选择选择“Insert”,创建一个空的菜单栏;创建一个空的菜单栏; 步骤步骤2:输入菜单标题和菜单项,并保存菜单资源,输入菜单标题和菜单项,并保存菜单资源,默认为默认为IDR_MENI1; 步骤步骤3:在源文件中添加下列程序代码:在源文件中添加下列程序代码: CMenu menu; / 装载并验证菜单资源;装载并验证菜单资源;(3) 上下文菜单上下文菜单VERIFY(menu.LoadMenu(IDR_MENU1);CMenu *pPopup=menu.GetSubMenu(0);ASSERT(pPopup!=NUL

94、L);/显示菜单内容显示菜单内容pPopup-TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,x,y,AfxGetMainWnd(); 在创建上下文菜单资源后,应用程序代码装载菜单在创建上下文菜单资源后,应用程序代码装载菜单资源并使用函数资源并使用函数TrackPopupMenu()来显示菜单内容。来显示菜单内容。2.4.2 菜单消息响应菜单消息响应 Windows应用程序是通过消息传递机制运应用程序是通过消息传递机制运行的。为菜单项添加相应功能函数的方法步骤:行的。为菜单项添加相应功能函数的方法步骤: 步骤步骤1:右击所选菜单项,从弹出的菜单中右击

95、所选菜单项,从弹出的菜单中选择选择“建立类向导建立类向导”,弹出类向导对话框,如,弹出类向导对话框,如图图2-19所示;所示; 图2-19 建立类向导对话框步骤步骤2:选择工程名(选择工程名(Project:),),并在类名并在类名(Class name:)中选择视图类,在中选择视图类,在Object IDs:列表中选择菜单项的列表中选择菜单项的ID号,在号,在Messages:列表中列表中选择选择COMMAND;步骤步骤3:单击单击“Add Function”,添加成员函数;添加成员函数;步骤步骤4:选择该成员函数,单击选择该成员函数,单击“Edit Code”输入输入或编辑程序代码。或编辑

96、程序代码。2.4.3 综合示例综合示例 利用菜单资源编辑器在默认的菜单中添加利用菜单资源编辑器在默认的菜单中添加“字体字体”菜单项。在程序运行过程中改变菜单项菜单项。在程序运行过程中改变菜单项的显示状态。的显示状态。 步骤步骤1:创建创建Mymenu应用程序工程文件,应用程序工程文件,选择单文档应程序;选择单文档应程序; 步骤步骤2:利用利用Resource View设计菜单,设计菜单,如图如图2-20所示;所示;图图2-20 菜单设计示例菜单设计示例 添加方法:选择添加方法:选择ViewClassWizard菜单项,弹出如菜单项,弹出如图图2-19所示的创建类对话框,从中选择工程名所示的创建

97、类对话框,从中选择工程名(Projects)和类名和类名(Class name),并从并从Object IDs列表框中选择列表框中选择ID_FONTCOLOR1项,在项,在Messages列表框中选择列表框中选择COMMAND,然后,单击然后,单击“Add Function”按钮,弹出加按钮,弹出加入成员函数的对话框,输入成员函数名入成员函数的对话框,输入成员函数名OnFontcolor1,确确定后就添加了定后就添加了OnFontcolor1消息映射函数。消息映射函数。 参照以上方法,添加上表中其他的函数。参照以上方法,添加上表中其他的函数。步骤步骤4:在在CMymenuView类中添加成员变

98、量和成员函数类中添加成员变量和成员函数 方法参见鼠标编程中的示例方法参见鼠标编程中的示例2,在,在CMymenuView类类中添加上述的成员变量和成员函数。中添加上述的成员变量和成员函数。步骤步骤5:编写编写CTestMenuView: CMymenuView构造函数构造函数CTestMenuView:CTestMenuView()/ TODO: add construction code here m_FontColor=RGB(0,0,0); /设置默认的颜色设置默认的颜色步骤步骤6:编写编写CMymenuView:OnDraw()函数。函数。void CTestMenuView:OnDr

99、aw(CDC* pDC)CTestMenuDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereRedraw(pDC);步骤步骤7:分别编写步骤分别编写步骤3添加的添加的3个函数,程序如下:个函数,程序如下:void CMymenuView:OnFontcolor1() / TODO: Add your command handler code herem_FontColor=RGB(250,0,0);CDC * pDC=GetDC();Redraw(pDC);void CM

100、ymenuView:OnFontcolor2() / TODO: Add your command handler code herem_FontColor=RGB(0,250,0);CDC * pDC=GetDC();Redraw(pDC); void CMymenuView:OnFontcolor3() / TODO: Add your command handler code herem_FontColor=RGB(0,0,250);CDC * pDC=GetDC();Redraw(pDC);步骤步骤8:编写编写CTestMenuView:Redraw()函数函数void CMymenuView:Redraw(CDC *pDC)/设置文本颜色,显示测试内容设置文本颜色,显示测试内容 pDC-SetTextColor(m_FontColor);pDC-TextOut(30,30,菜单测试程序菜单测试程序!);步骤步骤9:编译和运行程序,查看程序运行结果。编译和运行程序,查看程序运行结果。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号