综合二简易图形编辑器报告

上传人:jiups****uk12 文档编号:90687798 上传时间:2019-06-15 格式:DOC 页数:4 大小:114.04KB
返回 下载 相关 举报
综合二简易图形编辑器报告_第1页
第1页 / 共4页
综合二简易图形编辑器报告_第2页
第2页 / 共4页
综合二简易图形编辑器报告_第3页
第3页 / 共4页
综合二简易图形编辑器报告_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《综合二简易图形编辑器报告》由会员分享,可在线阅读,更多相关《综合二简易图形编辑器报告(4页珍藏版)》请在金锄头文库上搜索。

1、综合实验二 “简易图形编辑器” 实验报告张良钿 20048002129一 总体展示:下图是我用自己写的“简易图形编辑器”编辑的图形的全屏截屏图片。图中的“indows”文本,“W”是用四条直线拼合而成。所有图形都是在画出后用鼠标选中并调整位置和形状的,右侧的是非模态窗口的“工具栏”。图形源文件为此压缩包中的sky.sky文件中,可用本编辑软件打开。二开发过程:1. 预期目标(暨需求分析):A完成基本功能:交互式绘制图形(至少包括矩形和文本),绘制完成的图形能够正确地重现,绘制结果可以保存到文件并读出;B完成高级要求:矩形、文本的颜色、文本字体可调,能够通过鼠标点击选中图形,并进行属性的修改C拥

2、有“工具栏”、“状态栏”等,使程序具有更好的人机交互性;D支持“剪贴”、“复制”、“粘帖”、“删除”等操作,能够直接定位图元并编辑。2. 数据结构选择(开发中最重要的环节):由于对C+还不熟悉,因此考虑的都还是C中的方法。用结构封装图元和文本,图元结构MYGRAP和文本结构MYTEXT,详见源程序中的MyDoc.h文件。使用动态申请内存的数据存储方法,具体的方案考虑过三种,具体如下:A 动态数组:像梁老师上课时介绍的那样,当存储空间不足时,new出更大的一块内存,然后memcpy,再delete原空间。优点:简单,易于理解和操作。缺点:运行效率不高,尤其是当数据量较大时,每次都要向内存池申请一

3、块很大的连续的内存,然后memcpy大量数据,浪费了大量内存和CPU运行时间,虽然现在的内存和CPU性能很好,但它们是给用户用的,而不是给程序员使用的。因此在不影响开发效率的情况下,应尽量提高运行效率。B 双向链表:链表的运行效率明显高于动态数组,且易于构建图层的优先级结构(即图元重叠是的上下顺序)。故在刚开始的时候,我采用了双向链表的结构,并完成了双向链表相关函数的编写(在MyDoc.cpp文件末尾被注释的部分)。但在开发过程中,由于需要能根据图层序号直接定位图层,这样就需要从链头或链尾搜索。于是萌生了对链表进行改造的想法。C 映射表:我不是是否有这种数据结构,也不知道它的正确名称,因为这是

4、我自己构思出的,姑且称其为“映射表”。它由一系列动态的离散的节点和一个动态的数组表构成。详细结构如下图所示:PointerPointerPointerPointerPointerPointerPointerMYGRAPMYTEXTMYGRAPMYGRAPMYGRAPMYTEXT映射表中的每一个元素都是一个指针,指向不同的离散的MYGRAP或MYTEXT的结构便量。表的管理策略同动态数组一样,先申请一个一定长度的数组,当表不够长时,new出一个更长的数组,然后memcpy,再删除原数组。由于数组的每个元素存储的只是一个指针,占用的内存很小,只需很少的资源即可动态整理。每个节点的管理策略同链表的节

5、点相同,都是new和delete的。映射表的优点:运行和存储效率基本接近链表,但可以根据层序号直接定位图元节点,所有的添加、删除、查找、插入、交换层顺序等操作都只需要对映射表进行整理即可,操作方便快速。缺点:增加了一个结构层次,不易理解。经比较,我选择了映射表的结构,由于MYGRAP和MYTEXT两种结构不同,尤其是MYTEXT中还有一个字符串指针,因此虽然从存储原理上两种结构的指针没有区别,但仍需一个PMYGRAP和一个PMYTEXT分别指向才能通过编译,连void *也不行。于是构造了一个新结构LAYERMAP作为映射表数组的元素,如下:typedef struct _LAYERMAP_i

6、ntiFlg;/ GRAPDATA or TEXTDATA,PMYGRAP pGData;PMYTEXT pTData;/void*pData;/ pointer to MYGRAP or MYTEXT LAYERMAP, *PLAYERMAP;每次在访问图元节点时都要先判断iFlg,再决定使用pGData还是pTData,增加了程序的复杂度,不得以而为之,应该还有更好的解决策略,我还没想到。数据结构及其相关函数在源文件MyDoc.cpp中,函数的设置有点C+的味道,可以方便地做成一个类。3. 具体开发:选定数据结构,写好MyDoc.cpp后,工作以及完成了一半。很快就完成了基本功能的实现和调

7、试。开始完成扩展功能。A 实现鼠标选中图元和编辑图元。希望能实现类似MS-Word中的图形编辑那样的效果。a. 鼠标点击选中最外层的图元,编写函数bool SearchLayer(POINT *a_pPT, int *pCurLayerCnt),其中调用了判断点在直线上的函数bool PointInLine(POINT *a_pt, POINT *a_pStart, POINT *a_pEnd, int a_LineWidth),判断点在矩形内的函数bool PointInRect(POINT *a_pt, POINT *a_pStart, POINT *a_pEnd),判断点在椭圆内的函数b

8、ool PointInEllipse(POINT *a_pt, POINT *a_pStart, POINT *a_pEnd)。编写加调试共约2小时,对数学公式做了化简和近似,确保了运算量的最小化,调试结果良好,矩形、椭圆、直线、文本框都能准确辨认。b. 绘制图元被选中时的标志(外框上的四个小圆和四个小矩形)以及鼠标在图元附件的不同Cursor。编写了函数bool DrawSltFlg(HDC hdc, PMYGRAP a_pFlgGrap, PLAYERMAP a_pLayer, int a_DrawOrClear),和bool DrawSltFlg(HDC hdc, PMYGRAP a_p

9、FlgGrap, PLAYERMAP a_pLayer, int a_DrawOrClear),并大量增补了主消息处理函数WinProc(),编写加调试用了23小时,实现效果良好。但整个程序结构开始混乱,尤其是WinProc()过于冗长,程序流程在七种操作模式间跳转,结构不清晰(自己转晕了)。CurrOpMode;#define RYDRAW1/ 预备绘图#define DRAWING2/ 正在绘图#define RYTEXT3/ 准备输入文本#define TEXTRECTING4/ 正在绘制文本矩形框#define TEXTINPUTING5/ 正在输入文本#define RYSELECT

10、AGRAP6/ 预备选择图元#define SELECTEDAGRAP7/ 已经选择中了一个图元#define MOVEINGAGRAP8/ 移动一个图元#define MODIFYINGAGRAP9/ 改变一个图元的形状c. 绘制图元移动和修改过程中的虚线框,编写完代码后发现程序运行混乱了,一时间也查不出原因,就将其删除或注释了,此功能先搁置。d. 移动或修改选中的图元,编写了函数bool MouseAroundPoint(POINT *a_ptMoser, POINT *a_ptCenter),其余的都在WinProc()中增添,加剧了WinProc()的混乱度。耗时约3小时,完成编写与调

11、试。移动和修改功能都已实现,实现效果还不错,但由于没有了虚线框,移动过程的可视化与交互性不够。B“工具栏”的开发,用一个dialog绘制工具栏,将其创为非模态对话窗。原想使用TAB Contrl,但由于从没用过,估计要花不少时间学习,而离交作业的最后期限很近了,就用了两个BUTTON代替TAB来切换“图层和图元”界面,编写了ToolBar.cpp文件,编写是特别注意了其可扩展性。“图元”界面用于选择图元操作,“图层”界面用于显示和修改当前选中的图元的参数信息,提供了修改图元的快捷方式。由于时间紧迫以及程序的结构已经混乱,代码尚未编写完成,“图层”功能搁置。C“剪切”、“复制”、“粘帖”的功能不

12、难写,由于时间原因未编写。“撤销”功能,我目前还没想出好的策略,似乎只能开辟空间暂存操作记录和数据。“删除”功能是在绘制实验报告的那幅图时,发现没有“删除”很是不便,才临时增加的。由于MyDoc.cpp中相关函数已写好,故只增加了三行代码就完成了“删除”。三 总结回顾:总用时:约3050小时代码:2100+行完成程度:完成老师要求,完成自己要求的70%个人满意程度:7075%,基本满意老师满意程度:待定收获:1. 熟悉了指针的用法,编写的代码中满是指针,传来传去,指来指去的,幸运的是基本没出什么大麻烦。2. 深刻意识到OOP的重要性,如果说编写过程控制程序用C还可以的话,那么编写UI(用户界面

13、)就非C+莫属了。不是说C不行,只是很容易混乱。遗憾:1. 未能完成全部功能。但即使完成了预期目标,也还会有这种能遗憾的,因为总会有新的功能要完善。善无止境,直到人累死,这样不好。2. 刚开始时还觉得自己的程序结构还不错,有C+的味道,但功能写得越多程序也越混乱了,尤其是昨晚11点多时人已经晕得有些想吐了,就赶紧休息去了。还是王彬说的那种结构好,窗体过程函数只负责向各个对象分发消息,而不是把所有的任务都揽在自己身上,使自己变得越来越臃肿混乱。3. 程序中还有不少BUG,如画或修改的图形多了,显示会混乱,但图形的数据结构没有被破坏,这时可以要赶紧保存,然后重新运行再打开文件读取,可保证编辑结构不丢失。呵呵4. 时间紧,预期功能太多,经验不足,写得累坏了,匆忙完工,连实验报告也不想排版了。好好休息。张良钿2007-6-3 18:00于 寝室

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号