第二章 MFC 绘图基础.pps

上传人:本田雅阁 文档编号:2285423 上传时间:2019-03-17 格式:PPS 页数:108 大小:2.89MB
返回 下载 相关 举报
第二章 MFC 绘图基础.pps_第1页
第1页 / 共108页
第二章 MFC 绘图基础.pps_第2页
第2页 / 共108页
第二章 MFC 绘图基础.pps_第3页
第3页 / 共108页
亲,该文档总共108页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第二章 MFC 绘图基础.pps》由会员分享,可在线阅读,更多相关《第二章 MFC 绘图基础.pps(108页珍藏版)》请在三一文库上搜索。

1、孔令德,,第二章,MFC绘图基础,MFC上机操作步骤 MFC绘图方法 CDC类的主要绘图成员函数 设备上下文的调用和释放 双缓冲机制 MFC绘制图形的几种方法,本章学习目标,2.1 MFC上机操作步骤 2.2 MFC绘图方法 2.3 设备上下文的调用与释放 2.4 双缓冲机制 2.5 MFC绘图的几种方法 2.6 本章小结,本章内容,微软基类库MFC(microsoft foundation class library,MFC)是以C+形式封装的Windows API(Application Program Interface),包含了200多个已经定义好的常用基类。在程序设计过程中,一般是通

2、过MFC调用基类的成员函数来完成设计任务的。,2.1 MFC上机操作步骤,1. 从Windows的开始菜单中启动Microsoft Visual C+ 6.0,如图2-1所示。,图2-1 Visual C+启动菜单,2. 在Visual C+集成开发环境中,从File|New菜单命令,弹出New对话框,切换到Projects选项卡。如图2-2所示。,图2-2 New 对话框,3. 在MFC AppWizard-Step1对话框中,选中Single Document单选按钮,其余保持默认值,如图2-3所示。单击Finish按钮。,图2-3 MFC AppWizard-Step1 对话框,4. 弹

3、出New Project Information对话框。如图2-4所示。单击OK按钮。,图2-4 New Project Information 对话框,5. 完成上述步骤后,Test工程的MFC应用程序框架已经生成。如图2-5所示。,图2-5 应用程序框架,6. 在应用程序框架的ClassView标签页中显示所创建的类和成员函数;在ResourceView标签页板中显示所创建的资源;在FileView标签页中显示源程序文件。如图2-6所示。,图2-6 应用程序框架的三个标签页显示,标签页: 从ClassView标签页可以看出,CTestApp是应用的主函数类,用来处理消息。MFC中的数据是存

4、储在CTestDoc类文档中,而结果却显示在CTestView类中,即显示在CMainFram类的客户区中。MFC中的文档/视图结构用来将程序的数据本身和数据显示相互隔离,文档类负责管理和维护数据本身,视图类负责处理用户鼠标和键盘的操作。 全部展开FileView标签页后,显示如图2-7所示的内容。本书后续的编程过程中一般使用的是CTestView类的TestView.h头文件和TestView.cpp源文件。,图2-7 FileView标签页的展开显示,在CTestView类的源文件TestView.cpp中可以找到OnDraw()函数。其内容如下:,void CTestView:OnDra

5、w(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here ,pDC定义为CDC类的指针。 pDoc通过GetDocument()函数得到指向文档类CTestDoc的指针。ASSERT_VALID(pDoc)函数使pDoc指针有效。 使用pDC指针,可以对CDC类的成员函数进行操作。 OnDraw()函数由系统框架直接调用,程序一运行就会自动执行。,7. 点击工具条上的按钮 (如图2-8所示),就可以直接编译、运行程序。Test工程运行结果如

6、图2-9所示。,尽管未编写一句代码,但Test程序已经形成一个可执行程序框架。,图2-8 执行按钮 图2-9 Test工程运行效果图,2.2 MFC绘图方法,MFC运算功能强大,拥有完备的绘图功能。 在Windows平台上,应用程序的图形设备接口(graphics device interface,GDI)被抽象为设备上下文(Device Context,DC)。 在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。当需要输出文字或图形时,就需要调用CDC类的成员函数,这些成员函数具备输出文本、绘制图形的功能。 本节讲解的例程全部在TestView.cp

7、p文件的 void CTestView:OnDraw(CDC* pDC)函数中实现。,2.2.1 CDC类结构和GDI对象,CDC类派生了CClientDC类、CMetaFileDC类、CPaintDC类和CWindowDC类。如图2-10所示。,图2-10 CDC类,1.CDC类,CClientDC类:,显示器客户区设备上下文类。 CClientDC只能在窗口的客户区进行绘图。 (不包括边框、标题栏、菜单栏及状态栏的空白区域) 点(0,0)是客户区的左上角。 构造函数自动调用GetDC()函数,析构函数自动调用ReleaseDC()函数。,CMetaFileDC类:,Windows图元文件设

8、备上下文类。 CMetaFileDC封装了在Windows中绘制图元文件的方法。 图元文件是微软定义的一种Windows平台下的与设备无关的的图形文件格式(扩展名为wmf),其所占的磁盘空间比其它任何格式的图形文件都要小得多。 wmf格式文件通常用于存储一系列由绘图命令所描述的图形(如绘制直线与文本等) 。 在建立图元文件时,不能实现即绘即得,而是先将GDI调用记录在图元文件中,然后在GDI环境中重新执行图元文件,才可显示图像。,CPaintDC类:,CPaintDC对象只在响应WM_PAINT消息时使用。 CPaintDC类的构造函数会自动调用BeginPaint()函数。CPaintDC类

9、的析构函数则会自动调用EndPaint()函数。 MFC程序中使用CPaintDC类在视图窗口中绘图时,需要先添加WM_PAINT消息的映射函数OnPaint(),然后在OnPaint()函数中编写与CPaintDC类相关的代码,而不是编写在OnDraw()中。 请注意,如果使用OnPaint()函数响应了WM_PAINT消息,则OnDraw()函数将会被自动屏蔽。,CWindowDC类:,整个屏幕区域的显示器设备上下文类。包括客户区和非客户区。 CWindowDC允许在整个屏幕区域内进行绘图,其构造函数自动调用GetWindowDC(),析构函数自动调用ReleaseDC()函数。 CWin

10、dowDC中的点(0,0)在屏幕的左上角,而CClientDC和CPaintDC中的点(0,0)是屏幕客户区的左上角。 如果在CTestView类中使用CWindowDC类对象进行绘图,只有在使用GetParent()函数获得CWnd指针后,才能在整个屏幕区域内绘图。,图 2-11 绘图对象类,2. 常用绘图类,包括CPoint、CRect、CSize等,如图2-11所示。由于CPoint、CRect和CSize是对Windows的POINT、RECT和SIZE结构体的封装,因此可以直接使用其成员变量。,CPoint类:,存放点坐标(x,y)。相应的POINT结构体定义为,typedef st

11、ruct tagPOINT LONG x; /点的x坐标 LONG y; /点的y坐标 POINT, *PPOINT;,CRect类:,存放矩形左上角点和右下角点的坐标(left,top,right,bottom),相应的RECT结构体定义为,typedef struct _RECT LONG left; /左上角点的x坐标 LONG top; /左上角点的y坐标 LONG right; /右下角点的x坐标 LONG bottom; /右下角点的y坐标 RECT, *PRECT;,存放矩形x方向的长度和y方向的长度(cx,cy),相应的SIZE结构体定义为,CSize类:,typedef st

12、ruct tagSIZE LONG cx; /矩形的宽度 LONG cy; /矩形的高度 SIZE, *PSIZE;,3.绘图工具类,图2-12 绘图工具类,包括CGdiObject、CBitmap、CBrush、CFont、CPalette、CPen、CRgn等,如图2-12所示。,CGdiObject类:GDI绘图工具的基类,一般不能直接使用。 CBitmap:封装了一个GDI位图,提供位图操作的接口。 CBrush类:封装了GDI画刷,可以选作设备上下文的当前画刷。画刷用于填充图形内部。 CFont:封装了GDI字体,可以选作设备上下文中的当前字体。 CPallette:封装了GDI调色

13、板,提供应用程序和显示器之间的颜色接口。 CPen:封装了GDI画笔,可以选作设备上下文的当前画笔。画笔用于绘制图形边界线。 CRgn类:CRgn类封装了一个Windows的GDI区域。这一区域是某一窗口中的一个椭圆或多边形区域。,在选择GDI对象进行绘图时,需要遵循以下步骤: 绘图开始前,创建一个GDI对象,并选入当前设备上下文,同时保存原GDI对象指针。 使用新GDI对象绘图。 绘图结束后,使用已保存的原GDI对象指针将设备上下文恢复原状。,把图形显示在屏幕坐标系中的过程称为映射 根据映射模式的不同可以分为逻辑坐标,设备坐标。 逻辑坐标的单位是米制尺度或其它与字体相关的尺度。 设备坐标的单

14、位是像素 MFC提供了几种不同的映射模式,见表2-1。 一般使用设备坐标模式MM_TEXT,坐标原点位于客户区的左上角,x轴水平向右,y轴垂直向下,坐标基本单位为一个像素。,2.2.2 映射模式,表2-1 映射模式,1.设置映射模式函数 类属:CDC:SetMapMode 原型: virtual int SetMapMode(int nMapMode ); 返回值:原映射模式。 参数:nMapMode是表2-1的模式代码。 2.设置窗口范围函数 类属:CDC: SetWindowExt 原型: virtual CSize SetWindowExt ( int cx, int cy ); 返回值

15、:原窗口范围的CSize对象。,4.设置视区坐标原点函数 类属:CDC:SetViewportOrg 原型: virtual CPoint SetViewportOrg( int x, int y ); 返回值:原视区原点的CPoint对象。,3.设置视区范围函数 类属:CDC:SetViewportExt 原型: virtual CSize SetViewportExt( int cx, int cy ); 返回值:原视区范围的CSize对象。,说明:,(1)当使用各向同性的映射模式MM_ISOTROPIC 和各向异性的映射模式MM_ANISOTROPIC时,需要调用SetWindowExt

16、()和SetViewportExt()函数来改变窗口和视区的设置,其它模式则不需要调用。,(2)MM_LOMETRIC,MM_HIMETRIC,MM_LOENGLISH,MM_HIENGLISH和MM_TWIPS模式主要应用于使用物理单位(英寸或毫米)绘图的情况下,y轴始终向上。,(3)“窗口”与“视区”的概念往往不容易理解。,(4)本书为了简化操作,以后假定窗口和视区的大小相同,即x方向的比例因子和y方向的比例因子都为1。,例2-1 使用用户自定义映射模式,设置窗口大小和视区大小相等的二维屏幕坐标系。坐标系原点位于客户区中心,视区中x轴水平向右为正,y轴垂直向上为正。,void CTestV

17、iew:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect rect; /声明客户区矩形 GetClientRect( /客户区中心为坐标系原点 ,2.2.3 使用GDI对象,创建画笔函数,类属:CPen:CreatePen 原型: BOOL CreatePen(int nPenStyle,int nWidth, COLORREF crColor); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:

18、nPenStyle是画笔样式,见表2-2; nWidth是画笔的宽度;crColor是画笔的颜色。,表2-2 画笔的样式,说明: (1)当画笔的宽度大于 1个像素时,画笔样式只能取 PS_SOLID、PS_NULL和PS_INSIDEFRAME。 (2)画笔也可以使用构造函数直接定义。原型为 CPen (int nPenStyle, int nWidth, COLORREF crColor ); (3)COLORREF是32位颜色数据类型,用双字表示。原型为 typedef DWORD COLORREF;,(4)COLORREF可以表示为十六进制形式:0xbbggrr。例如0x0000ff代表

19、红色,0x00ff00代表绿色,0xff0000代表蓝色。,(5)可以使用RGB宏来创建COLORREF颜色。原型为 COLORREF RGB(BYTE byRed,BYTE byGreen,B YTE byBlue); 其中,byRed是红色分量,byGreen是绿色分量,byBlue是蓝色分量,全部用字节表示。颜色分量可以表示为十六进制数,范围为0x000xff,也可以表示为十进制数,范围为(0 255),0代表无色,255代表全色。,(6)可以使用GetRValue(),GetGValue()和GetBValue()宏从COLORREF颜色中获得红、绿、蓝分量。,2.创建画刷函数,(1)

20、创建实体画刷函数 类属:CBrush:CreateSolidBrush 原型: BOOL CreateSolidBrush(COLORREF crColor ); 返回值:如果调用成功,返回“非0”;否则,返回“0”。 参数:crColor是画刷的颜色。,(2)创建阴影画刷函数 类属:CBrush:CreateHatchBrush 原型: BOOL CreateHatchBrush(int nIndex,COLORREF crColor); 返回值:如果调用成功,返回“非0”;否则,返回“0”。 参数:nIndex是阴影样式,见表2-3; crColor是阴影线的颜色。,3.选入GDI对象 类

21、属:CDC:SelectObject 原型: CPen* SelectObject(CPen* pPen ); CBrush* SelectObject(CBrush* pBrush ); CBitmap* SelectObject(CBitmap* pBitmap ); 返回值:如果成功,返回被替换对象的指针;否则,返回NULL。 参数:pPen是将要选择的画笔对象指针;pBrush是将要选择的画刷对象指针;pBitmap是将要选择的位图对象指针。,说明:本函数将设备上下文的原GDI对象更换为新对象,同时返回指向原对象的指针。,4.删除GDI对象 类属:CGdiObject:DeleteOb

22、ject 原型: BOOL DeleteObject(); 返回值:如成功删除GDI对象,返回“非0”;否则,返回“0”。 参数:无。,5.选入库对象 类属:CDC:SelectStockObject 原型: virtual CGdiObject *SelectStockObject(int nIndex); 返回值:如果调用成功,返回被替代的CGdiObject类对象的指针;否则返回NULL。 参数:参数nIndex可以是表2-4给出的库画笔代码或表2-5给出的库画刷代码。,表2-3 常用的阴影线样式,表2-4 3种常用库笔,表2-5 7种常用库画刷,说明: SetPixelV()函数不需要

23、返回所绘制像素点的RGB值,执行速度比SetPixel()快得多。推荐使用SetPixelV()函数绘制像素点。,2.2.4 CDC类绘图成员函数,绘制像素点函数,类属:CDC:SetPixel 和 CDC:SetPixelV 原型: COLORREF SetPixel(int x,int y,COLORREF crColor ); BOOL SetPixelV(int x, int y, COLORREF crColor); 返回值:SetPixel()函数如果调用成功,返回所绘制像素点的RGB值;否则,返回-1。SetPixelV()函数如果调用成功,返回“非0”;否则,返回“0”。 参数

24、:x是像素点位置的x逻辑坐标;y是像素点位置的y逻辑坐标;crColor是像素点颜色。,返回值:指定像素的RGB值。 参数说明:得到指定像素的RGB颜色值。 本函数是常成员函数 。,2.获取像素点颜色函数,例2-6在屏幕的P0(20,20)坐标位置处绘制一个绿色像素点,然后读出该像素点的颜色,水平平移100个像素绘制P1点。效果如图2-13所示。,类属:CDC:GetPixel 原型: COLORREF GetPixel(int x,int y)const;, CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);,void CTestView:

25、OnDraw(CDC* pDC),COLORREF clr; int x=20,y=20; pDC-SetPixelV(x,y,RGB(0,255,0); clr=pDC-GetPixel(x,y); pDC-SetPixelV(x+100,y,clr);,/ TODO: add draw code for native data here,图2-13 例2-2效果图,P0,P1,3.绘制直线段函数,(1)设置当前位置函数 类属:CDC: MoveTo 原型: CPoint MoveTo( int x, int y ); 返回值:先前位置的CPoint对象。 参数:新位置的点坐标和。,说明:本

26、函数只将画笔的当前位置移动到坐标和处,不绘制直线段。,(2)绘制直线段函数 类属:CDC: MoveTo 原型: BOOL LineTo( int x, int y );,返回值:如果画线成功,返回“非0”;否则,返回“0”。 参数:直线段终点坐标和。,说明: 本函数从当前位置绘制直线段,但不包括(,)点。不包括终点坐标是为了实现多线段连接时公共点的处理,即采用起点闭区间,终点开区间的处理方法。 绘制直线段函数的参数不包含颜色,直线段的颜色通过画笔来指定。,例2-3 从起点P0(20,30)到终点P1(200,300)画一条1像素宽的绿色直线,效果如图2-14所示。,void CTestVie

27、w:OnDraw(CDC* pDC), CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0); pOldPen=pDC-SelectObject(,pDC-MoveTo(20,30); pDC-LineTo(200,300); pDC-SelectObject(pOldPen);,NewPen.DeleteObject(); ,图2-1

28、4 例2-3效果图,4.绘制矩形函数,类属:CDC:Rectangle 原型: BOOL Rectangle( int x1, int y1, int x2, int y2 ); 返回值:如果调用成功,返回“非0”;否则,返回“0”。 参数:x1、y1是矩形的左上角点坐标, x2、y2是矩形的右下角点坐标。,说明: (1)该函数使用当前画刷填充矩形内部,并使用当前画笔绘制矩形边界线。 (2)矩形不包括右边界坐标和下边界坐标,即矩形宽度为x2-x1,高度为y2-y1。,例2-4 绘制左上角点为P0(100,100),右下角点为P1(600,300)的矩形。矩形边界线为1像素宽的蓝线,矩形内部填充

29、为绿色,效果如图2-15所示。,void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here,CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); pOldPen=pDC-SelectObject(,pDC-Rectangle(100,100,600,300); pDC-SelectObject(pOldBrush); NewBru

30、sh.DeleteObject(); pDC-SelectObject(pOldPen); NewPen.DeleteObject(); ,图2-15 例2-4效果图,5.绘制椭圆函数 类属:CDC:Ellipse 原型: BOOL Ellipse( int x1, int y1, int x2, int y2 ); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数: (x1,y1)和( x2,y2)分别是限定椭圆范围的 外切矩形左上角点的坐标和右下角点坐标。,说明: (1)该函数使用当前画刷填充椭圆内部,并用当前画笔绘制椭圆边界线。 (2)MFC中没有专门的画圆函数,只是把圆绘制为

31、外切矩形为正方形的椭圆。,例2-5 在屏幕客户区内绘制内切椭圆,椭圆的形状依据客户区形状而改变。椭圆边界为1像素宽的蓝线,内部填充为绿色,效果如图2-16所示。,图2-16 例2-5效果图, CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect rect; GetClientRect(,CBrush NewBrush,*pOldBrush; NewBrush.CreateSolidBrush(RGB(0,255,0); pOldBrush=pDC-

32、SelectObject( ,6.绘制多边形函数,类属:CDC:Polygon 原型: BOOL Polygon(LPPOINT lpPoints,int nCount); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:lpPoints指定多边形顶点数组指针,数组中的每个顶点是一个POINT结构或CPoint对象;nCount指定多边形顶点数组中的顶点个数。,说明: (1)该函数使用当前画刷填充多边形内部,并使用当前画笔绘制多边形边界线。 (2)多边形自动闭合。,例2-6 绘制4个顶点分别位于屏幕客户区左部中点、上部中点、右部中点和下部中点的多边形。多边形边界线为3像素宽的蓝线,

33、内部填充为绿色,效果如图2-17所示。,图2-17 例2-6效果图,void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here,CRect rect; GetClientRect(,CPoint P4; /定义多边形顶点数组 P0.x=rect.left;P0.y=rect.top+rect.Height()/2; /计算左部中点 P1.x=rect.left+rect.Width()/2;P1.y=r

34、ect.top; /计算顶部中点 P2.x=rect.right;P2.y=rect.top+rect.Height()/2; /计算右部中点 P3.x=rect.left+rect.Width()/2;P3.y=rect.bottom; /计算下部中点 pDC-Polygon(P,4); /绘制多边形 pDC-SelectObject(pOldBrush); NewBrush.DeleteObject(); pDC-SelectObject(pOldPen); NewPen.DeleteObject(); ,7.填充矩形函数 类属:CDC: FillSolidRect 原型: void Fi

35、llSolidRect( LPCRECT lpRect, COLORREF clr ); void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr ); 返回值:无。 参数:lpRect是指向矩形的指针,或是一个Rect结构或CRect对象;x,y指定矩形的左上角点坐标,cx、cy指定矩形的宽度和高度;clr指定填充颜色。,说明: (1)该函数使用当前画刷填充整个矩形,包括左边界和上边界,但不包括右边界和下边界。 (2)当前画笔对该函数不起作用。,例2-7 使用FillRect函数将屏幕客户区填充为黑色,效果如图2-18所示。

36、,图2-17 例2-8效果图,void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect rect; GetClientRect( ,说明:在绘制真实感图形时,为了更好地表示光照及纹理的效果,常将屏幕背景色填充为黑色,本例提供了一个改变屏幕背景色的方法,第3行语句使用黑色填充屏幕客户区。改变RGB宏表示的颜色,可以更换屏幕的背景色。,8.路径层函数,打开路径层,类属:CDC:BeginPat

37、h 原型: BOOL BeginPath(); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:无。 说明:打开一个路径层。,关闭路径层,类属:CDC:EndPath 原型: BOOL EndPath(); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:无。 说明:关闭当前路径层,并将该路径层选入设备上下文。,(3)填充路径层 类属:CDC:FillPath 原型:BOOL FillPath(); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:无。 说明: 用当前画刷和填充模式填充路径层内部,同时关闭已经打开的路径层。路径层填充完毕后,将被设备上下文废弃

38、。 该函数不绘制路径层轮廓。 (4)绘制并填充路径层 类属:CDC: StrokeAndFillPath 原型:BOOL StrokeAndFillPath( ); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:无。,说明:使用当前画笔绘制路径层的轮廓,并使用当前画刷填充路径层内部,同时关闭已经打开的路径层。,例2-8 绘制3个相同的多边形。第一个和第二个多边形使用MoveTo()函数和LineTo()函数绘制,分别使用FillPath()函数和StrokeAndFillPath()函数填充;第三个多边形使用Polygon()函数绘制。多边形边界线为1像素宽的蓝线,内部填充为绿色

39、,试观察3种填充效果的异同,如图2-19所示。,图2-19 例2-8效果图,void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here /绘制第一个多边形,用FillPath()函数填充 CPoint P7; /声明多边形顶点数组 P0=CPoint(220,140);P1=CPoint(140,60); P2=CPoint(100,160);P3=CPoint(140,270); P4=CPoint(

40、200,200);P5=CPoint(240,270); P6=CPoint(320,120); CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); pOldPen=pDC-SelectObject(,pDC-BeginPath(); pDC-MoveTo(P0); for(int i=1;iLineTo(Pi); pDC-LineTo(P0); pDC-EndPath(); pDC-FillPath(); /绘制第二个多边形,用StrokeAndFillPath()函数填充 P0=CPoint(520,140);P1

41、=CPoint(440,60); P2=CPoint(400,160);P3=CPoint(440,270); P4=CPoint(500,200);P5=CPoint(540,270); P6=CPoint(620,120); pDC-BeginPath(); pDC-MoveTo(P0); for(i=1;iLineTo(Pi); pDC-LineTo(P0); pDC-EndPath(); pDC-StrokeAndFillPath();,/绘制第三个多边形,用画刷填充 P0=CPoint(820,140);P1=CPoint(740,60); P2=CPoint(700,160);P3

42、=CPoint(740,270); P4=CPoint(800,200);P5=CPoint(840,270); P6=CPoint(920,120); pDC-Polygon(P,7); pDC-SelectObject(pOldBrush); NewBrush.DeleteObject(); pDC-SelectObject(pOldPen); NewPen.DeleteObject(); ,9.绘制Bezier曲线函数,类属:CDC:PolyBezier 原型: BOOL PolyBezier(const POINT* lpPoints, int nCount ); 返回值:如调用成功,

43、返回“非0”;否则,返回“0”。 参数:lpPoints是样条的终止点和控制点组成的POINT结构数组指针;nCount表示lpPoints数组中的数组元素个数。,说明: (1)每段Bezier样条要求2个中间控制点和1个终止控制点。第一段Bezier样条还要求1个起始控制点。 (2)PolyBezier()函数可以绘制一段或多段Bezier样条。绘制多段Bezier样条时,除第一段样条使用4个控制点外,其余各段样条仅使用3个控制点,因为后面一段样条总把前一段样条的终止控制点作为自己的起始控制点。只绘制,一段Bezier样条时,参数lpPoints应为4。绘制n段Bezier样条时,参数lpP

44、oints应为n31。 (3)PolyBezier函数使用当前画笔绘制,并且一般不闭合,因此不填充内部。 (4)PolyBezier()函数不更新当前点位置。 (5)绘制两段Bezier样条时,存在第二段Bezier样条与第一段Bezier样条的连接问题,称为Bezier样条的拼接。拼接两段Bezier样条时,需要满足一定的连续条件。如果第二段Bezier样条任意给定,那么两段Bezier样条之间只能在拼接点处满足端点连续,两段Bezier样条不能光滑过渡;如果需要满足光滑过渡,则要求第一段Beizer样条的最后两个控制点和第二段Bezier样条的第1个控制点共线。,例2-9 给定图2-20所

45、示7个控制点P0(200,400)、P1(300,200)、P2(600,100)、P3(650,300)、P5(1100,400)、P6(900,120)。使用黑色画笔绘制控制多边形,使用绿色画笔绘制两段Bezier样条。要求两段Bezier样条光滑连接,也就是说P4控制点与P2、P3控制点共线。设P4点的x坐标为600,请根据直线方程计算P4点的y坐标并绘制光滑拼接的两段Bezier样条。,图2-20 例2-9效果图,#define ROUND(d) int(d+0.5) void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocumen

46、t(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect rect; CPoint p7; p0=CPoint(100,400);p1=CPoint(200,200); p2=CPoint(500,100);p3=CPoint(550,300); double k=(p3.y-p2.y)/(p3.x-p2.x); double x=600,y=k*(x-p3.x)+p3.y; p4=CPoint(ROUND (x), ROUND (y);p5=CPoint(900,400); p6=CPoint(800,

47、120);,for(int i=0;iMoveTo(pi); else pDC-LineTo(pi); pDC-Ellipse(pi.x-5,pi.y-5,pi.x+5,pi.y+5); CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0); pOldPen=pDC-SelectObject( ,(1)创建位图函数,10.位图操作函数,类属:CBitmap: CreateCompatibleBitmap 原型: BOOL CreateCompatibleBitmap( CDC* pDC, int nWidth, int n

48、Height ); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:pDC是显示设备上下文指针,nWidth是位图宽度,nHeight是位图高度。 说明: CreateCompatibleBitmap()函数为指定的显示设备上下文创建一个指定宽度与高度的兼容位图,该位图可以选为与指定的显示设备上下文兼容的内存设备上下文的当前位图。 本函数创建的是黑色单色位图,可以使用FillSolidRect()函数将其填充为白色。,(2)导入位图函数,类属:CBitmap:LoadBitmap 原型:BOOL LoadBitmap(UINT nIDResource ); 返回值:如果调用成功,返回“非0”;否则,返回“0”。,参数:nIDResource是位图资源的ID编号。 说明:该函数将资源中以nIDResource标识的位图加载给CBitmap对象。,(3)创建与指定设备兼容的内存设备上下文函数,类属:CDC:CreateCompatibleDC 原型:virtual BOOL CreateCompa

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1