




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于Visual C+技术开发GIS系统哈尔滨工业大学计算机科学与技术学院蔡则苏2009-03-25第二章绘图函数的用法本章主要包括:建立画笔建立画刷绘图函数及其使用方法填充函数及其使用方法几个比较复杂的程序实例本章主要介绍Visual C+图形程序设计所必备的基础知识,包括画笔和画刷的建立、常用线图函数及其在应用程序中的使用方法等。2.1 单文档应用框架 所谓的单文档(SDI)界面应用程序,是指在应用程序中一次只能打开一个文件处理。打开下一个文件之前,必须先关闭上一个打开的文件,才能执行下一个打开操作。对于涉及文档较少的程序,只容许处理单个文档的程序或执行其它功能 。创建过程 创建工程。按照
2、前一章创建工程的步骤创建一个工程,类型为SDI,工程名为Eg3_1,其他选项取默认值。单击“OK”按钮,AppWizard就开始创建应用的子目录、文件和类。 添加自己的代码: 创建过程(续)扩充Eg3_1View.cpp中的OnDraw成员函数:void CEg3_1View:OnDraw(CDC* pDC)CEg3_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-TextOut (60,100,Hello,Welcome to Visual C+ 6.0!)
3、; 创建过程(续)更改应用程序的标题 :选择工作区中ResourceVies标签,展开Eg3_1 ResourcesString Table,双击String Table,弹出字符串资源表 。双击IDR_MAINFRAME项,弹出String Properties对话框。在Caption编辑框中将标题修改为“单文档应用程序nEg3_1”。编译、链接并运行。 CEg3_1App应用程序运行过程 CWinApp类创建的实例theApp,整个程序有且只有一个,一切由它开始,最后以它结束。Visual C+所产生的代码首先通过初始化数据段来建立全局变量,以及建立一些MFC内部使用的对象,然后执行CWi
4、nApp类的构造函数。 CEg3_1App应用程序运行过程(续)一旦所有静态对象的构造函数都执行完毕,运行时间库就会调用WinMain()函数,该函数初始化MFC应用,并调用CWinApp类的InitInstance()函数。完成了这些工作后,WinMain()函数调用CWinApp类的Run()函数,通常默认为CWinThread:Run(),用来得到应用程序的消息循环,或称消息队列。 CEg3_1App应用程序运行过程(续)当程序接收到WM_QUIT消息,就意味着程序终止。这时,MFC会调用CWinApp类的ExitInstance(),然后是静态对象的析构函数,包括CWinApp对象,然
5、后将控制权交还操作系统。 2.2 多文档应用框架 多文档(MDI)接口应用程序是指一个应用程序可以同时打开多个文件进行处理。MDI是大多数应用程序采用的形式。Microsoft公司的Word应用软件就是一个典型的多文档应用。 单文档应用程序和多文档应用程序的比较 在MDI程序中许多程序的细节是与SDI程序是相同的。在MDI程序中使用了CMultiDocTemplate模板,以便程序能够处理多个文档,同时也将视图和文档类连接到该模板及CChildFrame类,CChildFrame类支持出现在主窗口内部的MDI子窗口。 2.3 基于对话框的应用框架 基于对话框的应用程序,是以对话框为形式的应用程
6、序,它对于那些涉及文档较少,主要是交互式操作的应用程序来说比较合适。基于对话框的应用框架和前面介绍的基于文档的应用框架有很大的区别。 创建过程 在AppWizard的第一步,即MFC AppWizard -Step 1中,选中“Dialog based”单选框按钮。在第四步,AppWizard会显示出它将帮助用户创建的类及属性。在这个基于对话框的应用中只有两个类被创建。一个是应用类CEg3_3App,另一个是对话框类CEg3_3Dlg。 创建过程(续)修改对话框资源:在Text properties对话框中,将Caption框中的“TODO: 在这里设置对话控制。”删除,改成为“Hello,W
7、elcome to Visual C+!”。编译、链接 、运行。 注意:基于对话框的应用框架和基于文档的应用框架的区别在于实现对话框的第一步是创建一个对话框对象dlg,然后通过调用对话类的成员函数DoModal()来显示对话框。 2.4 程序运行流程分析 Windows的编程模式:Windows程序运行总是由WinMain()函数开始,该函数主要是建立应用程序的主窗口。Windows程序通过操作系统发送的消息来处理用户输入,程序的主窗口中需要包含处理Windows所发送消息的代码。 MFC应用程序的运行过程 MFC应用程序的运行过程(续)MFC的应用程序运行过程如下:1.应用程序定义一个应用类
8、全局对象。2.应用类对象的构造函数开始执行。3.构造函数执行完后,调用初始化函数InitInstance()。4.在函数InitInstance()中,构造文档模板。5.构造文档模板时,按照生成一个文档的顺序先产生一个最初的文档、视主框架。6.函数InitInstance()生成工具条和状态条,以及其它用户需要的工具。 7.函数InitInstance()执行完成后,应用程序处于等待消息的状态。 三种应用程序框架的异同 相同:每个应用程序的应用类都会自动创建一个InitInstance()函数 相异:单文档应用程序中,应用类的对象由应用框架构造,使用单文档模板类CSingleDocTempla
9、te的对象来构造文档模板。 三种应用程序框架的异同(续)MDI应用程序中,应用类的对象同样也由应用框架构造 ,使用多文档模板类CMulitDocTemplate对象来构造文档模板。基于对话框的应用程序中,首先在函数中生成一个对话框对象,然后再通过DoModal()函数来调用和显示这个对话框。 2.5 小结 前一部分介绍了MFC的三种基本应用框架,并通过三个简单的“Hello,Welcome to C+ 6.0!”实例来说明这三个应用框架的区别。 2.6画笔MFC将Windows提供的各种不同类型的设备环境封装在相应的设备环境类中,即设备上下文(device context, DC),并将设备环
10、境的句柄(ODC)包含在C+类中,所有DC类(例如CPaintDC,CClientDC,CWindowDC) 的基类是CDC类。CDC类提供了在显示器、打印机或窗口的客户区上画图的方法。MFC还定义了若干对应于Windows的绘图工具:画笔(CPen)、画刷(CBrush)、调色板(CPalette)等。我们下面先来介绍画笔和画刷2.6.1 画笔的属性画笔通常具有宽度、样式和颜色3种属性。画笔的宽度即所画的线条宽度,是设备单位表示的。默认的画笔宽度是一个像素单位。画笔的样式确定了所绘制图形的线型,通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线7种样式。这些样式在Windows中都是
11、以PS_为前缀的预定义标识,如下所示:PS_SOLID 实线 PS_DASHDOTDOT 双点划线PS_DASH 虚线 PS_NULL 不可见线PS_DOT 点线 PS_INSIDEFRAME 内框线PS_DASHDOT 点划线2.6.2 画笔的创建只有先创建画笔,CDC才能选中画笔进行绘画。画笔有三种构造函数:CPen:CPen()CPen:CPen(int nPenStyle, int nWidth, COLORREF crColor)CPen:CPen(int nPenStyle, int nWidth, const LOGBRUSH pLogBrush, int nStyleCount
12、=0, const DWORD *lpStyle=NULL)第一种构造函数建立了一个空的画笔对象,必须调用CreatePen()或CreatePenIndirect()初始化画笔。例如:CPen pen; pen.CreatePen(PS_SOLID,1,RGB(0,0,0XFF)创建了绿色的并且实线宽度为1的画笔CPen:CPen(int nPenStyle, int nWidth, COLORREF crColor)第二种构造函数则可以设定画笔的三个属性。 nPenStyle设置画笔的样式,取值为:PS_SOLID(实线)、PS_DASH(虚线)、PS_DASHDOT(点划线)、PS_DA
13、SHDOTDOT(双点划线)、PS_DOT(点线)、PS_NULL(空笔不画线)。PS_INSIDEFRAME创建一个画笔,能在Windows GDI(如椭圆等形状的矩形外框)中画图;crColor 代表颜色,可以用DWORD表示,如 0X00FF0000表示红色,也可以用RGB(r,g,b)来表示,例如:CPen *pen1=new CPen(PS_SOLID,1,0X000000FF)CPen:CPen(int nPenStyle, int nWidth, const LOGBRUSH pLogBrush, int nStyleCount=0, const DWORD *lpStyle=N
14、ULL)第三种构造函数的参数与第二种构造函数的参数很相似,但是有一些的差别:nPenStyle除了能用前面介绍的样式外,还可以与以下的样式合并使用:PS_COSMETIC(建立化妆笔)、PS_ENDCAP_FLAT(线段终点的样式是平的)、PS_ENDCAP_ROUND(线段终点的样式是圆形)、PS_ENDCAP_SQUARE(线段终点的样式是方形)、PS_GEOMETRIC(建立几何笔)、PS_JOIN_BEVEL(线段相接处是以平角相接)、PS_JOIN_MITER(线段相接处是以斜角相接)、PS_JOIN_ROUND(线段相接处是以曲线相接)或PS_USERSTYLE(可以自定义虚线的线
15、段长与线段间距)CPen:CPen(int nPenStyle, int nWidth, const LOGBRUSH pLogBrush, int nStyleCount=0, const DWORD *lpStyle=NULL)如果样式设置为PS_GEOMETRIC,它会参考pLogBrush来建立画笔。NStyleCount是数组lpStyle 的长度,而lpStyle只有在PS_USERSTYLE中才会用到。这个数组的第0个元素是第1个线段的长度,第1元素是第1个线段与第2个线段间隔的长度,其他以此类推。2.6.3 创建多支画笔在绘图中,不同的线段往往要求设置成不同的颜色,这时,就需要
16、创建多支画笔进行绘图。设置多支画笔的操作很简单,程序设置如下:CClientDC *pdc=new CClientDC(this);CPen *pen1=new CPen(PS_SOLID,1,0X000000EE);CPen *pen2=new CPen(PS_SOLID,1,0X00005E00);CPen *pen3=new CPen(PS_SOLID,1,0X00EE0000);CPen *pen4=new CPen(PS_SOLID,1,0X0000ff00);CPen *Oldpen=new pdc-SelectObject(pen1);例1、层次线段图案设计思路:按一定的函数规律
17、变化直线起点与终点的坐标,则可绘制出由直线组成的有层次的图案。本程序实例中使用正弦函数和余弦函数。首先通过使A的值依正弦函数的规律变化其大小,然后再使用计算各画线始点的和终点坐标(X,Y)并画线,画出的图案如下图所示。该图案是由线组成,且线的起点和终点坐标均按照三角函数规律变化。void CMyView:OnLineTo() / TODO: Add your command handler code heredouble i,j;int x1,x2,x3,y1,y2,y3,x4,y4;CClientDC *pdc=new CClientDC(this); CPen pen; pen.Creat
18、ePen(PS_SOLID,1,RGB(0XFF,0,0); CPen *oldpen=(CPen*)pdc-SelectObject(&pen);for (i=0;i=6.28;i+=6.28/8.0) x1=(int)(45*cos(i);y1=(int)(45*sin(i);x2=(int)(30*cos(i);y2=(int)(30*sin(i);for (j=0;jMoveTo(x3,y3);pdc-LineTo(x4,y4);delete pdc;在运行该程序时仔细观察图案,改变例程中的x1,y1,x2,y2坐标值和计算式中的三角函数内的角度值,观察运行结果。2.7 画刷画刷用于指
19、定填充的特性,许多窗口、控件以及其它区域都需要用画刷进行填充绘制,本小节主要介绍画刷。2.7.1画刷的属性画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常都是用户定义的8x8位图,而填充样式往往都是CDC内部定义的一些特性,它们都是以HS_为前缀的标识。尽管库存的GDI对象为我们定义了BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、HOLLOW_BRUSH、LTGRAY_BRUSH、NULL_BRUSH和WHITE_BRUSH这几种画刷,但总没有直接创建画刷来的自由。CBrush类根据画刷
20、属性提供了相应的创建函数。2.7.2 创建画刷画刷属性的变化比画笔复杂多了。为了方便,我们直接考查它的构造函数,画刷有4种构造函数:CBrush:CBrush();CBrush:CBrush(COLORREF crColor);CBrush:CBrush(int nIndex COLORREF crColor);CBrush:CBrush(Cbitmap* pBitmap);第一种构造函数建立了一个空的画刷对象,这样就可以用CreateSolidBrush()、CreatehatchBrush()、CreatehatchBrushIndirect()、CreatePatternBrush()、
21、CreateDIBPatternBrush()建立画刷了。CBrush:CBrush(COLORREF crColor);第二种构造函数建立单一颜色的画刷,也就是说用此画刷画出来的多边形内部将会被填充上指定的颜色。该函数唯一的参数就是它的颜色。如果显卡无法显示画刷的颜色,其处理方式与画笔相同。第四种构造函数中的pBitmap是指向CBitmap对象的指针。这个位图对象包含用作画刷图案的位图,但此位图必须是8x8大小,否则只能截取位图的部分。CBrush:CBrush(int nIndex COLORREF crColor);第三种构造函数建立起一种名为hatch的画刷。此类画刷的特色是,画出来
22、的多边形内部将会被填充为nIndex指定的线条。nIndex可取的常数为:HS_BDIAGONAL(45左下-右上的斜线);HS_CROSS(垂直线和水平线);HS_DLAGCROSS(45左下-右上、左上-右下相交斜线)HS_FDLAGONAL(45左上-右下斜线)HS-HORIZAONTAL(水平线)HS_VERTICAL(垂直线)2.7.3使用画笔和画刷建立画笔和画刷之后,还要在CDC类中选中它们,才能使用它们去画图;但是必须使用CPaintDC、CClientDC或CWindowDC来选中。CPaintDC对象代表了一个窗口的绘图画面。在传统的C程序中,获取设备上下文的方法是,使用Wi
23、ndows的WM_PAINT消息处理程序中的Win32 API函数BeginPaint()和EndPaint()。 BeginPaint()负责为绘图提供特定的窗口,将绘图消息添入PAINTSTRUCT结构,并将句柄返回给显示设备环境。EndPaint()会在指定的窗口中声明绘图的结束。CPaintDC对象也执行与以上相同的操作步骤,只不过这些步骤被包含在MFC类中。使用CPaintDC对象的步骤如下:1、创建CPaintDC对象2、用CPaintDC绘图3、撤销CPaintDC对象例如,在窗口的消息处理函数OnPaint(),用CPaintDC画一个矩形。首先,要把该成员函数添加到窗口的消息
24、映射表中:BEGIN_MESSAGE_MAP (CWhjView, CScrollView)/CWhjView的消息映射表ON_WM_PAINT()END_MESSAGE_MAP()/在实际程序中还有很多消息的/映射声明,这里只写了一个Void CWhjView:OnPaint()CPaintDC dc(this);/device context for paintingCPen pen;pen.CreatePen(PS_SOLID,1,RGB(0 xFF,0,0);dc.SelectObject(&pen);/SelectObject(*Object)/选中需要的画笔、画刷dc.Rectan
25、gle(0,0,10,10);/画一个红色的矩形CClientDC对象代表了客户程序区域的绘图画面,它只能在窗口的客户区域中画图。有关CClientDC的例子将在后面的例子中进一步介绍CWindowDC类可以很方便处理窗口整个画面(包括客户程序区和非客户程序区)的设备上下文的调用和释放。如果要在非客户程序区域内绘图则可以用CWindowDC对象,在非客户区绘图后,这些图形将覆盖它下面的内容,如标题、按钮、菜单等。2.8线图函数任何线图都是由点和线组成的,本节介绍线图函数2.3.1SetPixel()函数画点是最基本的绘图操作。在绘图中,画点是通过调用CDC:SetPixel()或CDC:Set
26、PixelV()函数来实现。这两个函数的原型如下:COLORREF SetPixel (int x, int y, COLORREFcrColor);COLORREF SetPixel (POINT point, COLORREFcrColor);BOOL SetPixelV (int x, int y, COLORREF crColor);BOOL SetPixelV (POINT point, COLORREF crColor);例2使用SetPixelV(int x, int y, COLORREF crColor);函数画图程序设计void CMyView:OnSEtPixel1()
27、/ TODO: Add your command handler code hereCClientDC *pdc=new CClientDC(this); CPen pen; pen.CreatePen(PS_DOT,2,RGB(255,0,0); CPen *oldpen=(CPen*)pdc-SelectObject(&pen);int x,y;y=100;for(x=100;xSetPixelV(x,y,RGB(255,0,0);pdc-DeleteDC();例3使用SetPixel(int x, int y, COLORREF crColor);函数画图程序设计2.8.2MoveTo(
28、)和LineTo()函数MoveTo()函数用于设置当前的x和y的位置,给LineTo()函数提供画线的起始坐标。LineTo()函数用于画线。1)MoveTo()函数CPoint MoveTo(int x, int y);CPoint MoveTo (POINT point);参数说明:x:定义新位置的x的坐标y:定义新位置的y坐标Point: 指定新位置,可为其传递一个point结构或一个point对象该函数的功能是将线的起始点从当前位置移动到新位置(x,y)。只移动点,不画线2.8.2MoveTo()和LineTo()函数1)LineTo()函数BOOL LineTo(int x, in
29、t y);BOOL LineTo (POINT point);参数说明:x:定义线段终点的x的坐标y:定义线段终点的y坐标Point: 指定新位置,可为其传递一个point结构或一个point对象该函数的功能是从当前端点的位置到新端点(x,y)画线(但不包括此端点)。例5使用MoveTo()和LineTo()函数画一条直线例6使用MoveTo()和LineTo()函数画一组直线例7直线段图案2.3.3画椭圆函数画椭圆、圆弧的函数有Ellipse()函数、Arc()函数、Chord()函数和Pie()函数1)Ellipse()函数该函数的功能是画椭圆,函数格式如下:BOOL Ellipse (i
30、nt x1, int y1, int x2, int y2);BOOL Ellipse (LPCRECT lpRect);参数说明:x1: 限制椭圆范围的矩形左上角x坐标y1: 限制椭圆范围的矩形左上角y坐标x2: 限制椭圆范围的矩形右下角x坐标y2: 限制椭圆范围的矩形右下角y坐标lpRect:指定椭圆的限定矩形,可为其传递一个Create对象例8利用Ellipse()画椭圆2.8.3画椭圆函数画椭圆、圆弧的函数有Ellipse()函数、Arc()函数、Chord()函数和Pie()函数2)Arc()函数该函数的功能是画一段椭圆弧,函数格式如下:BOOL Arc (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);参数说明:x1: 限制椭圆范围的矩形左上角x坐标y1: 限制椭圆范围的矩形左上角y坐标x2: 限制椭圆范围的矩形右下角x坐标y2: 限制椭圆范围的矩形右下角y坐标x3: 画弧起点的x坐标y3:画弧起点的y坐标x4: 画弧终点的x坐标y4:画弧终点的y坐标例9利用Arc()函数画一个椭圆弧画椭圆、圆弧的函数有E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 发酵工程技术员考试试卷及答案
- 2025年毛纺织、染整加工产品合作协议书
- 国开学习网《园林生态学》形成性考核册任务1234答案
- 指向数学核心素养的代数概念课教学
- 2025年气象、水文仪器及装置合作协议书
- 2025年廊坊市香河县事业单位招聘考试试题【答案】
- 萧红中学校中考二模语文试题(含答案)
- 项目合同管理
- 小升初英语试题和答案(一)
- 2025年温湿度仪表项目发展计划
- 2025-2030中国老旧垃圾填埋场治理行业前景动态与发展趋势预测报告
- 护士职业损伤防护课件
- 2025汽车贷款还款合同范本
- 包装,设计合同5篇
- 适用奶茶店兼职合同协议
- 国防教育讲座课件
- 2025年全国保密教育线上培训考试试题库附答案【考试直接用】含答案详解
- 2025年保密观知识竞赛题库必考题含答案详解
- 【作业设计】《跨学科实践:制作简易杆秤》作业设计人教版八年级下冊物理
- 车间班组安全培训课件
- 2025春季学期国开河南电大本科《行政管理理论与实践专题讲座》一平台无纸化考试(作业练习+我要考试)试题及答案
评论
0/150
提交评论