第9章 简单交互式图形系统的设计与实现_第1页
第9章 简单交互式图形系统的设计与实现_第2页
第9章 简单交互式图形系统的设计与实现_第3页
第9章 简单交互式图形系统的设计与实现_第4页
第9章 简单交互式图形系统的设计与实现_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章简单交互式图形系统的设计与实现9.1系统简介9.2系统设计与实现习题

9.1系统简介9.1.1系统用户界面系统运行界面如图9.1所示。本系统以Windows画板为设计原型,在功能上,给用户提供了画线、框、圆、多边形、三维立体、曲线、填充以及动画、分形算法程序实现演示等基本操作,填充方式根据图形学的概念提供了两种方式,即多边形填充和种子填充。图9.1系统运行界面9.1.2系统结构本系统采用树状的层次结构进行组织(如图9.2所示),主要包括文档管理、窗口管理、图形编辑管理三大功能模块。其中文档管理主要完成文档的新建、保存、输出打印等功能;窗口管理定义系统界面风格,提供对画面编辑区域及工具条、系统状态面板、菜单面板等的显现与隐藏的管理;图形编辑管理模块主要用于完成直线、曲线、封闭区域等的绘制、填充、几何变换和三维图形的生成、投影、消隐及显现。图9.2系统组成结构9.2系统设计与实现9.2.1图形编程的基础知识

VC++是一种面向对象程序设计语言,基于面向对象程序设计语言的程序设计方法都支持三种基本的活动:识别对象(Object)和类(Class),描述对象和类之间的关系,以及通过描述每个类的功能定义对象的行为。1.设备环境类

CDC类封装了WindowsAPI中用来画图的函数,同时该类负责维护设备环境。

CClientDC类用来创建和破坏一个设备环境,它在堆栈中建立。

CWindowDC类维护窗口的非客户区,和CClientDC类一样。

CPaintDC类在构造函数中调用CWnd∷BeginPaint()获得设备环境,以便在有效的客户区进行绘图。

CMetaFileDC类创建一个元文件,可以把它看做是一个屏幕设备,但其实它是一个磁盘文件。产生的文件可以存放在磁盘中,以后还可以读入,进行修改。2.图形对象类CBitmap类建立和控制“位图”对象(内存中的位图)。CBrush类建立和控制“刷子”对象。填充图形和绘图的刷子。CFont类建立与控制字体对象。CPalette类建立和控制调色板对象。CPen类建立和控制画笔对象,画笔是图形的边界模式。CRgn类建立和控制GDI绘图设备区域对象。9.2.2程序设计1.类的设计本系统主要用到了以下一些类:

CJhtxsApp,CMainFrame,CJhtxsView,CJhtxsDoc,CDialog,Cnewbmp

其中,CJhtxsApp是应用程序类,支持应用程序的建立和基本交互;CMainFrame是应用程序主窗口框架类,用来实现主窗口的功能;CJhtxsView是应用程序主窗口视图类,支持视图的功能实现;CJhtxsDoc为文档类,用于实现文档的功能;CDialog是工具箱类,提供人机消息反馈平台;Cnewbmp为对象空间类,聚集着CSolid(实体类)、CRect(面类)、CLoop(环类)、Cline(边类)、CVertex(顶点类)、CMaterial(材质类)、CLightSource(光源类)等所有类的对象。上述各类之间的对应关系结构如图9.3所示。图9.3各类之间的对应关系1)CMainFrame

主窗口类(CMainFrame)主要定制图标、工具条的建立、显示和交互,其定义代码如下:

classCMainFrame:publicCFrameWnd

{protected://createfromserializationonlyCMainFrame();DECLARE-DYNCREATE(CMainFrame)public://Attributespublic:CToolBar*m-pToolsToolbar;//Operationspublic://Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX-VIRTUAL(CMainFrame)virtualBOOLPreCreateWindow(CREATESTRUCT&cs);//}}AFX-VIRTUAL//Implementationpublic:virtual~CMainFrame();#ifdef-DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endif

protected://controlbarembeddedmembersCStatusBarm-wndStatusBar;

CToolBarm-wndToolBar;//Generatedmessagemapfunctionsprotected://{{AFX-MSG(CMainFrame)afx-msgintOnCreate(LPCREATESTRUCTlpCreateStruct);

afx-msgvoidOnRect();

afx-msgvoidOntoolsmenu();//}}AFX-MSGDECLARE-MESSAGE-MAP()};2)CjhtxsDoc

文档类(CjhtxsDoc)用于实现矢量图形对象的建立、存储和读取,其代码定义如下:

classCJhtxsDoc:publicCDocument

{protected://createfromserializationonlyCJhtxsDoc();DECLARE-DYNCREATE(CJhtxsDoc)//Attributespublic://Operationspublic://Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX-VIRTUAL(CJhtxsDoc)public:virtualBOOLOnNewDocument();virtualvoidSerialize(CArchive&ar);//}}AFX-VIRTUAL//Implementationpublic:virtual~CJhtxsDoc();#ifdef-DEBUG

virtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endif

protected://Generatedmessagemapfunctionsprotected://{{AFX-MSG(CJhtxsDoc)//NOTE-theClassWizardwilladdandremovememberfunctionshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX-MSGDECLARE-MESSAGE-MAP()};3)CjhtxsView

视图类(CjhtxsView)接收用户的对特定图形对象的操作并绘制图形对象,在界面上改变少,主要处理键盘鼠标事件和调用各图形对象的绘制方法,所以实现上要尽量统一,充分利用图形对象的多态性。以下是其代码定义:

classCJhtxsView:publicCFormView

{protected://createfromserializationonlyCJhtxsView();DECLARE-DYNCREATE(CJhtxsView)public:

Ccolordlg*dlg;

boolnewbmp;

boolopenbmp;Clinewidth*linewidthdlg;//{{AFX-DATA(CJhtxsView)

enum{IDD=IDD-JHTXS-FORM};//NOTE:theClassWizardwilladddatamembershere//}}AFX-DATA//Attributespublic://CJhtxsDoc*GetDocument();

intnPenStyle;

intnWidth;COLORREFLineColor;COLORREFFillColor;

Cnewbmp*bmp;intbmpcounter;

intwidth;

intheight;//Operationspublic:BITMAPINFOHEADERbi;//信息头

RGBQUAD*quad;//调色板

BYTE*lpBuf;//图像数据

BITMAPINFO*pbi;

intflag;//标志表示是否打开了bmp文件

intnumQuad;//调色板数目BYTE*lpshowbuf;//用于显示的图像数据

intzoomfactor;//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX-VIRTUAL(CJhtxsView)public:virtualBOOLPreCreateWindow(CREATESTRUCT&cs);protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport

virtualvoidOnInitialUpdate();//calledfirsttimeafterconstruct

virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);virtualvoidOnPrint(CDC*pDC,CPrintInfo*pInfo);virtualvoidOnDraw(CDC*pDC);//}}AFX-VIRTUAL//Implementationpublic:voiddrawbmp();

CStringfilename;

booltext;

boolrect;

boolline;

boolopen();

boolPrepareShowdata();virtual~CJhtxsView();#ifdef-DEBUG

virtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endif

protected://Generatedmessagemapfunctionsprotected://{{AFX-MSG(CJhtxsView)afx-msgvoidOnLine();

afx-msgvoidOnFileNew();

afx-msgvoidOnFileOpen();

afx-msgvoidOnFileSave();

afx-msgvoidOnEllipse();

afx-msgvoidOnColordlg();

afx-msgvoidOnLinewidth();

afx-msgvoidOnUpdateLine(CCmdUI*pCmdUI);

afx-msgvoidOnRect();

afx-msgvoidOnUpdateRect(CCmdUI*pCmdUI);

afx-msgvoidOnbrush();

afx-msgvoidOneraser();

afx-msgvoidOnpen();

afx-msgvoidOntext();

afx-msgvoidOnsmall();

afx-msgvoidOnbig();

afx-msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags);

afx-msgvoidOnUpdatetext(CCmdUI*pCmdUI);

afx-msgvoidOnFileSaveAs();

afx-msgvoidOnPsSolid();

afx-msgvoidOnPenstyleSolid();

afx-msgvoidOnToolsLine();

afx-msgvoidOnPenstyleDash();

afx-msgvoidOnPenstyleDot();

afx-msgvoidOnPenstyleDashdot();

afx-msgvoidOnPenstyleNull();

afx-msgvoidOnPenSingle();

afx-msgvoidOndouble();

afx-msgvoidOnColorFillcolor();

afx-msgvoidOnToolsArc();

afx-msgvoidOnToolsPolyline();

afx-msgvoidOnToolsPolybeizer();

afx-msgvoidOnToolsRectangle();

afx-msgvoidOnToolsRoundrect();

afx-msgvoidOnToolsChord();

afx-msgvoidOnToolsPie();

afx-msgvoidOnToolsPolygon();

afx-msgvoidOnToolsFillrect();

afx-msgvoidOnToolsFillsolidrect();

afx-msgvoidOnClear();

afx-msgvoidOnFilePrint();afx-msgvoidOnEditUndo();//}}AFX-MSGDECLARE-MESSAGE-MAP()};4)CJhtxsAppCJhtxsApp是应用程序类,支持应用程序的建立和基本交互,其代码定义如下:

classCJhtxsApp:publicCWinApp

{public:virtualBOOLPreTranslateMessage(MSG*pMsg);

CJhtxsApp();//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX-VIRTUAL(CJhtxsApp)public:virtualBOOLInitInstance();//}}AFX-VIRTUAL//Implementation//{{AFX-MSG(CJhtxsApp)afx-msgvoidOnAppAbout();//NOTE-theClassWizardwilladdandremovememberfunctionshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX-MSGDECLARE-MESSAGE-MAP()};5)对各图形对象的基类Cnewbmp的了解是关键,它定义了绘图类别和绘制状态,以下是该类的设计代码:

classCnewbmp:publicCDialog

{//Constructionpublic://booltext;voiddrawtext(inttextcounter);voidclose();voiddrawrect(Crect*currect);

intlinewidth;COLORREFbackcolor;COLORREFlinecolor;

intstyle;boolopen1;

boolrect;

intrectcounter;voidopen();//图形对象变量

CLine*lines[30];

Crect*rectlist[30];

Ctext*textlist[30];

inttextcounter;

intlinecounter;

boolline;

boolcheck;

CPointpointbefore;

CPointpointlast;

intwidth;~Cnewbmp();voiddrawline(intlinecounter);

Cnewbmp(CWnd*pParent=NULL);//standardconstructor//DialogData//{{AFX-DATA(Cnewbmp)enum{IDD=IDD-NEW};//NOTE:theClassWizardwilladddatamembershere//}}AFX-DATA//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX-VIRTUAL(Cnewbmp)protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport//}}AFX-VIRTUAL//Implementationprotected://Generatedmessagemapfunctions//{{AFX-MSG(Cnewbmp)afx-msgvoidOnLButtonDown(UINTnFlags,CPointpoint);

afx-msgvoidOnLButtonUp(UINTnFlags,CPointpoint);

afx-msgvoidOnMouseMove(UINTnFlags,CPointpoint);

afx-msgvoidOnPaint();

virtualBOOLOnInitDialog();

afx-msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags);//}}AFX-MSGDECLARE-MESSAGE-MAP()};2.创建程序框架程序框架是用MFC实现的,MFC应用程序向导(AppWizard)生成了大部分的代码,然后加入图形对象空间类程序代码。具体步骤如下:1)创建一个新项目从文件菜单上选择新建选项,然后在出现的新建对话框中选择项目表单,在该表单中,类型选择MFCAppWizard(exe)选项,项目名称设为Jhtxs,其它按照提示进行设置即可。应用程序向导将自动生成四个类:·CJhtxsApp应用程序类;·CJhtxsDoc文档类;·CJhtxsView视图类;·CmainFrame主框架类。2)添加图形对象空间类程序代码添加图形对象空间类程序代码分两种情况考虑:如果绘图类程序代码以前已经编写好了,则从新项目窗口上选择文件视图(FileView),右击源文件夹,展开jhtxs,然后添加文件到文件夹;如果是新建源文件,则在jhtxs项目窗口下,选择文件→新建→选择下列其中之一:·头文件(C++HeadFile);·源文件(C++SourceFile);·资源文件(ResourceScript);

3.编写应用程序的菜单和工具条应用程序框架提供的初始菜单和工具条都非常简单,不能满足我们的需要,所以必须对该菜单和工具条进行修改或编写。先简单介绍一下需要完成的菜单。应用程序菜单有六个菜单项:文件菜单,用于管理各种文档;编辑菜单,对绘制图形文件提供复制、剪切、粘贴等基本操作;工具菜单,选择绘图工具;查看菜单,提供图形属性如放大、缩小、颜色等的浏览和管理;帮助菜单,使用应用程序框架中的默认菜单。先在菜单编辑器中修改原有菜单,使之满足系统要求。菜单修改如表9-1所示。修改后的菜单如图9.4所示。表9-1菜单修改表图9.4修改后的菜单与菜单条相对应,我们对应用程序框架生成工具条也作相应修改。系统自动生成的文档管理工具条保留不变,我们新建一个绘图工具条(如图9.5所示)。图9.5新建的绘图工具条4.给菜单和工具条连接代码设置好菜单和工具条后,需要给它们连接代码,以完成系统交互功能,主要工作介绍如下:

1)定义笔、刷子和画布首先创建一个笔对象和刷子对象,由于要求笔、刷子和画布对象在View类的任何地方都可以使用,因此笔、刷子和画布要在jhtxsView.h文件中定义。具体方法如下:首先打开jhtxsView.h,在如下所示地方加入下列深色粗体代码:

classCJhtxsView:publicCFormView

{protected://createfromserializationonlyCJhtxsView();DECLARE-DYNCREATE(CJhtxsView)…//Attributespublic://CJhtxsDoc*GetDocu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论