简单交互式图形系统的设计与实现.ppt

上传人:牧羊曲112 文档编号:6139426 上传时间:2023-09-28 格式:PPT 页数:62 大小:911KB
返回 下载 相关 举报
简单交互式图形系统的设计与实现.ppt_第1页
第1页 / 共62页
简单交互式图形系统的设计与实现.ppt_第2页
第2页 / 共62页
简单交互式图形系统的设计与实现.ppt_第3页
第3页 / 共62页
简单交互式图形系统的设计与实现.ppt_第4页
第4页 / 共62页
简单交互式图形系统的设计与实现.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《简单交互式图形系统的设计与实现.ppt》由会员分享,可在线阅读,更多相关《简单交互式图形系统的设计与实现.ppt(62页珍藏版)》请在三一办公上搜索。

1、第 9 章 简单交互式图形系统的设计与实现,9.1 系统简介 9.2 系统设计与实现 习题,9.1 系统简介,9.1.1 系统用户界面 系统运行界面如图9.1所示。本系统以Windows画板为设计原型,在功能上,给用户提供了画线、框、圆、多边形、三维立体、曲线、填充以及动画、分形算法程序实现演示等基本操作,填充方式根据图形学的概念提供了两种方式,即多边形填充和种子填充。,图 9.1 系统运行界面,9.1.2 系统结构 本系统采用树状的层次结构进行组织(如图9.2所示),主要包括文档管理、窗口管理、图形编辑管理三大功能模块。其中文档管理主要完成文档的新建、保存、输出打印等功能;窗口管理定义系统界

2、面风格,提供对画面编辑区域及工具条、系统状态面板、菜单面板等的显现与隐藏的管理;图形编辑管理模块主要用于完成直线、曲线、封闭区域等的绘制、填充、几何变换和三维图形的生成、投影、消隐及显现。,图 9.2 系统组成结构,9.2 系统设计与实现,9.2.1 图形编程的基础知识 VC+是一种面向对象程序设计语言,基于面向对象程序设计语言的程序设计方法都支持三种基本的活动:识别对象(Object)和类(Class),描述对象和类之间的关系,以及通过描述每个类的功能定义对象的行为。,1.设备环境类 CDC类封装了Windows API中用来画图的函数,同时该类负责维护设备环境。CClientDC类用来创建

3、和破坏一个设备环境,它在堆栈中建立。CWindowDC类维护窗口的非客户区,和CClientDC类一样。CPaintDC类在构造函数中调用CWndBeginPaint()获得设备环境,以便在有效的客户区进行绘图。,CMetaFileDC类创建一个元文件,可以把它看做是一个屏幕设备,但其实它是一个磁盘文件。产生的文件可以存放在磁盘中,以后还可以读入,进行修改。,2.图形对象类CBitmap类建立和控制“位图”对象(内存中的位图)。CBrush类建立和控制“刷子”对象。填充图形和绘图的刷子。CFont类建立与控制字体对象。CPalette类建立和控制调色板对象。CPen类建立和控制画笔对象,画笔是

4、图形的边界模式。CRgn类建立和控制GDI绘图设备区域对象。,9.2.2 程序设计 1.类的设计 本系统主要用到了以下一些类:CJhtxsApp,CMainFrame,CJhtxsView,CJhtxsDoc,CDialog,Cnewbmp其中,CJhtxsApp 是应用程序类,支持应用程序的建立和基本交互;CMainFrame是应用程序主窗口框架类,用来实现主窗口的功能;CJhtxsView是应用程序主窗口视图类,支持视图的功能实现;CJhtxsDoc为文档类,用于实现文档的功能;CDialog是工具箱类,提供人机消息反馈平台;Cnewbmp为对象空间类,聚集着CSolid(实体类)、CRe

5、ct(面类)、CLoop(环类)、Cline(边类)、CVertex(顶点类)、CMaterial(材质类)、CLightSource(光源类)等所有类的对象。上述各类之间的对应关系结构如图9.3所示。,图 9.3 各类之间的对应关系,1)CMainFrame 主窗口类(CMainFrame)主要定制图标、工具条的建立、显示和交互,其定义代码如下:,class CMainFrame:public CFrameWnd protected:/create from serialization only CMainFrame();DECLARE-DYNCREATE(CMainFrame)public

6、:/Attributes public:CToolBar*m-pToolsToolbar;/Operations public:/Overrides,/ClassWizard generated virtual function overrides/AFX-VIRTUAL(CMainFrame)virtual BOOL PreCreateWindow(CREATESTRUCT endif,protected:/control bar embedded members CStatusBar m-wndStatusBar;CToolBar m-wndToolBar;/Generated messa

7、ge map functions protected:/AFX-MSG(CMainFrame)afx-msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx-msg void OnRect();afx-msg void Ontoolsmenu();/AFX-MSG DECLARE-MESSAGE-MAP();,2)CjhtxsDoc 文档类(CjhtxsDoc)用于实现矢量图形对象的建立、存储和读取,其代码定义如下:,class CJhtxsDoc:public CDocument protected:/create from serializa

8、tion only CJhtxsDoc();DECLARE-DYNCREATE(CJhtxsDoc)/Attributes public:/Operations public:,/Overrides/ClassWizard generated virtual function overrides/AFX-VIRTUAL(CJhtxsDoc)public:virtual BOOL OnNewDocument();virtual void Serialize(CArchive ifdef-DEBUG,virtual void AssertValid()const;virtual void Dump

9、(CDumpContext endif protected:/Generated message map functions protected:/AFX-MSG(CJhtxsDoc),/NOTE-the ClassWizard will add and remove member functions here./DO NOT EDIT what you see in these blocks of generated code!/AFX-MSG DECLARE-MESSAGE-MAP();,3)CjhtxsView 视图类(CjhtxsView)接收用户的对特定图形对象的操作并绘制图形对象,

10、在界面上改变少,主要处理键盘鼠标事件和调用各图形对象的绘制方法,所以实现上要尽量统一,充分利用图形对象的多态性。以下是其代码定义:,class CJhtxsView:public CFormView protected:/create from serialization only CJhtxsView();DECLARE-DYNCREATE(CJhtxsView)public:Ccolordlg*dlg;bool newbmp;bool openbmp;Clinewidth*linewidthdlg;/AFX-DATA(CJhtxsView),enum IDD=IDD-JHTXS-FORM;

11、/NOTE:the ClassWizard will add data members here/AFX-DATA/Attributes public:/CJhtxsDoc*GetDocument();int nPenStyle;int nWidth;COLORREF LineColor;COLORREF FillColor;Cnewbmp*bmp;,int bmpcounter;int width;int height;/Operations public:BITMAPINFOHEADER bi;/信息头 RGBQUAD*quad;/调色板 BYTE*lpBuf;/图像数据 BITMAPIN

12、FO*pbi;int flag;/标志表示是否打开了bmp文件 int numQuad;/调色板数目,BYTE*lpshowbuf;/用于显示的图像数据 int zoomfactor;/Overrides/ClassWizard generated virtual function overrides/AFX-VIRTUAL(CJhtxsView)public:virtual BOOL PreCreateWindow(CREATESTRUCT/DDX/DDV support,virtual void OnInitialUpdate();/called first time after cons

13、truct virtual BOOL OnPreparePrinting(CPrintInfo*pInfo);virtual void OnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtual void OnEndPrinting(CDC*pDC,CPrintInfo*pInfo);virtual void OnPrint(CDC*pDC,CPrintInfo*pInfo);virtual void OnDraw(CDC*pDC);/AFX-VIRTUAL,/Implementation public:void drawbmp();CString fi

14、lename;bool text;bool rect;bool line;bool open();bool PrepareShowdata();virtual CJhtxsView();ifdef-DEBUG,virtual void AssertValid()const;virtual void Dump(CDumpContext,afx-msg void OnEllipse();afx-msg void OnColordlg();afx-msg void OnLinewidth();afx-msg void OnUpdateLine(CCmdUI*pCmdUI);afx-msg void

15、OnRect();afx-msg void OnUpdateRect(CCmdUI*pCmdUI);afx-msg void Onbrush();afx-msg void Oneraser();afx-msg void Onpen();afx-msg void Ontext();afx-msg void Onsmall();,afx-msg void Onbig();afx-msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);afx-msg void OnUpdatetext(CCmdUI*pCmdUI);afx-msg void OnFi

16、leSaveAs();afx-msg void OnPsSolid();afx-msg void OnPenstyleSolid();afx-msg void OnToolsLine();afx-msg void OnPenstyleDash();afx-msg void OnPenstyleDot();afx-msg void OnPenstyleDashdot();afx-msg void OnPenstyleNull();,afx-msg void OnPenSingle();afx-msg void Ondouble();afx-msg void OnColorFillcolor();

17、afx-msg void OnToolsArc();afx-msg void OnToolsPolyline();afx-msg void OnToolsPolybeizer();afx-msg void OnToolsRectangle();afx-msg void OnToolsRoundrect();afx-msg void OnToolsChord();afx-msg void OnToolsPie();afx-msg void OnToolsPolygon();afx-msg void OnToolsFillrect();,afx-msg void OnToolsFillsolidr

18、ect();afx-msg void OnClear();afx-msg void OnFilePrint();afx-msg void OnEditUndo();/AFX-MSG DECLARE-MESSAGE-MAP();,4)CJhtxsApp CJhtxsApp是应用程序类,支持应用程序的建立和基本交互,其代码定义如下:,class CJhtxsApp:public CWinApp public:virtual BOOL PreTranslateMessage(MSG*pMsg);CJhtxsApp();/Overrides/ClassWizard generated virtual

19、function overrides/AFX-VIRTUAL(CJhtxsApp)public:virtual BOOL InitInstance();/AFX-VIRTUAL,/Implementation/AFX-MSG(CJhtxsApp)afx-msg void OnAppAbout();/NOTE-the ClassWizard will add and remove member functions here./DO NOT EDIT what you see in these blocks of generated code!/AFX-MSG DECLARE-MESSAGE-MA

20、P();,5)对各图形对象的基类Cnewbmp的了解是关键,它定义了绘图类别和绘制状态,以下是该类的设计代码:,class Cnewbmp:public CDialog/Construction public:/bool text;void drawtext(int textcounter);void close();void drawrect(Crect*currect);int linewidth;COLORREF backcolor;COLORREF linecolor;int style;,bool open1;bool rect;int rectcounter;void open()

21、;/图形对象变量 CLine*lines30;Crect*rectlist30;Ctext*textlist30;int textcounter;int linecounter;bool line;bool check;,CPoint pointbefore;CPoint pointlast;int width;Cnewbmp();void drawline(int linecounter);Cnewbmp(CWnd*pParent=NULL);/standard constructor/Dialog Data/AFX-DATA(Cnewbmp)enum IDD=IDD-NEW;,/NOTE:

22、the ClassWizard will add data members here/AFX-DATA/Overrides/ClassWizard generated virtual function overrides/AFX-VIRTUAL(Cnewbmp)protected:virtual void DoDataExchange(CDataExchange*pDX);/DDX/DDV support/AFX-VIRTUAL,/Implementation protected:/Generated message map functions/AFX-MSG(Cnewbmp)afx-msg

23、void OnLButtonDown(UINT nFlags,CPoint point);afx-msg void OnLButtonUp(UINT nFlags,CPoint point);afx-msg void OnMouseMove(UINT nFlags,CPoint point);afx-msg void OnPaint();,virtual BOOL OnInitDialog();afx-msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);/AFX-MSG DECLARE-MESSAGE-MAP();,2.创建程序框架 程序框

24、架是用MFC实现的,MFC 应用程序向导(AppWizard)生成了大部分的代码,然后加入图形对象空间类程序代码。具体步骤如下:1)创建一个新项目 从文件菜单上选择新建选项,然后在出现的新建对话框中选择项目表单,在该表单中,类型选择MFC AppWizard(exe)选项,项目名称设为Jhtxs,其它按照提示进行设置即可。应用程序向导将自动生成四个类:,CJhtxsApp 应用程序类;CJhtxsDoc 文档类;CJhtxsView 视图类;CmainFrame 主框架类。,2)添加图形对象空间类程序代码 添加图形对象空间类程序代码分两种情况考虑:如果绘图类程序代码以前已经编写好了,则从新项目

25、窗口上选择文件视图(File View),右击源文件夹,展开jhtxs,然后添加文件到文件夹;如果是新建源文件,则在jhtxs项目窗口下,选择文件新建选择下列其中之一:头文件(C+Head File);源文件(C+Source File);资源文件(Resource Script);,3.编写应用程序的菜单和工具条 应用程序框架提供的初始菜单和工具条都非常简单,不能满足我们的需要,所以必须对该菜单和工具条进行修改或编写。先简单介绍一下需要完成的菜单。应用程序菜单有六个菜单项:文件菜单,用于管理各种文档;编辑菜单,对绘制图形文件提供复制、剪切、粘贴等基本操作;工具菜单,选择绘图工具;查看菜单,提

26、供图形属性如放大、缩小、颜色等的浏览和管理;帮助菜单,使用应用程序框架中的默认菜单。,先在菜单编辑器中修改原有菜单,使之满足系统要求。菜单修改如表9-1所示。修改后的菜单如图9.4所示。,表 9-1 菜单修改表,图 9.4 修改后的菜单,与菜单条相对应,我们对应用程序框架生成工具条也作相应修改。系统自动生成的文档管理工具条保留不变,我们新建一个绘图工具条(如图9.5所示)。,图 9.5 新建的绘图工具条,4.给菜单和工具条连接代码 设置好菜单和工具条后,需要给它们连接代码,以完成系统交互功能,主要工作介绍如下:1)定义笔、刷子和画布 首先创建一个笔对象和刷子对象,由于要求笔、刷子和画布对象在V

27、iew类的任何地方都可以使用,因此笔、刷子和画布要在jhtxsView.h 文件中定义。具体方法如下:首先打开jhtxsView.h,在如下所示地方加入下列深色粗体代码:,class CJhtxsView:public CFormView protected:/create from serialization only CJhtxsView();DECLARE-DYNCREATE(CJhtxsView)/Attributes public:/CJhtxsDoc*GetDocument();int nPenStyle;定义当前笔形,int nWidth;保存当前线宽 COLORREF Line

28、Color;定义画笔线颜色 COLORREF FillColor;定义刷子颜色 Cnewbmp*bmp;定义新画布 int bmpcounter;int width;定义画布宽度 int height;定义画布高度;,图 9.6 在生成的菜单中选择工具画线工具|直线,2)给各个菜单和工具条连接代码 我们以工具菜单中的画线工具为例介绍菜单的连接代码编写方法。首先打开菜单编辑器,在生成的菜单中选择工具画线工具直线,如图9.6所示。,然后单击鼠标右键,在弹出的菜单中选择ClassWizard命令,启动类向导。在出现的类向导对话框中选择 MessageMaps,随后在ClassName框中选择Cjht

29、xsView,在ObjectIDs框中选择ID-TOOLS-LINE,单击AddFunction按钮添加命令函数OnToolsLine,然后编写该函数,在函数体中加入下列深色粗体代码:,void CJhtxsView:OnToolsLine()/TODO:Add your command handler code here if(newbmp=true|openbmp=true)bmp-line=!bmp-line;line=bmp-line;bmp-rect=false;bmp-text=false;else MessageBox(请先建立一个新的图片!);,习 题,在本章所设计的简单图形系统中增加“基本图形元素生成”功能,使其能完成:(1)用Bresenham算法画直线段;(2)用Bresenham算法画圆;(3)用中点画圆法画圆;(4)实现给定多边形的扫描转换,(5)实现种子填充算法;(6)实现点阵字符的定义与生成;(7)实现Cohen(8)能进行基本图形元素输出属性的控制,例如线型和线宽等的设置。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号