《制图3VC绘图上课讲义》由会员分享,可在线阅读,更多相关《制图3VC绘图上课讲义(68页珍藏版)》请在金锄头文库上搜索。
1、1,VC+绘图程序设计,土木工程制图 (第二部分),2,Windows应用程序工作原理,Windows程序设计是一种事件驱动方式的程序设计模式。在程序提供给用户的界面中有许多可操作的可视对象。 用户从所有可能的操作中任意选择,被选择的操作会产生某些特定的事件,这些事件发生后的结果是向程序中的某些对象发出消息,然后这些对象调用相应的消息处理函数来完成特定的操作。 Windows应用程序最大的特点就是程序没有固定的流程,而只是针对某个事件的处理有特定的子流程,Windows应用程序就是由许多这样的子流程构成的。,3,Windows应用程序工作原理,Windows应用程序在本质上是面向对象的。程序提
2、供给用户界面的可视对象在程序的内部一般是一个对象,用户对可视对象的操作通过事件驱动模式触发相应对象的可用方法。,4,窗口,窗口是Windows应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。 编写一个Windows应用程序,首先必须建立一个或多个窗口,而应用程序的运行过程就是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理或数据交换的过程。,6,消息,窗口消息 WM_CREATE WM_DESTROY WM_CLOSE 键盘消息 WM_CHAR WM_KEYDOWN WM_KEYUP,7,消息,鼠标消息 WM_MOUSEMOVE WM_LBUTT
3、ONDOWN 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应用程序的基本结构,下面以一个最简单的Windows程序为例来说明其基本结构。 在Visual C+中新建一个Win32 Application的程序,选择建立一个A simple Win32 applicatio
4、n程序,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 C+编程,就必须学会使用MSDN Library这个工具。 MSDN库提供的庞大信息集几乎涉及到微软编程工具和Win32编程的每个方面,它包含了成千上万的主题,这些主题讨论了从Visu
5、al C+到Visual J+、从MFC到ActiveX的每件事情。MSDN中所包括信息的完整性确实让人吃惊。,12,理解Visual C+的工程,Visual C+作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用Visual C+开发应用程序的过程中,系统为我们生成了大量的各种类型的文件。,13,使用MFC AppWizard,Visual C+是一种功能强大的通用程序设计语言,它提供了各种向导和工具帮助我们来实现所需的功能,在一定程度上实现了软件的自动生成和可视化编程。 AppWizard工具的作用是帮助我们一步步地生成一个新的应用程序
6、,并且自动生成应用程序所需的基本代码。,14,MFC程序结构分析,15,MFC绘图的基本知识,设备描述表(device context)的概念 设备描述表实际上是一种Windows的数据结构,它保存了设备(打印机、屏幕等)的绘图属性和绘图函数。 围绕设备描述表,MFC还提供了一系列与其配合使用的绘图工具对象,这其中包括:画笔对象、刷子对象以及字体对象等等。,16,窗口、客户区和非客户区的概念,窗口是Windows应用程序基本的操作单元,是其运行及与用户进行交互的基本平台。 屏幕输出的目标一般都是窗口内的客户区,它不包括窗口的边框、滚动条、状态条、工具条、菜单栏和标题栏。可以接受无论是图形、文本
7、、位图、还是其他类型的数据(例如OLE对象)。 窗口内除客户区之外的区域即为非客户区。,17,绘图类,MFC提供了不同类型的设备描述表的类(绘图类):CDC、CPaintDC、CClientDC、CWindowDC等。其中CDC类是MFC绘图类的根类,其它的绘图类都是CDC类的派生类。 CDC类包含了绘图所需的所有成员函数。其它的派生类,都仅仅是构造函数和析构函数的不同。,18,绘图类的引用方法,一般情况下,应用程序的绘图工作都要在视图(View)类中进行。 由AppWizard生成的程序中,有一个视图类的成员函数OnDraw,自动实现了在视图类中引用CDC类,这是由MFC程序内部的一个特殊机
8、制实现的。当视图窗口绘制或重绘制(窗口刷新消息WM_PAINT)时,都要调用OnDraw函数。,19,绘图类的引用方法,在testView.cpp文件中可以找到OnDraw函数,其代码: / CTestView drawing void CTestView:OnDraw(CDC* pDC) / TODO: add draw code for native data here / 用户在此添加代码。 其中,pDC就是一个设备描述表类CDC对象的指针 可以通过pDC指针调用CDC类的函数进行绘图。,20,绘图类的引用方法,在视图窗口以外的窗口(比如对话框)中绘制图形,就需要调用窗口类的WM_PAI
9、NT消息处理函数OnPaint来绘制或重画窗口,该函数中必须生成设备描述表类CPaintDC对象才能绘图,其代码示例如下: void CTestDialog:OnPaint( ) / Device context for painting CPaintDC pdc(this); / 用户在此添加代码。 ,21,绘图类的引用方法,对于在OnDraw和OnPaint之外的函数中绘制图形,必须生成设备描述表类CClientDC对象才能绘图,其代码示例如下: void CTestView:FunctionName() / Device context for painting CClientDC pd
10、c(this); / 用户在此添加代码。 ,22,几种常用的图形数据结构和类,绘图程序中常用到的几种Windows的结构类型:POINT、RECT、SIZE。以及在MFC中与之对应的类:CPoint、CRect、CSize。 点POINT数据结构: typedef struct tagPOINT LONG x; LONG y; POINT;,23,几种常用的图形数据结构和类,矩形RECT数据结构: typedef struct tagRECT LONG left; LONG top; LONG right; LONG bottom; RECT; 其中left、top表示矩形左上角的x、y坐标值
11、,right、bottom表示矩形右下角的x、y坐标值。,24,几种常用的图形数据结构和类,表示矩形高宽的SIZE数据结构: typedef struct tagSIZE int cx; int cy; SIZE; 其中cx、cy表示矩形的宽度、高度值。,25,几种常用的图形数据结构和类,CPoint类是由POINT结构派生出的类 CRect类是由RECT结构派生出的类 CSize类是由SIZE结构派生出的类,26,几种常用的图形数据结构和类,下面举例说明这些数据类型的使用方法: CPoint p1(300,300), p2; /定义两个点p1、p2,并初始化p1点 CRect r1(CPoi
12、nt(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的结果 r2 |= r1; /r2为(0,0)-(400,400),是r1和r2的轮廓矩形 r2 = CRect(20,20,200,200); /r2为(20,20)-(200,200)
13、r2 /r2为(20,20)-(100,100),是r1和r2重叠的矩形,27,屏幕坐标系映射模式,在Windows环境中,所有的图形和文本输出的位置都对应于坐标系。图形和文本的坐标系是一致的。GDI支持两种坐标系,即设备坐标系和逻辑坐标系。,28,设备坐标系,设备坐标系是指具体的物理设备的坐标系,它是以像素作为坐标单位,默认的坐标系原点在绘图区域的左上角,X轴向右为正,Y轴向下为正。 设备坐标系又有三种独立的坐标系:屏幕坐标系、窗口坐标系、客户区坐标系。,29,设备坐标系,30,逻辑坐标系,逻辑坐标系是不考虑具体物理设备的一个统一的坐标系。图形的绘制是在以逻辑坐标系为基础的虚拟窗口(Wind
14、ow)中进行的,Windows能够通过映射模式将逻辑坐标系转化成设备坐标系,并将图形显示在视口(Viewport)中。Windows通过逻辑坐标系实现了与设备描述表的联系。,31,理解窗口与视口,以逻辑坐标系将图形绘制到虚拟的窗口(Window)中,设备显示图形的区域被称作为视口(Viewport),显示出来的只是虚拟窗口的一部分。,32,窗口和视口坐标系位置的设置,窗口和视口的位置对应关系是通过设置它们对应的基准点实现的,默认的基准点都是(0,0),即虚拟绘图窗口中逻辑坐标系的(0,0)点映射到显示视口中设备坐标系的(0,0)点,逻辑坐标系坐标轴的方向和单位由屏幕映射模式确定。 CPoint
15、 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)系统缺省的映射模式,34,坐标映射模式,2. 逻辑坐标单位固定的映射模式 映射模式 逻辑坐标单位 MM_LOENGLISH 0.01英寸 MM_HIENGLISH 0.001英寸 MM_LOMETRIC
16、 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 clientRect; GetClientRect(clientRect); pDC-SetMapMode(MM_ANISOTROPIC); pDC-SetWindowExt(1000,1000); pDC-SetViewportExt(clientRect.right, - clientRect.bottom); pDC-SetViewportOrg(clientRect.right/2, clientRect.botto