




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学课程设计实验报告姓 名:学 号: 专 业:地理信息系统一、课程设计目的在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。二、课程设计内容 仿照Windows的附件程序“画图”, 用C+语言编制一个具有交互式绘制和编辑多种图元功能的程序“Mini-Painter”,实现以下功能对应的设计内容:(1) 能够以交互方式在图形绘制区绘制点、直线(折线)、圆(椭圆)、圆弧、多边形、Beizer曲线、封闭区域填充、文字等基本图元;(2) 设置线条的颜色、线型和线条宽度,对绘制的图元进行线条和填充属性的修改;(3) 支持图元的点选和基于橡皮筋技术的圈选;(4) 对选中的图元进行平移、缩放、旋转和对称等变换;三、实验步骤1新建MFC应用程序1.1新建工程。运行VC+6.0,新建一个MFC AppWizardexe工程,并命名为“0710070118”,选择保存路径,确定。1.2选择应用程序的类型,选择“单文档”,则可以通过菜单打开对话框2建立单文档应用程序,在其中调用对话框2.1 查看工程资源在单击完成之后,即建立了一个工程,在工程的左侧资源视图可以看到MFC向导为该程序提供的一些资源。分别如下所示: 2.2插入对话框资源 想在文档应用程序中,通过单击菜单来打开一个对话框,首先要建立该对话框的资源。右击“resources”中的“dialog”项,在弹出的菜单中选择“插入”,打开插入菜单对话框,如图所示:对话框资源插入后,可修改一些属性,比如 标题、字体等等。在对话框空白处右击,选择属性就可打开资源的属性对话框,按照要求设置对话框的属性。2.3布置对话框界面 对话框资源插入后,即可在该对话框上布置各种需要的控件,并可通过编排菜单的各种命令或“对话”工具条调整各控件的大小,位置,对齐方式等,还可以单击 对话 工具条上第一个按钮“ 测试 ”按钮,看到对话框运行时的界面。外观属性的设置,可先选中该控件资源,在右击弹出的快捷菜单中选择“属性” 命令,进行相应的设置。2.4 创建对话框类对话框资源建立后不能直接运行,因为运行时出现的对话框时一个实际存在的对话框对象,所以应先建立这种类型的对话框类。在对话框空白处右击的快捷菜单中选择“建立类向导”或“查看”菜单中选择“建立类向导”命令,可打开“MFC ClassWizard”对话框,首先会有一个小的“Adding a Class”对话框弹出,询问是否为该对话框建立一个新类,单击“OK”按钮。如下图示:在弹出的“New Class”对话框中输入该新对话框类的名称,取类名为“CFirstDlg”,表示一个类单击“OK”完成添加类的过程,在“Class name”栏中可以看到新建的类,如图:2.5 调用对话框对话框建立好后,通过创建该类的对象,调用相应的成员函数,可以显示该类型对话框的对象。2.6 增加菜单项在应用程序左侧的“ResourceView”中展开Menu菜单,双击程序主菜单的ID号,右侧资源编辑器窗口中可看到该菜单的资源外观。2.7删除自动生成的文件和编辑菜单项,并将添加菜单的虚线矩形框拖到第一个菜单的位置。2.8根据软件所需要实现的功能,具体添加的菜单项如下:一级菜单二级菜单三级菜单基本图形绘制绘制直线绘制圆绘制椭圆曲线绘制Beizer曲线清除曲线图形填充扫描转换线算法扫描线填充图形变换平移缩放旋转对称设置线宽颜色清除2.9双击图1-42中“线形绘图函数”菜单项右侧的虚线矩形框,在打开的菜单项属性对话框中,不选择“Pop-up”复选框,在“Caption”输入框输入“绘制直线”,在“ID”下拉输入框中输入“ID_DRAW_LINETO”,然后关闭对话框,这样就创建了“绘制直线”菜单。也可以在“线形绘图函数”菜单项和“区域绘图函数”菜单项之间加上一条分隔线。双击“区域绘图函数”菜单项下的虚线矩形框,在打开的菜单项属性对话框中选择“Separator”复选框。然后关闭对话框,并将该菜单项移动到“区域绘图函数”菜单项上面。添加完菜单如图所示:3、使用ClassWizard为菜单项连接处理函数3.1在Visual Studio C+ 6.0开发环境中,选中“View”菜单下的“建立类向导”菜单项,打开“MFC ClassWizard”对话框。在“MFC ClassWizard”中选择“Class name”为默认对话框的类,因为“调用”按钮的消息映射函数是默认对话框类的成员函数,“Objects IDs”中选择IDC_BUTTON1,Messages中选择消息BN_CLICKED,单击“Add Function”,在“Member functions”列表中可以看到新增的消息映射函数,单击“Edit Code”按钮进入代码编辑窗口,编辑相应的函数体代码。3.2在“Class name:”下拉框中选择CFirtDig类,然后在“Object IDs:”列表框中选中ID_DRAW_LINETO,这是为我们刚才创建的菜单中的“画点”三级菜单所设置的ID。在“Object IDs:”列表框中我们可以看到所设置的所有ID。选中ID_DRAW_LINETO后,我们会看到在“Messages:”列表框中列出了它所支持的MFC系统消息,也就是菜单项所支持的MFC系统消息。而在“Member functions:”列表框中列出了CDrawTestView类当前所有的成员函数。右侧的“Add Function”按钮变为可用,我们可以点击此按钮,或者双击COMMAND消息,都可以打开“Add Member Function”(添加成员函数)对话框。3.3添加成员函数3.4双击该成员函数,输入画点的代码:编写“Polyline”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawPolyline() / TODO: Add your command handler code hereCClientDC dc(this);POINT p5;p0.x = 300;p0.y = 200;p1.x = 400;p1.y = 200;p2.x = 400;p2.y = 300;p3.x = 350;p3.y = 350;p4.x = 320;p4.y = 220;dc.Polyline(p,5);编写“Arc”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawArc() / TODO: Add your command handler code hereCClientDC dc(this);dc.Arc(100,200,300,300,280,120,120,280);编写“AngleArc”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawAnglearc() / TODO: Add your command handler code hereCClientDC dc(this);dc.MoveTo(450,100);dc.AngleArc(550,200,50,90,270);编写“PolyBezier”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawPolybezier() / TODO: Add your command handler code hereCClientDC dc(this);POINT p7;p0.x = 200;p0.y = 100;p1.x = 200;p1.y = 200;p2.x = 300;p2.y = 200;p3.x = 400;p3.y = 300;p4.x = 500;p4.y = 400;p5.x = 300;p5.y = 400;p6.x = 100;p6.y = 450;dc.PolyBezier(p,7);编写“Rectangle”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawRectangle() / TODO: Add your command handler code hereCClientDC dc(this);dc.Rectangle(450,100,650,250);编写“RoundRect”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawRoundrect() / TODO: Add your command handler code hereCClientDC dc(this);dc.RoundRect(650,250,850,400,20,20);编写“Ellipse”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawEllipse() / TODO: Add your command handler code hereCClientDC dc(this);dc.Ellipse(450,400,650,500);编写“Pie”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawPie() / TODO: Add your command handler code hereCClientDC dc(this);dc.Pie(100,300,300,400,280,220,120,380);编写“Chord”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawChord() / TODO: Add your command handler code hereCClientDC dc(this);dc.Chord(100,400,300,500,280,320,120,480);编写“Polygon”菜单项处理函数,输入如下代码:void CDrawTestView:OnDrawPolygon() / TODO: Add your command handler code hereCClientDC dc(this);POINT p4;p0.x = 300;p0.y = 150;p1.x = 350;p1.y = 1;p2.x = 420;p2.y = 200;p3.x = 350;p3.y = 150;dc.Polygon(p,4);3.5按照上面的方法,添加其它菜单项的处理函数,我们可以在MFC类向导中一次把所有要添加的处理函数都添加完,再对其进行编辑。3.6使用鼠标绘图:实现对鼠标消息的处理要完成以下工作:(1) 定义鼠标消息处理函数;(2) 使用消息映像宏实现鼠标消息和消息处理函数间的消息映像;(3) 编写鼠标消息处理函数的代码。3.7使用类向导来添加鼠标消息处理函数打开类向导,在类列表中选择CDrawDlg类,在消息列表框中选择WM_LBUTTONDOWN消息并用鼠标左键双击,用同样方法添加WM_MOUSEMOVE消息和WM_LBUTTONUP消息的处理函数3.6运行应用程序,我们可以通过选择菜单项来看对应的绘图函数的执行结果。4、设置线型和线宽4.1设置绘制图形的线宽,在Dialog中插入一个新的对话框资源,鼠标右键点击资源面板中该节点,在弹出的快捷菜单中选择“Properties”,在弹出的对话框属性对话框中将ID改为IDD_SETSTYLE并拖入如图所示控件,用以调整设置线型。4.2修改线型控件的IS为IDC_LINESTYLE。对话框资源创建完毕后,还需要创建对话框类来加载该资源。在对话框编辑区双击对话框,系统会自动打开类向导,并出现添加新类对话框,4.3输入类名,CSetStyleDlg,该类的基类为CDialog。在“Dialog ID”下拉框中选择创建的对话框类所对应的对话框资源ID,这里选择IDD_SETSTYLE。然后单击OK按钮,系统将创建对话框类CSetStyleDlg。关闭类向导,然后选择类面板,在该类中默认添加了一个构造函数和一个DoDataExchange函数。DoDataExchange函数用于完成对话框中的控件与控制变量或数据变量的连接。4.4在“Control IDs”列表框中选择ID为IDC_LINEWIDTH,该ID即为输入线宽的输入框,然后单击右侧的“Add Variable”按钮,会出现“Add Member Variable”(添加成员变量)对话框,如图2.20所示。对话框中的“Member variable name”输入框用于输入成员变量名,默认会有一个“m_”的前缀。这里我们输入m_LineWidth。在“Category”下拉框中选择成员变量的类型,可选Value(数据成员变量)或Control(控制成员变量),这里选择Value,表示该成员变量用于获得控件的数据。在“Variable type”下拉框中用于选择成员变量的值类型,根据成员变量类型的不同,此处可选择的值类型会不同。这里因为我们选择的类型是Value,所以可以选择的值类型包括CString(字符串,输入框的默认值类型),int(整型值),long(长整型值)等,我们选择int作为线宽变量m_LineWidth的值类型。单击OK按钮,系统创建该成员变量,我们看到已经为ID为IDC_LINEWIDTH的输入框资源连接了值类型为int的数据成员变量m_LineWidth。因为当前选择的是该变量,所以可以在下面的“Minimum Value”和“Maximum Value”输入框中输入当前变量的可输入的最小值和最大值,应用程序框架将确保用户输入值不会超出设定的范围。此处我们分别输入1和20,即最小线宽为1,最大线宽为20。单击OK按钮关闭类向导,即可以在类面板中看到CSetStyleDlg类已经增加了成员变量m_LineWidth。4.5现在需要在绘制图元时使用当前的线型和填充方式。在图元基类CMapElement中添加如下成员变量:public:int m_LineStyle;/线型int m_LineWidth;/线宽COLORREF m_LineColor;/画线颜色int m_FillStyle;/区域填充方式COLORREF m_FillForeColor;/区域填充前景色COLORREF m_FillBackColor;/区域填充背景色并添加如下成员函数:CPen* GetPen();CBrush* GetBrush();这两个成员函数用于获得使用当前线型和区域填充方式的画笔和画刷指针。主要修改的是两部分,一是创建图元子类对象后需要设置当前的线型和填充模式(直线段和椭圆不需要设置填充模式),二是要将多余的橡皮线擦除。4.6颜色和示例的实时显示在设置线型和区域填充模式对话框中,我们希望点击“.”按钮后可以显示“颜色”设置对话框,让用户选择想要使用的颜色,然后可以在对应的按钮上显示出用户选择的颜色,并且可以在示例中的按钮上用当前用户选择的线型和填充模式绘制一个示例图形。下面我们介绍如何实现这些功能。首先,为了记录用户选择的线型,颜色,填充方式等信息,需要在对话框类中增加如下的成员变量:public:int m_LineStyle;/线型COLORREF m_LineColor;/画线颜色int m_FillStyle;/区域填充方式COLORREF m_FillForeColor;/区域填充前景色COLORREF m_FillBackColor;/区域填充背景色以上成员变量不连接对话框中的控件资源,不用像添加m_LineWidth成员变量那样添加。这些成员变量(包括m_LineWidth)的值需要在调用该对话框时设置为当前用户使用的线型和填充方式,所以添加成员函数SetStyle,用于设置相应的数值,其函数声明如下:/设置线型和区域填充方式为当前使用的void SetStyle(int lineStyle, int lineWidth, COLORREF lineColor, int fillStyle, COLORREF ffColor,COLORREF fbColor);函数代码如下:void CSetStyleDlg:SetStyle(int lineStyle, int lineWidth, COLORREF lineColor, int fillStyle, COLORREF ffColor, COLORREF fbColor)m_LineStyle = lineStyle;/设置线型m_LineWidth = lineWidth;/设置线宽m_LineColor = lineColor;/设置画线颜色m_FillStyle = fillStyle;/设置区域填充方式m_FillForeColor = ffColor;/设置区域填充前景色m_FillBackColor = fbColor;/设置区域填充背景色4.7打开类向导,选择为CSetStyleDlg类添加WM_DRAWITEM消息的处理函数,处理函数名为系统的默认的OnDrawItem。该函数用于完成对话框中各个控件的绘制,其函数声明如下:afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);其中参数nIDCtl为要绘制的控件的ID;参数lpDrawItemStruct指向LPDRAWITEMSTRUCT结构体,该结构体中存放了传入ID对应的控件的相关信息,我们需要用到的是其中的hDC成员变量,该变量是用户绘制控件的设备环境句柄。我们使用该函数的思想是:该函数用于绘制传入的ID所指定的控件资源,我们在函数中判断传入的ID是我们要用于显示颜色或示例的控件的ID,则自行编码完成绘制,并不调用系统默认的绘制该种控件的函数,而其它控件则仍然调用系统的默认绘制控件函数。颜色设置面板:打开类向导,选择为CSetStyleDlg类添加WM_DRAWITEM消息的处理函数,处理函数名为系统的默认的OnDrawItem。该函数用于完成对话框中各个控件的绘制, afx_msg我们在OnDrawItem函数中输入代码:调用“颜色”对话框选择颜色,为按钮添加处理函数,在对话框资源编辑区中用鼠标双击要添加处理函数的按钮,弹出成员函数添加对话框,并设置一个默认的函数名,单击对话框的OK按钮就可以创建按钮的处理函数。用以上方法添加三个“.”按钮的处理函数,函数名称均使用默认名称,然后输入代码:void CSetStyleDlg:OnLinecolor() / TODO: Add your control notification handler code hereCColorDialog dlg;/构造系统提供的颜色设置的对话框/调用对话框if (dlg.DoModal()=IDOK)/用户选择“确定”来关闭颜色对话框,则获得用户选择的颜色m_LineColor=dlg.GetColor();/获得画线颜色显示按钮的指针,并使该按钮重画CWnd* pWnd=GetDlg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公共管理理论与实务考试试题及答案
- 游戏在小学英语词汇教学中的应用研究
- 2025年家庭装修设计合同电子版
- 2025年中国铝酸钴项目创业计划书
- 天津市军队离休退休干部活动中心企业信用报告-天眼查
- 中国新型电池项目投资计划书
- 2025年中国生物质塑料项目创业计划书
- 中国乙烯醇共聚物项目创业投资方案
- 工业金属锻件项目可行性研究报告参考范文
- 观光车安全知识培训方案课件
- 2025年社区网格工作人员考试题库及答案
- 小学生心理团辅方案与记录模板
- 2025年淮南市大通区和寿县经开区公开招聘社区“两委”后备干部30名备考考试题库附答案解析
- 国防科大优势课件
- 2025-2030儿童绘本阅读行业市场现状与未来趋势及投资机会评估报告
- 职业教育教师教学竞赛评审标准
- 医疗器械财务汇报
- 消毒供应中心包装课件
- 人教PEP版(2024)三年级上册英语教案全册教案
- 河道生态修复工程重点难点分析
- 配电箱保养安全培训课件
评论
0/150
提交评论