计算机图形学ppt.ppt

上传人:仙人指路1688 文档编号:2205056 上传时间:2023-01-30 格式:PPT 页数:128 大小:5.14MB
返回 下载 相关 举报
计算机图形学ppt.ppt_第1页
第1页 / 共128页
计算机图形学ppt.ppt_第2页
第2页 / 共128页
计算机图形学ppt.ppt_第3页
第3页 / 共128页
计算机图形学ppt.ppt_第4页
第4页 / 共128页
计算机图形学ppt.ppt_第5页
第5页 / 共128页
点击查看更多>>
资源描述

《计算机图形学ppt.ppt》由会员分享,可在线阅读,更多相关《计算机图形学ppt.ppt(128页珍藏版)》请在三一办公上搜索。

1、第二章 Visual C+绘图基础,本章学习目标:,MFC上机操作步骤Visual C+6.0基本绘图函数,2,本章内容,复习类和对象2.1 MFC上机操作步骤2.2 基本绘图函数2.3 本章小结2.4 习题,3,关于工具Visual C+6.0,是目前使用极为广泛的可视化编程平台。使用VC+开发的图形,与使用Turbo C开发的图形相比,不仅可以显示真彩色,而且可以实现交互式绘图。,4,2.1 类和对象(复习),类的定义(格式)class 类名 public:数据成员和成员函数的声明;private:数据成员和成员函数的声明;protected:数据成员和成员函数的声明;,类是用户自己定义的

2、一种数据类型,是封装属性和操作的基本单元。,类的属性用数据成员表示,类的操作用成员函数表示。,5,1 类的定义,对象是用“类”类型定义的“变量”,称为类的实例。【格式】类名 对象表列();Rect myrect,rect;Rect myrect(30,20);一个类被定义后,并不占用内存空间,只有当类被实例化为对象后,自动调用构造函数,对象才占用内存空间类是永恒的,对象是暂时的.,6,2.1.2 构造函数和析构函数,构造函数和析构函数是负责对象的创建和撤销的特殊成员函数。构造函数的作用是创建对象时对数据成员进行初始化构造函数的名称与类名相同析构函数的作用是撤销对象时清理对象占用的内存空间析构函

3、数的名称是由构造函数名称前加上取反运算符“”构成二者都没有数据类型和返回值且不需要用户调用,在创建和撤销对象时由系统自动执行。,7,class Rect/定义长方形类 public:Rect(int,int);/声明带参构造函数 Rect();/声明析构函数 double circum();/声明周长函数,成员函数(操作)double area();/声明面积函数,成员函数(操作)private:int length,width;/声明长方形的长度和宽度,数据成员(属性);Rect:Rect(int len,int w)/定义带参构造函数,对数据成员初始化,:表示作用域,表示成员函数的归属le

4、ngth=len;width=w;cout 建立对象 endl;Rect:Rect()/定义析构函数 cout 撤销对象 endl;double Rect:circum()/定义周长函数 return 2*(length+width);double Rect:area()/定义面积函数 return length*width;,类型说明符 类名:成员函数名()函数体;,8,2.1.3 对象的动态建立和释放,使用new和delete运算符可以根据需要动态的建立和撤销对象使用new 运算符建立的动态对象是无名对象,不能通过对象名调用,只能通过指针访问Rect*p=new Rect(30,20);用

5、 new 动态分配指定大小的存储空间后,返回一个指向该对象的指针,即所分配的存储空间的起始地址,可以通过指针 p 来访问该对象。P-circum();Delete p;,9,2.1.4 继承与派生,继承是指在已有类的基础上增加新的内容创建一个新类。在继承过程中,已经存在的类称为基类,新创建的类称为派生类。派生类的定义 class 派生类名:继承方式基类名 派生类新增加的数据成员和成员函数;继承方式包括 3 种:公有继承 public、私有继承 private 和保护继承 protected。继承方式可以缺省,默认为私有继承。,10,2.1.4 继承与派生,【注意】基类的构造函数是不能被继承的,

6、对继承过来的基类数据成员的初始化工作要由派生类的构造函数来完成,需要在定义派生类的构造函数时,调用基类的构造函数。派生类的构造函数的定义 派生类构造函数名(总参数表列):基类构造函数名(参数表列)派生类中新增数据成员初始化语句,11,2.1.4 继承和派生例,从已有的长方形类 Rect 继承出长方体类 Cube,增加高度数据成员 height 和计算体积成员函数 volume()。,12,class Cube:public Rect/公有继承派生类 public:Cube(int len,int w,int h);Cube();double volume();/新增面积成员函数 private

7、:int height;/新增高度数据成员;Cube:Cube(int len,int w,int h):Rect(len,w)/派生类构造函数 height=h;Cube:Cube()/派生类析构函数 double Cube:volume()/派生类体积函数 return length*width*height;,13,Microsoft Foundation Class Library(MFC)以C+形式封装的Windows API(Application Program Interface),包含了一百多个已经定义好的常用类。,MFC的上机操作过程,14,MFC的上机操作过程,启动Mic

8、rosoft Visual C+6.0从【File】菜单中选择【New】命令,弹出【New】对话框,切换到【Projects】选项卡。在左边窗口中选择MFC AppWizard(exe),在右边的Projects name文本框中键入应用程序名,这里输入Test,在Location文本框中出现用于存放应用程序的根目录,这里设置为D:Test。其余保持默认值。如图所示。单击【OK】按钮。,15,在对话框【MFC AppWizard-Step1】中,选中Single Document单选按钮,其余保持默认值,如图所示。单击【Finish】按钮结束。,16,如果本应用程序不需要任何形式的数据库支持,

9、选择“None”;如果本应用程序需要访问数据库,但不需要派生自己的视图类,选择“Header files only”;如果本应用程序需要派生自己的视图类来显示数据库中的记录,但不需要附加的文件存取功能,选择“Database view without file support”;如果本应用程序既需要派生自己的视图类来显示数据库中的记录,又需要附加的文件存取功能,则选择“Database view with file support”;如果选择了任何一种形式的数据库支持,“Data Source”按钮将变为有效,用户可以由此选择本应用程序将要处理的数据库的名称。,Step2,17,如果不需要任何

10、形式的ActiveX技术支持,选择“None”;如果本应用程序需要作为一个ActiveX容器,即能够包含外来ActiveX对象,选择“Container”;如果本应用程序需要作为一个ActiveX服务器,即自己的内容可以作为ActiveX对象嵌入其他程序中,但不需要独立运行,选择“Mini-server”;如果本应用程序既需要作为一个ActiveX服务器,又需要独立运行,选择“Full-server”;如果本应用程序既需要作为一个ActiveX容器,又需要作为一个ActiveX服务器,选择“Both container and server”。如果选择了应用程序支持ActiveX技术可以作为容

11、器或服务器,还可以选择是否支持Active文档和复合文件。另外,即使本应用程序既不是容器也不是服务器,还可以选择是否支持Automation和ActiveX控件,Step3,18,浮动工具栏(Docking toolbar):AppWizard可以为应用程序提供一个缺省的工具栏,包含一系列常用的按钮,如新建、打开和保存文件等。用户可以按自己的要求添加或删除按钮,或改变工具栏的外观。初始状态栏(Initial status bar):AppWizard可以为应用程序提供一个缺省的状态栏,包含一系列常用的指示器,如指示Caps Lock、Num Lock的状态。用户同样可以按自己的要求定制状态栏。

12、打印和打印预览(Printing and print preview):AppWizard将在应用程序中插入一部分代码,完成基本的打印和打印预览任务,用户可以在此基础上进行完善。上下文相关帮助(Context-sensitive Help):AppWizard提供相应的代码和资源,为用户建立一个基本的帮助系统,具体的内容需要由用户自己完成。3D控件(3D controls):比平面的控件更有立体感,更美观。消息收发支持(MAPI):AppWizard提供相应的代码,使得应用程序可以通过MAPI发送电子邮件、传真或其他消息。插口支持(Windows Sockets):应用程序可以通过HTTP、F

13、TP等协议访问互联网。,Step4,19,Step5,20,Step6,21,最后检查列出的本项目的所有设置是否符合自己的需要,22,完成上述步骤后,应用程序Test的框架即被生成,出现程序工作区。如图所示。,23,在项目工作区的【ClassView】(类视图)面板中显示了项目Test,以及Test中的类和类的属性和操作,就象在资源管理器中一样,类视图中的对象可以一层一层地展开,直至最底层的对象。,CTestApp是应用的主函数类,用来处理消息。MFC中的数据是存储在CTestDoc类文档中,文档类负责管理和维护数据本身。结果的显示是在CTestView类中,视图类负责处理用户鼠标和键盘的操作

14、GLOBALS 可以在类定义外的任何地方定义全局变量或函数,24,【ClassView】中图标含义 粉红立方体:公有成员函数 银锁+粉红立方体:私有成员函数 黄钥匙+粉红立方体:保护成员函数 绿立方体:公有成员变量 银锁+绿立方体:私有成员变量 黄钥匙+绿立方体:保护成员变量,25,在项目工作区的【Resource View】面板中显示当前项目所创建的资源,如菜单、工具栏、对话框等等。,26,在项目工作区的【FileView】面板中显示源程序文件,主要包括程序源文件(*.CPP)、头文件(*.h)和资源文件(*.ico、*.bmp等),27,全部展开FileView面板后,显示如图的界面内容后

15、续的编程过程中一般使用的是CTestView类的TestView.h头文件和TestView.cpp源文件。,28,OnDraw(CDC*pDC)函数,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC定义为CDC类的指针。pDoc通过GetDocument()函数得到了指向文档类CTestDoc的指针。,29,OnDraw(CDC*pDC)函数,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID

16、(pDoc);ASSERT_VALID(pDoc)函数使pDoc指针有效。使用pDC指针,可以对CDC类的成员函数进行操作。注意:OnDraw函数是由系统框架直接调用的,程序一运行就会自动执行。,30,!按钮,点击工具条上的“!”按钮,就可以直接编译、运行程序尽管未编写一句代码,但Test程序已经形成一个可执行程序框架,返回,31,32,33,2.2 基本绘图函数,在Windows平台上,应用程序的图形设备接口(Graphics Device Interface,GDI)被抽象化为设备上下文(Device Content,DC)在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图

17、函数都在CDC基类中定义。,34,2.2节内容,2.2.1 CDC类结构和GDI对象2.2.2 映射模式2.2.3 CDC类的主要绘图成员函数2.2.4 设备上下文的调用和释放2.2.5 VC+绘制图形的几种方法,2.2.1 CDC类结构和GDI对象,36,CDC类有4个派生类,37,CClientDC类,显示器客户区设备上下文类CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏的空白区域)进行绘图点(0,0)是客户区的左上角其构造函数调用GetDC函数其析构函数调用ReleaseDC函数,38,CMetaFileDC类,Windows图元文件设备上下文类CMetaFi

18、leDC封装了在一个Windows图元文件中绘图的方法图元文件是一系列与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用例如,AutoCAD中的图形保存等。,39,CPaintDC类,该类一般用在响应WM_PAINT消息的成员函数函数OnPaint()中 使用WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消息。当程序中的消息循环接到WM_PAINT消息时就自动调用消息处理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过CPaintDC类的对象就可以使用CDC类的成员函数完成视图客户区中的图形绘制操作。CPai

19、ntDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。,40,CWindowDC类,整个窗口区域的显示器设备上下文类,包括客户区和非客户区(即窗口的边框、标题栏、菜单栏以及状态栏)CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角其构造函数调用Ge

20、tWindowDC其析构函数调用ReleaseDC,41,CWindowDC类与CPaintDC、CClientDC类的区别主要有以下两个方面:(1)用CPaintDC 和CClientDC类的对象绘制图形时,绘制区只能在客户区,而不能在非客户区;而CwindowDC类既可以在窗口的客户区也可以在非客户区进行图形绘制。(2)在CWindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕的左上角;而在CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。,42,CPaintDC类与CClientDC类的区别

21、CPaintDC类的对象应用在OnPaint函数中,以响应Windows的WM_PAINT消息;而CClientDC类的对象应用在非响应消息WM_PAINT的情况下。CPaintDC类响应WM_PAINT消息,并自动完成绘制,这对维护图形的完整性有着重要的作用。CClientDC类可以实时地将图形绘制到屏幕上,不需要重画;而如果用CPaintDC类的对象完成同样的工作,只能发出消息让屏幕上包含图形的区域重画,以把图形绘制到屏幕上。,2.常用绘图类,44,常用绘图类,45,常用绘图类,CPoint类:存放点坐标(x,y)。CRect类:存放矩形左上角顶点和右下角顶点的坐标(top,left,ri

22、ght,bottom)Csize类:存放矩形的宽度和高度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的高度。,3.绘图工具类,47,绘图工具类,48,绘图工具类,CGdiObject类:GDI绘图工具的基类,一般不能直接使用。CBitmap:封装了一个GDI位图,提供位图操作的接口。CBrush类:封装了GDI画刷,可以选作设备上下文的当前画刷。画刷用于填充图形内部。,49,绘图工具类,CFont:封装了GDI字体,可以选作设备上下文中的当前字体。CPallette:封装了GDI调色板,提供应用程序和显示器之间的颜色接口。CPen:封装了GDI画笔,可以选作设备上下文的当前画笔。画笔

23、是用于绘制图形边界线。,50,2.2.2 映射模式,当Windows应用程序在其客户区绘制图形时,必须给出在客户区的位置,其位置用x和y 两个坐标表示,x表示横坐标,y表示纵坐标。在所有的绘制函数中,这些坐标使用的是一种“逻辑单位”。当绘图函数函数将输出送到某个物理设备上时,Windows将逻辑坐标转换成设备坐标(如屏幕或打印机的像素点)。如:当程序员在调用一个画线函数LineTo,画出25.4mm(1英寸)长的线时,他给定的参数就是实际长度25.4。但是绘制在屏幕上到底多长将由映射模式确定,51,2.2.2 映射模式,映射模式定义了Windows如何将绘图函数中指定的逻辑坐标映射为设备坐标输

24、出到显示器或者打印机上。映射模式中常用术语:逻辑坐标所在的坐标系称为“窗口”,设备坐标所在的坐标系称为视口。在所有的设备坐标系统中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。,52,如何理解映射模式,CDC分别提供GetViewportOrg(),GetWindowOrg()来取得Viewport和Window的原点坐标 GetViewportExt(),GetWindowExt()来取得Viewport和Window大小(分别基于他们各自的度量单位)对于所有映射模式,Windows都用下面两个公式将窗口坐标转换成视口坐标:xViewport=(xWindow-xWinOrg)

25、*(xViewExt/xWinExt)+xViewOrgyViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg,53,映射模式(2-1),54,映射模式,55,映射模式,在缺省情况下,一般使用的是设备坐标系MM_TEXT,坐标原点位于客户区的左上角,X轴水平向右,Y轴垂直向下,坐标基本单位为一个像素。,56,1.设置映射模式函数,类属:CDC:SetMapMode原型:virtual int SetMapMode(int nMapMode);返回值:原映射模式。参数说明:nMapMode是表2-1的模式代码。,57,2.设置窗口范围函数,

26、类属:CDC:SetWindowExt 原型:virtual CSize SetWindowExt(int cx,int cy);返回值:原窗口范围的CSize对象。参数说明:cx窗口x范围的逻辑坐标,cy窗口y范围的逻辑坐标。,58,3.设置视区范围函数,类属:CDC:SetViewportExt 原型:virtual CSize SetViewportExt(int cx,int cy);返回值:原视区范围的CSize对象。参数说明:cx视区x范围的逻辑坐标,cy视区范围的逻辑坐标。,59,4.设置视区坐标原点函数,类属:CDC:SetViewportOrg 原型:virtual CPoi

27、nt SetViewportOrg(int x,int y);返回值:原视区原点的CPoint对象。参数说明:参数x,y是视区的新原点坐标。,2.2.3 CDC类的主要绘图成员函数,61,1.绘制像素函数,类属:CDC:SetPixel 原型:COLORREF SetPixel(int x,int y,COLORREF crColor);设置某像素点的RGB值,62,1.绘制像素函数,参数说明:SetPixel 函数中,COLORREF是32位颜色数据类型;第一和第二个参数x,y是像素点位置的逻辑坐标值,第三个参数crColor是像素点的颜色值,COLORREF型变量可以利用RGB(bRed,

28、bGreen,bBlue)来指定相应的颜色值,每种颜色用一个字节表示,可以被设定为0255之间的任意值,0代表无色,255代表全色。,63,2.获取像素颜色函数,类属:CDC:GetPixel 原型:COLORREF GetPixel(int x,int y)const;返回值:指定像素的RGB值。参数说明:得到指定像素的RGB颜色值,64,例4 在屏幕的(20,20)坐标位置处绘制一个红色像素点。然后取出该像素点的颜色,在屏幕的(60,20)坐标处绘制一个相同颜色的像素点。,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();A

29、SSERT_VALID(pDoc);COLORREF c;pDC-SetPixel(20,20,RGB(255,0,0);c=pDC-GetPixel(20,20);pDC-SetPixel(60,20,c);,65,66,3.画笔函数,画笔用来绘制直线、曲线或图形的边界线,是绘图工具类之一画笔通常具有线型、宽度和颜色三种属性画笔的线型通常有实线、虚线、点线、点划线、双点划线、不可见线和内框架线7种,这些线型都是以PS_为前缀的预定义标识符,67,画笔的风格,68,3.画笔函数,默认的画笔是一个像素单位的黑色实线要想更换画笔(自定义画笔)创建新画笔对象将其选入设备上下文,就可使用新画笔进行绘图

30、。,69,(1)创建画笔函数,类属:CPen:CreatPen 原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);返回值:非零。参数说明:第一个参数nPenStyle是画笔的风格代码第二个参数nWidth是画笔的宽度第三个参数crColor是画笔的颜色。,70,(2)选择画笔函数,类属:CPen:SelectObject 原型:Cpen*SelectObject(Cpen*pPen);返回值:被替代画笔的指针。参数说明:参数pPen是Cpen类的被选中的新画笔对象指针。本函数把原画笔换成新画笔,同时返回指向原画笔的指针。,

31、71,(3)删除画笔函数,类属:CGdiObject:DeleteObject 原型:BOOL DeleteObject();返回值:非零。参数说明:画笔使用完毕,把已成自由状态的画笔从系统内存中清除。,72,(4)选择一支库画笔函数,Windows系统中准备了一些使用频率较高的画笔,不需要创建,可以直接选用。同样,使用完库画笔时也不需要调用DeleteObject()函数从内存中删除已使用过的画笔。类属:CDC:SelectStockObject 原型:virtual CGdiObject*SelectStockObject(int nIndex);返回值:被替代的CGdiObject类对象

32、的指针。参数说明:参数nIndex是库笔代码,73,三种常用库笔,74,4.画刷函数,VC+中的画刷用于对图形内部进行填充,也是绘图工具类之一在使用VC+的画刷之前必须先创建或选择画刷对象。,75,画刷函数,创建实体画刷函数BOOL CreateSolidBrush(COLORREF crColor);选择画刷函数CBrush*SelectObject(CBrush*pBrush);删除画刷函数BOOL DeleteObject();创建阴影画刷函数BOOL CreateHatchBrush(int nIndex,COLORREF crColor);第一个参数nIndex是阴影样式代码第二个参

33、数crColor是阴影线的颜色选择一只库画刷函数virtual CGdiObject*SelectStockObject(int nIndex);,76,5.绘制直线函数,设置直线的起点位置CPoint MoveTo(int x,int y);设置直线的终点位置BOOL LineTo(int x,int y);参数说明:采用起点闭区间,终点开区间的处理方法绘制直线的函数不指定直线的颜色,直线颜色可以通过画笔函数来指定。,77,例5 从屏幕的(20,30)到(200,300)画一条一像素宽的蓝色直线。,78,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=

34、GetDocument();ASSERT_VALID(pDoc);CPen MyPen,*OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255);OldPen=pDC-SelectObject(,79,6.绘制矩形函数,类属:CDC:Rectangle 原型:BOOL Rectangle(int x1,int y1,int x2,int y2);返回值:非零。参数说明:该函数使用当前画刷填充矩形内部,并用当前画笔绘制矩形边界线。,80,例6 绘制左上角点为(100,100),右下角点为(600,300)的矩形。矩形边框为一像素宽的蓝色边界线,内部填充红色,

35、81,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CPen MyPen,*OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255);OldPen=pDC-SelectObject(,CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(255,0,0);OldBrush=pDC-SelectObject(,82,7.绘制椭圆函数,类属:CDC:Ellipse 原型:BOOL Ellipse(int

36、 x1,int y1,int x2,int y2);返回值:非零。参数说明:Ellipse函数中,参数x1,y1是限定椭圆范围的外接矩形左上角点的坐标;参数x2,y2是限定椭圆范围的外接矩形右下角点的坐标注意VC+中没有专门的画圆函数,只是把圆绘制为长半轴和短半轴相等的椭圆。Ellipse函数使用当前画刷填充椭圆内部,并用当前画笔绘制椭圆边界线。,83,例7 将一个圆绘制在视区中央,圆的形状依据视区形状而定。当窗口的形状发生改变时,圆的形状也随之改变。坐标系的中点位于屏幕中心,X轴向右,Y轴向上。圆的边界为一像素宽的蓝色边界线,内部填充为红色。,84,void CTestView:OnDraw

37、(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect Rect;/定义矩形对象GetClientRect(/设置MM_ANISOTROPIC映射模式,逻辑坐标,原点,x,y方向比例自定,85,pDC-SetWindowExt(Rect.Width(),-Rect.Height();/设置窗口范围pDC-SetViewportExt(Rect.right,-Rect.bottom);/设置视区范围/当这两个函数一起使用时,就能决定逻辑坐标轴的方向,与缩放比例。/当SetWindowExt与SetWindowExt中第一参数同号

38、时,表示逻辑坐标x轴与设备坐标x轴方向相同,当异号时,表示逻辑坐标x轴与设备坐标x轴方向相反。两个参数的大小比值确定比例/当SetWindowExt与SetViewportExt中第二参数同号时,表示逻辑坐标y轴与设备坐标y轴方向相同,当异号时,表示逻辑坐标y轴与设备坐标y轴方向相反。两个参数的大小比值确定比例/设备坐标的X轴向右为正,Y轴向下为正pDC-SetViewportOrg(Rect.right/2,Rect.bottom/2);/设置视口原点,将设备坐标系的(Rect.right/2,Rect.bottom/2)定为逻辑坐标系的原点。,86,CPen MyPen,*OldPen;M

39、yPen.CreatePen(PS_SOLID,1,RGB(0,0,255);OldPen=pDC-SelectObject(,87,8.绘制圆弧函数,BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);参数说明:Arc函数中参数x1,y1是限定圆弧范围的外接矩形左上角点坐标参数x2,y2是限定圆弧范围的外接矩形右下角点坐标参数x3,y3为圆弧起点坐标,该参数不一定严格位于圆弧上参数x4,y4为圆弧终点坐标,该参数也不一定严格位于圆弧上圆弧按逆时针方向绘制的。该函数使用当前画笔绘制圆弧边界线。由于圆弧可能不封闭,所

40、以圆弧不进行填充。,88,例8 绘制第一象限内的椭圆弧,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CPen MyPen,*OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255);OldPen=pDC-SelectObject(,89,9.绘制多边形函数,BOOL Polygon(LPPOINT lpPoints,int nCount);参数说明:第一个参数lpPoints指定多边形顶点数组中每一个顶点,是一个POINT结构或CPoint数组对象第

41、二个参数nCount指定多边形数组中的顶点个数该函数用当前画笔绘制多边形边界线,用当前画刷填充多边形内部。,90,例9 绘制四个顶点分别位于视区上部中点、右部中点、下部中点和左部中点的菱形。边界线为蓝色,内部用红色填充,91,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect Rect;GetClientRect(/选取画刷,92,CPoint p4;/定义多边形顶点数组p0.x=Rect.left+Rect.Width()/2;p0.y=Rect.top;/计算顶部中点p1.x=

42、Rect.right;p1.y=Rect.top+Rect.Height()/2;/计算右部中点,93,p2.x=p0.x;p2.y=Rect.bottom;/计算下部中点p3.x=Rect.left;p3.y=p1.y;/计算左部中点pDC-Polygon(p,4);/绘制多边形pDC-SelectObject(OldPen);pDC-SelectObject(OldBrush);,94,10.填充函数,void FillRect(LPCRECT lpRect,CBrush*pBrush);参数说明:第一个参数lpRect指定矩形,是一个Rect结构或CRect对象第二个参数pBrush指定

43、画刷对象指针。该函数将用当前画刷填充矩形内部,但不画边界线。,95,例10 绘制(100,100)和(400,200)确定的红色矩形。,96,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect Rect;CBrush pBrush(RGB(255,0,0);CBrush*OldBrush=pDC-SelectObject(,97,11.路径函数,打开路径BOOL BeginPath();关闭路径图BOOL EndPath();填充路径BOOL FillPath();,98,例11

44、绘制两个多边形,一个使用路径填充,另一个不使用路径填充,试观察结果的异同。,99,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/绘制第一个多边形,用路径填充图 CPoint p7;/定义顶点数组 p0=CPoint(340,240);p1=CPoint(260,160);p2=CPoint(220,260);p3=CPoint(260,370);p4=CPoint(320,300);p5=CPoint(360,380);p6=CPoint(440,220);CBrush MyBrush

45、;,100,MyBrush.CreateSolidBrush(RGB(255,0,0);CBrush*OldBrush=pDC-SelectObject(,101,/绘制第二个多边形,用画刷填充 p0=CPoint(740,240);p1=CPoint(660,160);p2=CPoint(620,260);p3=CPoint(660,370);p4=CPoint(720,300);p5=CPoint(760,380);p6=CPoint(840,220);MyBrush.CreateSolidBrush(RGB(255,0,0);OldBrush=pDC-SelectObject(,102,

46、12.位图函数,从资源中导入位图BOOL LoadBitmap(UINT nIDResource);参数nIDResource是资源的ID编号建立与位图相应的设备上下文virtual BOOL CreateCompatibleDC(CDC*pDC);参数pDC是设备上下文的指针,用于在向屏幕输出图形前作准备。,103,位图函数,选择位图函数CBitmap*SelectObject(CBitmap*pBitmap);参数pBitmap是CBitmap类的被选中的新位图指针对象。把原位图换成新位图,同时返回指向原位图的指针。,104,位图函数,传送位图函数BOOL BitBlt(int x,int

47、 y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORD dwRop);参数x,y是目标区域的左上角点坐标参数nWidth和nHeight是目标区域的宽度和高度参数pSrcDC是源设备上下文的指针参数xSrc和ySrc是源位图的左上角点坐标参数dwRop是光栅操作码例如dwRopSRCCOPY,表示将原位图直接拷贝到目标位图。,105,例12 在屏幕上显示一幅位图。,原始位图 例12效果图,106,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_VA

48、LID(pDoc);CRect Rect;/定义客户区 GetClientRect(/定义一个CBitmap对象和一个CBitmap对象指针,107,Bitmap.LoadBitmap(IDB_BITMAP1);/从资源中导入图片 MemDC.CreateCompatibleDC(pDC);/建立与位图相应的内存设备上下文 OldBitmap=MemDC.SelectObject(/选入原有位图,释放新位图,108,13.图形文本函数,文本颜色设置函数类属:CDC:SetTextColor原型:virtual COLORREFSetTextColor(COLORREF crColor);返回值

49、:原文本颜色的RGB值。参数说明:指定文本颜色。,109,图形文本函数,文本背景颜色设置函数类属:CDC:SetBkColor原型:virtual COLORREFSetBkColor(COLORREF crColor);返回值:原文本背景色的RGB值。参数说明:指定文本背景颜色。,110,图形文本函数,(3)文本输出函数类属:CDC:TextOut原型:BOOL TextOut(int x,int y,const CString返回值:非零。参数说明:参数x,y是文本的起点坐标,参数str是CString对象。,111,图形文本函数,文本格式函数类属:CString:Format原型:voi

50、d Format(LPCTSTR lpszFormat,.);返回值:无。参数说明:参数lpszFormat是格式控制字符串,如d、f、c等。本格式常用于输出数值型数据。,112,例13 在点(100,100)处输出黄底红字“Compute Graphics Based on VC+!”;在(300,100)输出“BoChuang Research Institute”;在(100,130)整数(5,8);在(130,130)处输出小数(5.2,8.3)。,113,void CTestView:OnDraw(CDC*pDC)CTestDoc*pDoc=GetDocument();ASSERT_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号