制图3VC绘图.ppt

上传人:本田雅阁 文档编号:2714610 上传时间:2019-05-07 格式:PPT 页数:68 大小:2.06MB
返回 下载 相关 举报
制图3VC绘图.ppt_第1页
第1页 / 共68页
制图3VC绘图.ppt_第2页
第2页 / 共68页
制图3VC绘图.ppt_第3页
第3页 / 共68页
制图3VC绘图.ppt_第4页
第4页 / 共68页
制图3VC绘图.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《制图3VC绘图.ppt》由会员分享,可在线阅读,更多相关《制图3VC绘图.ppt(68页珍藏版)》请在三一文库上搜索。

1、1,VC+绘图程序设计,土木工程制图 (第二部分),2,Windows应用程序工作原理,Windows程序设计是一种事件驱动方式的程序设计模式。在程序提供给用户的界面中有许多可操作的可视对象。 用户从所有可能的操作中任意选择,被选择的操作会产生某些特定的事件,这些事件发生后的结果是向程序中的某些对象发出消息,然后这些对象调用相应的消息处理函数来完成特定的操作。 Windows应用程序最大的特点就是程序没有固定的流程,而只是针对某个事件的处理有特定的子流程,Windows应用程序就是由许多这样的子流程构成的。,3,Windows应用程序工作原理,Windows应用程序在本质上是面向对象的。程序提

2、供给用户界面的可视对象在程序的内部一般是一个对象,用户对可视对象的操作通过事件驱动模式触发相应对象的可用方法。,4,窗口,窗口是Windows应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。 编写一个Windows应用程序,首先必须建立一个或多个窗口,而应用程序的运行过程就是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理或数据交换的过程。,5,消息,在Windows程序设计中,消息是个极为重要的概念,用户通过窗口界面的各种操作最后都转化为发送到程序中的对象的各种消息,下面介绍一些在Windows程序设计中最常用的消息。,6,消息,窗口消息 WM

3、_CREATE WM_DESTROY WM_CLOSE 键盘消息 WM_CHAR WM_KEYDOWN WM_KEYUP,7,消息,鼠标消息 WM_MOUSEMOVE WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBCLICK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBCLICK,8,Windows应用程序的基本结构,窗口消息(窗口状态) WM_MOVE WM_SIZE WM_PAINT 焦点消息 WM_SETFOCUS WM_KILLFOCUS 定时器消息 WM_TIMER,9,Windows应用程序的基本结构,下面以一个

4、最简单的Windows程序为例来说明其基本结构。 在Visual C+中新建一个Win32 Application的程序,选择建立一个A simple Win32 application程序,10,Visual C+和MFC,Visual C+作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。 Visual C+ 6.0 Visual Studio 2005/2008 Visual C+的核心是Microsoft基础类库,即通常所说的MFC(Microsoft Foundation Class)。,11,MSDN Library帮助工具,使用Visual

5、C+编程,就必须学会使用MSDN Library这个工具。 MSDN库提供的庞大信息集几乎涉及到微软编程工具和Win32编程的每个方面,它包含了成千上万的主题,这些主题讨论了从Visual C+到Visual J+、从MFC到ActiveX的每件事情。MSDN中所包括信息的完整性确实让人吃惊。,12,理解Visual C+的工程,Visual C+作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用Visual C+开发应用程序的过程中,系统为我们生成了大量的各种类型的文件。,13,使用MFC AppWizard,Visual C+是一种功能强

6、大的通用程序设计语言,它提供了各种向导和工具帮助我们来实现所需的功能,在一定程度上实现了软件的自动生成和可视化编程。 AppWizard工具的作用是帮助我们一步步地生成一个新的应用程序,并且自动生成应用程序所需的基本代码。,14,MFC程序结构分析,15,MFC绘图的基本知识,设备描述表(device context)的概念 设备描述表实际上是一种Windows的数据结构,它保存了设备(打印机、屏幕等)的绘图属性和绘图函数。 围绕设备描述表,MFC还提供了一系列与其配合使用的绘图工具对象,这其中包括:画笔对象、刷子对象以及字体对象等等。,16,窗口、客户区和非客户区的概念,窗口是Windows

7、应用程序基本的操作单元,是其运行及与用户进行交互的基本平台。 屏幕输出的目标一般都是窗口内的客户区,它不包括窗口的边框、滚动条、状态条、工具条、菜单栏和标题栏。可以接受无论是图形、文本、位图、还是其他类型的数据(例如OLE对象)。 窗口内除客户区之外的区域即为非客户区。,17,绘图类,MFC提供了不同类型的设备描述表的类(绘图类):CDC、CPaintDC、CClientDC、CWindowDC等。其中CDC类是MFC绘图类的根类,其它的绘图类都是CDC类的派生类。 CDC类包含了绘图所需的所有成员函数。其它的派生类,都仅仅是构造函数和析构函数的不同。,18,绘图类的引用方法,一般情况下,应用

8、程序的绘图工作都要在视图(View)类中进行。 由AppWizard生成的程序中,有一个视图类的成员函数OnDraw,自动实现了在视图类中引用CDC类,这是由MFC程序内部的一个特殊机制实现的。当视图窗口绘制或重绘制(窗口刷新消息WM_PAINT)时,都要调用OnDraw函数。,19,绘图类的引用方法,在testView.cpp文件中可以找到OnDraw函数,其代码: / CTestView drawing void CTestView:OnDraw(CDC* pDC) / TODO: add draw code for native data here / 用户在此添加代码。 其中,pDC就

9、是一个设备描述表类CDC对象的指针 可以通过pDC指针调用CDC类的函数进行绘图。,20,绘图类的引用方法,在视图窗口以外的窗口(比如对话框)中绘制图形,就需要调用窗口类的WM_PAINT消息处理函数OnPaint来绘制或重画窗口,该函数中必须生成设备描述表类CPaintDC对象才能绘图,其代码示例如下: void CTestDialog:OnPaint( ) / Device context for painting CPaintDC pdc(this); / 用户在此添加代码。 ,21,绘图类的引用方法,对于在OnDraw和OnPaint之外的函数中绘制图形,必须生成设备描述表类CClie

10、ntDC对象才能绘图,其代码示例如下: void CTestView:FunctionName() / Device context for painting CClientDC pdc(this); / 用户在此添加代码。 ,22,几种常用的图形数据结构和类,绘图程序中常用到的几种Windows的结构类型:POINT、RECT、SIZE。以及在MFC中与之对应的类:CPoint、CRect、CSize。 点POINT数据结构: typedef struct tagPOINT LONG x; LONG y; POINT;,23,几种常用的图形数据结构和类,矩形RECT数据结构: typedef

11、 struct tagRECT LONG left; LONG top; LONG right; LONG bottom; RECT; 其中left、top表示矩形左上角的x、y坐标值,right、bottom表示矩形右下角的x、y坐标值。,24,几种常用的图形数据结构和类,表示矩形高宽的SIZE数据结构: typedef struct tagSIZE int cx; int cy; SIZE; 其中cx、cy表示矩形的宽度、高度值。,25,几种常用的图形数据结构和类,CPoint类是由POINT结构派生出的类 CRect类是由RECT结构派生出的类 CSize类是由SIZE结构派生出的类,2

12、6,几种常用的图形数据结构和类,下面举例说明这些数据类型的使用方法: CPoint p1(300,300), p2; /定义两个点p1、p2,并初始化p1点 CRect r1(CPoint(0,0),CPoint(100,100), r2;/定义两个矩形r1、r2 CSize s(100,100); /定义一个CSize对象s,并对其初始化 p2 = p1-CSize(50,50); /p2为(250,250) r2 = r1+s; /r2为(100,100)-(200,200),是平移矩形r1的结果 r2 = r1+p1; /r2为(300,300)-(400,400),是平移矩形r1的结果

13、 r2 |= r1; /r2为(0,0)-(400,400),是r1和r2的轮廓矩形 r2 = CRect(20,20,200,200); /r2为(20,20)-(200,200) r2 /r2为(20,20)-(100,100),是r1和r2重叠的矩形,27,屏幕坐标系映射模式,在Windows环境中,所有的图形和文本输出的位置都对应于坐标系。图形和文本的坐标系是一致的。GDI支持两种坐标系,即设备坐标系和逻辑坐标系。,28,设备坐标系,设备坐标系是指具体的物理设备的坐标系,它是以像素作为坐标单位,默认的坐标系原点在绘图区域的左上角,X轴向右为正,Y轴向下为正。 设备坐标系又有三种独立的坐

14、标系:屏幕坐标系、窗口坐标系、客户区坐标系。,29,设备坐标系,30,逻辑坐标系,逻辑坐标系是不考虑具体物理设备的一个统一的坐标系。图形的绘制是在以逻辑坐标系为基础的虚拟窗口(Window)中进行的,Windows能够通过映射模式将逻辑坐标系转化成设备坐标系,并将图形显示在视口(Viewport)中。Windows通过逻辑坐标系实现了与设备描述表的联系。,31,理解窗口与视口,以逻辑坐标系将图形绘制到虚拟的窗口(Window)中,设备显示图形的区域被称作为视口(Viewport),显示出来的只是虚拟窗口的一部分。,32,窗口和视口坐标系位置的设置,窗口和视口的位置对应关系是通过设置它们对应的基

15、准点实现的,默认的基准点都是(0,0),即虚拟绘图窗口中逻辑坐标系的(0,0)点映射到显示视口中设备坐标系的(0,0)点,逻辑坐标系坐标轴的方向和单位由屏幕映射模式确定。 CPoint SetWindowOrg( int x, int y ); CPoint SetWindowOrg( POINT point ); CPoint SetViewportOrg( int x, int y ); CPoint SetViewportOrg( POINT point );,33,坐标映射模式,逻辑坐标系映射模式的设置函数为CDC:SetMapMode( ) 1. (MM_TEXT)系统缺省的映射模式

16、,34,坐标映射模式,2. 逻辑坐标单位固定的映射模式 映射模式 逻辑坐标单位 MM_LOENGLISH 0.01英寸 MM_HIENGLISH 0.001英寸 MM_LOMETRIC 0.1毫米 MM_HIMETRIC 0.01毫米 MM_TWIPS 1/1440英寸,35,坐标映射模式,3. 逻辑坐标比例可变的映射模式,36,坐标映射模式示例,绘制两个数据相同的圆,37,坐标映射模式示例,void CTestView:OnDraw(CDC* pDC) / TODO: add draw code for native data here / 以下为第一段代码: CRect clientRec

17、t; GetClientRect(clientRect); pDC-SetMapMode(MM_ANISOTROPIC); pDC-SetWindowExt(1000,1000); pDC-SetViewportExt(clientRect.right, - clientRect.bottom); pDC-SetViewportOrg(clientRect.right/2, clientRect.bottom/2); pDC-Ellipse(CRect(-500,-500, 500,500); /以下为第二段代码: pDC-SetMapMode(MM_ISOTROPIC); pDC-SetWi

18、ndowExt(1000,1000); pDC-SetViewportExt(clientRect.right, - clientRect.bottom); pDC-SetViewportOrg(clientRect.right/2, clientRect.bottom/2); pDC-Ellipse(CRect(-500,-500, 500,500); ,38,设备坐标系与逻辑坐标系之间的转换,当设定了设备描述表的映射模式之后,就可以直接使用逻辑坐标作为其参数了,但是从WM_MOUSEMOVE消息所获得的鼠标的坐标值是设备坐标。许多其他的MFC库函数,只接受设备坐标。所以有时要利用CDC的L

19、PtoDP和DPtoLP函数在逻辑坐标和设备坐标之间进行转换的工作。,39,绘图工具类,MFC中定义了一些Windows的图形设备界面(GDI)对象类,即绘图工具类,它们是作图的笔、给图形涂色的画刷,以及字体、位图等影响绘图的工具。前面讲的设备描述表对象可以选入这些绘图工具来完成指定的图形操作。 绘图工具类主要有:CGdiObject、CPen、CBrush、CFont和CBitmap类等。其中CGdiObject类是CObject类的派生类,它是绘图工具类的基类。,40,画笔类,画笔CPen用于绘制直线、矩形、圆等几何图形,其属性主要有:线宽、线型和色彩等。画刷CBrush用于填充绘图区域,

20、其属性有填充图案和色彩。 在生成设备描述表类对象时,如果没有指定笔和画刷,那么默认笔为线宽1个像素的黑色实线;默认的画刷为单一白色图案,即图形内部填充白色。,41,画笔类,对绘图工具的使用包括:创建、选择和使用后的释放等过程。CDC类提供了两个成员函数SelectStockObject和SelectObject来选择GDI绘图工具。,42,绘图工具,1. 选用GDI库存工具,选用函数:SelectStockObject(int nIndex); Index为绘图工具的宏名,43,2. 创建并选用定制的画笔 CPen类的成员函数 CreatePen(int nPenStyle,int nWidt

21、h,LOLORREF crColor);,PenStyle:线型,Width:线宽,逻辑单位,1时只能画实线,取值0时忽略映射模式的影响,线宽总是1个像素。,44,Color 颜色,由宏RGB(red,green,blue)确定,45,创建方法: (1)定义一个CPen类的对象,然后利用CreatePen()初始化画笔,例如: CPen pen; pen.CreatePen(PS_SOLID,1,RGB(255,0,0); 该例子创建了一支实线、1单位宽的红色画笔; (2)使用CPen类的构造函数创建画笔,例如: CPen pen(PS_SOLID,1,RGB(255,0,0); 该例子同样创

22、建了一支实线、1单位宽的红色画笔; (3)用CPen类对象指针的形式动态创建画笔,例如: CPen *pPen; pPen=new CPen(PS_SOLID,1,RGB(255,0,0); 指针指向实线、1单位宽的红色画笔对象。,46,画笔创建后要用SelectObject ()函数将其选入设备环境 例如: CPen pen(PS_SOLID,1,RGB(255,0,0); pDC-SelectObject(,47,3.创建并使用定制的画刷 实心画刷,图案画刷,位图画刷。 CBrush类的成员函数有: CreateSolidBrush(COLORREF crColor); CreateHat

23、chBrush(int nIndex,COLORREF crColor); CreatePatternBrush(CBitmap *pBitmap);,48,图形的背景色和背景方式,非实线线型的间隙、图案画刷的背景、字符方块的背景色由CDC的背景色成员函数设定: SetBkColor(COLORREF crColor); 背景色是否透明由CDC的背景方式成员函数设定: SetBkMode(int nBkMode); BkMode的取值为OPAQUE(不透明)或TRANSPARENT(透明),49,绘图模式,绘图模式表示如何将画笔或画刷的颜色与显示设备上已有的颜色相组合。,50,绘图函数,1.画

24、点 SetPixel(int x,int y,COLORREF crColor); 2.空移 MoveTo(int x,int y); 画笔空移到指定位置 3.画直线 LineTo(int x,int y); 画线后笔的当前位置到达(x,y),51,绘图函数,4.画弧 Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); x1、y1和x2、y2是边界矩形的对顶点坐标,x3、y3是参考起点的坐标,x4、y4是参考终点的坐标。该函数不改变画笔的当前位置。 5.画折线 PolyLine(LPPOINT lpPoints,int n

25、Count); lpPoints为POINT结构数组指针,nCount为顶点数。该函数不改变画笔的当前位置。,52,绘图函数,6.画矩形 Rectangle(int x1,int y1,int x2,int y2); 除画矩形边界外,还用当前画刷填充闭合区域。 7.画椭圆/圆 Ellipse(int x1,int y1,int x2,int y2); x1、y1和x2、y2确定边界矩形,椭圆由此矩形确定。边界矩形是正方形时画出的是圆。该函数同时用当前画刷填充闭合区域。,53,屏幕绘图程序,编制一个屏幕绘图程序,除要遵守一般程序设计的要求外,还应特别注意如下几点: 通过CDC类对象进行屏幕输出;

26、 设置设备描述表对象的输出属性; 创建及选择绘图工具; 为图形准备数据; 用CDC类对象的绘图函数画图; 恢复原有设备描述表对象的输出属性,以及恢复原绘图工具对象; 删除用户动态建立的绘图工具。,54,例1: 画滚圆。大圆半径r1,小圆半径r2=r1/2, 均匀滚动24次。,55,#include “math.h“ void CEx14View:OnDraw(CDC* pDC) CRect rc; GetClientRect( ,56,例2: 椭圆的长半径从800按50递减至0,同时短半径从0按50 递增至800,由此构成了17个同心椭圆。,57,void CTestView:OnDraw(C

27、DC* pDC) CRect cr; GetClientRect(cr); pDC-SetMapMode(MM_ISOTROPIC); pDC-SetWindowExt(1700,1700); pDC-SetViewportExt(cr.right, -cr.bottom); pDC-SetViewportOrg(cr.right/2, cr.bottom/2); pDC-SelectStockObject(HOLLOW_BRUSH); CRect r(-800,0,800,0); int i; for(i=0;iMoveTo(r.TopLeft(); pDC-LineTo(r.BottomR

28、ight(); else pDC-Ellipse(r); r.left+=50; r.right-=50; r.top+=50; r.bottom-=50; ,58,例3:按控制尺寸画大门。,59,思路: 1.图形左右对称,可只描述一半图形,经过x坐标改变符号,可得另一半图形。 2.为坐标的变换和取值方便,采用自定义宏的办法自定义坐标系: #define fnx(x) (int)(xo+(x)*s*sl) #define fny(y) (int)(yo-(y)*sl),60,1. int s, xo,yo; double sl; void draw(); 2. #define fnx(x) (

29、int)(xo+(x)*s*sl) #define fny(y) (int)(yo-(y)*sl) 3. s=1; sl=.5;,61,void CEx_16View:OnDraw(CDC* pDC) CEx_16Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect rc; GetClientRect( ,62,void CEx_16View:draw() int i; CClientDC dc(this); dc.MoveTo(fnx(0),fny(50)

30、; dc.LineTo(fnx(300),fny(50); dc.Rectangle(fnx(165),fny(50),fnx(215),fny(250); dc.Rectangle(fnx(155),fny(250),fnx(225),fny(260); dc.Arc(fnx(190-25),fny(260-25),fnx(190+25),fny(260+25), xo+300,fny(260),xo-300,fny(260); dc.MoveTo(fnx(215),fny(55); dc.LineTo(fnx(300),fny(55); dc.MoveTo(fnx(215),fny(190); dc.LineTo(fnx(300),fny(190); dc.MoveTo(fnx(215),fny(195); dc.LineTo(fnx(300),fny(195); for (i=1;i=4;i+) dc.MoveTo(fnx(215+20*i),fny(55); dc.LineTo(fnx(215+20*i),fny(190); ,63,坐标转换关系:,64,65,66,67,作业,p127p129: 16-116-12 要求打印输出源程序(自己编写的代码),可使用doc文档两栏排版,图形捕捉后粘贴在文档中。,68,业精于勤,

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

当前位置:首页 > 其他


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