版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录1. 基本功能描述 12. 设计思路 13. 软件设计 4设计步骤 4界面设计 6关键功能的实现 74. 结论与心得体会 85. 思考题 86. 附录 10调试报告 10测试结果 10关键源代码 10简单画图程序1. 基本功能描述简单画图程序实现了常见图形的绘制、图形属性的设置和图形数据的暂存等功能。该 程序的具体功能模块包括以下几项:1) 图形绘制模块。该模块实现直线段、椭圆、矩形等图形的绘制功能。在鼠标移动 的过程中能实时显示当前绘制的图形。2) 图形属性设置模块。该模块实现绘图线条的线宽,线色,图形填充色等属性设置 功能。3) 图形数据暂存模块。该模块实现直线段、椭圆、矩形等图形数据
2、暂存功能,涉及 图形的坐标、线宽、线色、填充色等数据。2. 设计思路1) 对需要用到的变量进行初始化。2) 选择相应的图形之后就响应相应的消息处理函数,给 shape 赋对应的值。选择不 同的线宽,线色与填充色,即可改变画笔或画刷的属性。3) 鼠标的按下响应函数 OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标, 鼠标 的拖动响函数 OnMouseMove(改) 变终点的坐标,鼠标的弹起响应 OnLButtonUp() ,确定终 点坐标,刷新,得到绘制图形。4) 选择图形或其它属性,可进行下一次绘制。5) 程序的流程图如下:开始定义并初始化变 shape 线色 m_ncolor
3、填充色 m_fcolor画笔 pen 画刷 brush 绘图起点 opoint 绘图终点 cpoint改变画笔属性默认值( W=1)改变画笔属性默认值(黑色)改变画刷属性默认值(白色)鼠标左键按下 响应函数 OnLButtonDown()opoint=point鼠标移动 响应函数 OnMouseMove()epoint=point响应 OnPaint() ,绘制图形鼠标左键弹起响应函数 OnLButtonUp()图1 程序流程图3. 软件设计设计步骤1) 创建单文档创建一个 MFCA ppWizardexe 工程,命名为“ LiYuJing ”,如图 1 所示,并创建单文档,如图 2 所示。创
4、建成功后,系统自动生成相应的类,如图 3 所示。图 2 创建工程图3 创建单文档图4 生成类2)编辑菜单添加需要的菜单项, 如图 4 所示;并在菜单的属性中设定好所对应的 ID,如图 5所示, 各项菜单对应的 ID 如表 1 所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹 出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可) 。图5 添加菜单项图 6 设置菜单 ID表 1 对应菜单 ID菜单名ID菜单名ID直线ID_LINE线宽 1ID_W1矩形ID_RECT线宽 2ID_W2椭圆ID_ELLIPSE线宽 3ID_W3颜色ID_COLOR线宽 4ID_W4填充色ID_FI
5、LLCOLOR线宽 5ID_W5建立类向导,在视图类 CLiYuJingView 中,对各菜单项添加对应的 COMMAN消D息处理函数,部分菜单项还添加对应的 UPDATE_COMMAND消_息UI函数,如图 7 所示。图7 建立类向导3) 创建工具栏在插入处选择资源,新建工具栏,如图 8 所示;图8 新建工具栏在工具栏上添加相应的按钮,在属性处更改其 ID,如图 9 所示。图9 编辑工具栏4) 添加鼠标消息处理函数添加鼠标消息处理函数 OnLButtonDown()、 OnMouseMove(、) OnLButtonUp() ,利用橡 皮筋技术实时显示绘制图形,并绘制最终图形,具体源代码参看
6、附录。添加过程为:选择 View 菜单下的 ClassWizard 菜单项打开类向导, 在类列表中选择 CLiYuJingView 类,在消 息列表框中选择 WM_LBUTTONDO消W息N并用鼠标左键双击,此时类向导自动在成员函数列 表框中添加该消息的处理函数。 然后再用同样方法添加 WM_MOUSEM消OV息E和 WM_LBUTTONUP 消息的处理函数,如图 10 所示。图 10 添加相应代码界面设计各控件名称,类型,属性以及相关变量如表 2 所示。表2 界面控件表控件名称控件类型属性相关变量绘图下拉式菜单无无直线菜单项工具栏按钮ID_LINEint shape矩形菜单项工具栏按钮ID_
7、RECTint shape椭圆菜单项工具栏按钮ID_ELLIPSEint shape线宽弹出式菜单无int w颜色(线色)菜单项工具栏按钮ID_COLORCOLORREF m_nColo填充色菜单项工具栏按钮ID_FILLCOLORCOLORREF m_fColor整体界面如图 11 所示图 11 整体界面显示关键功能的实现1) 选择要绘制的图形在直线、矩形以及椭圆的消息处理函数里为 shape 分别赋值为 1,2,3 ,在 OnPaint() 函数里添加 3个 if 语句的代码来这实现这三个图形的绘制:当选择画直线时, shape=1, 则执行绘制直线代码,当选择画矩形时, shape =2
8、, 则执行绘制矩形的代码,当性选择画 椭圆时 ,shape=3, 则执行绘制椭圆的代码。2) 改变线宽在 OnPaint() 创建的画笔中, (PS_SOLID,w, m_nColor) ,线宽处用 w 表示,则改变 w 的值即改变了画笔的粗细。选择菜单绘图线宽选择划线宽度值,此时所选的线宽值就赋 给线宽变量 w。若不选择线宽值,则 w=1(即默认线宽值为 1) 。3) 改变线色在 OnPaint() 创建的画笔中, (PS_SOLID,w, m_nColor) ,线的颜色处用 m_nColor 表示, 则改变 m_nColor 即改变了画笔的颜色。选择菜单绘图颜色,会弹出通过 WM_COLO
9、RREF 从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化。若不选择颜色,则默认(线)颜色为黑色4) 改变填充色在 OnPaint() 创建的画刷中, (m_fColor) ,颜色就是用 m_fColor 表示的,改变 m_fColor 即改变了画刷的颜色。选择菜单绘图填充色,会弹出通过WM_COLORR从E系F 统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量 m_fColor ,此时画刷的 颜色就会发上变化。若不选择颜色,则默认填充色为白色。5) 橡皮筋技术实现鼠标实时绘图利用橡皮筋技术可以实现在鼠标拖
10、拽作图时,实时显示当前绘图的情况。这样,我们 就要在鼠标移动的消息处理函数中添加相应的代码。在鼠标左键按下的时候,记录下图元 起始点;在鼠标移动的时候,获取鼠标当前位置,绘制出新的图形,同时,将上一次绘制 的图形擦除,这就是橡皮筋技术。在 OnMouseMove(函) 数中调用 SetROP2()函数将绘图模 式设置为 NOTXORP(EN同或)模式,使用同或模式绘图就可以画上真实的图形,并擦除上 次绘制的图形。在 OnLButtonDown() 函数中调用 SetCapture() 函数捕捉鼠标, OnLButtonUp() 函数中 调用 ReleaseCapture() 函数释放鼠标。整个
11、绘图过程就是在鼠标左键按下时确定绘图起 点,移动鼠标实时显示绘制的图形,鼠标左键弹起即完成图形的绘制的过程。4. 结论与心得体会这次课设我成功地完成了设计要求,能用鼠标拖动绘制直线段、椭圆、矩形等基本图 形;能控制所绘制图形的线宽、线色、填充色等。经过程序调试,该简单画图程序能够绘 制指定线宽、线色、填充色的图形,在鼠标移动的过程中能实时显示当前绘制的图形。在拿到任务书后,我通过查阅资料,不断编程调试,以及请教同学,最终实现绘图程 序的要求。我学会了鼠标消息的分类,鼠标消息处理函数的常见编程方法,以及捕捉鼠标 SetCapture() 函数,释放鼠标 ReleaseCapture() 函数。同
12、时,利用橡皮筋技术实现鼠标绘 图的实时显示是我最大的收获。我在调试程序时, 发现绘制直线时鼠标左键弹起直线并没有绘制结束, 而再次单击鼠标左键,又以上次绘制的直线段终点作为起点绘制直线,即绘制出的直线段是一段连着一 段的。在自己检查数遍并未发现错误之处后,我求助了同学,在OnLButtonDown()函数中添加了一句 cpoint=opoint=point0 之后问题得以解决。通过这次课程设计,我学到了很多与计算机绘图相关的基础知识,并进一步体会到面 向对象的程序设计的强大,以及 Windows应用程序用户界面统一、友好,独立于设备的图 形操作特点。这次的课程设计虽只是做了一个简单的绘图工具,
13、但是也让我从设计者的角 度了解了设计一个程序的过程,看似一个很简单的工具,其制作的背后工作是繁琐的。哪 怕是平时我们使用的很顺手的一个小工具,其开发的一切步骤都不可小觑,所以,关于编 程还有太多的东西等着我们去了解,学习。5. 思考题1) 说明直线、椭圆、矩形绘制使用的函数,及其参数含义答:直线、椭圆、矩形绘制使用的函数是 OnPaint() 。函数里面定义和创建了绘图的 画笔 pen 和填充图形的画刷 brush ,3 种图形本身对应的消息处理函数里分别赋给 shape3 个不同的值: 1,2,3,在 OnPaint() 里有 3个 if 语句,用来这实现这三个图形的绘制: 当选择画直线时,
14、 shape=1,则执行绘制直线代码,当选择画矩形时, shape =2, 则执行绘 制矩形的代码,当性选择画椭圆时 ,shape=3, 则执行绘制椭圆的代码。2) 如何控制菜单项的状态,使用的消息类型答:通过添加 UPDATE_COMMAND消_息UI函数,在生成的函数里添加相关代码来控制菜 单项的状态及使用的消息类型。如选择直线时,使shape=1,则 OnUpdateLine 里添加pCmdUI->SetCheck(shape=1),那么当 shape 的值为 1 时,即代表选择了直线项,此时菜 单中的直线选项前就打勾了,代表选中。矩形和椭圆类似。3) 如何设置菜单和工具栏按钮的快
15、捷键操作答:切换到资源视图, 选择 Accelerator 资源类型, 双击 IDR_MAINFRAM加E速键资源, 打开加速键编辑窗口。 在 ID 下拉列表框中选择相应菜单项的 ID,在 Key 一栏中输入相应 键值(比如 L),选择 Ctrl 复选框和 VirtKey 单选按钮,关闭加速键编辑窗口,即可完成 加速键设置,如图 12 所示。图 12 快捷键设置6. 附录调试报告1) 一开始我并没有添加刷新函数 Invalidate() ,这就使程序运行之后,无论鼠标左 键按下时如何移动无法绘图,这是因为当一个窗口内键入内容其实就是将窗口刷新了,相 当于更新了窗口,故必须有刷新函数。2) 在调
16、试程序时,发现绘制直线时鼠标左键弹起直线并没有绘制结束,而再次单击 鼠标左键,又以上次绘制的直线段终点作为起点绘制直线,即绘制出的直线段是一段连着 一段的。在 OnLButtonDown()函数中添加了一句 cpoint=opoint=point0 之后问题得以解决。 这是因为要给初始坐标和终止坐标赋个 0 值,不然系统无法判断坐标位置。测试结果编译、连接、运行程序后,在窗口中绘制不同线宽,不同线色,不同填充色的图形后 窗口如图 13 所示。图 13 绘制各个图形关键源代码1) 在“”中,在 class CMainFrame : public CFrameWnd 里的 protected 下定
17、义: CToolBar m_drawToolBar; / 工具栏2) 在“”中,在 CMainFrame:OnCreate(LPCREATESTRUlCpTC reateStruct) 里添加以 下代码:if (!(this) |!(IDR_DRAW) TRACE0("Failed to create status barn");return -1;3) 在“”中,在 class CLiYuJingiew : public CView里的 public 下定义相关变量:CLiYuJingDoc* GetDocument();COLORREF m_nColor;COLORRE
18、F m_fColor;CPoint cpoint;CPoint opoint;BOOL m_Down;int w;int shape;HCURSOR m_Cursor;/光/ 标资源句柄4) 在“”中,添加如下函数及代码:CLiYuJingView:CLiYuJingView()/ TODO: add construction code herew=1; / 初始线宽默认为 1shape=0;m_fColor=RGB(255,255,255);/ 初始填充色为白色m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); void CLiYu
19、JingView:OnW5()w=5; / 令线宽为 5 void CLiYuJingView:OnW1()w=1; / 令线宽为 1void CLiYuJingView:OnW2()w=2; / 令线宽为 2void CLiYuJingView:OnW3()w=3; / 令线宽为 3void CLiYuJingView:OnW4()w=4; / 令线宽为 4void CLiYuJingView:OnUpdateW1(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=1); / 当线宽为 1 时,此选项前标有圆点void CLiYuJingView:OnUpdateW2
20、(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=2); / 当线宽为 2 时,此选项前标有圆点void CLiYuJingView:OnUpdateW3(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=3); / 当线宽为 3 时,此选项前标有圆点 void CLiYuJingView:OnUpdateW4(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=4);void CLiYuJingView:OnUpdateW5(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=5);void CLi
21、YuJingView:OnLine()shape=1; / 选择直线,则令 shape 为 1 m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); void CLiYuJingView:OnRect()shape=2; / 选择矩形,则令 shape 为 2m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); void CLiYuJingView:OnEllipse()shape=3; / 选择椭圆,则令 shape 为 3m_Cursor=AfxGetApp()->Lo
22、adStandardCursor(IDC_CROSS);void CLiYuJingView:OnUpdateLine(CCmdUI* pCmdUI)pCmdUI->SetCheck(shape=1); /shape 为 1 时,直线选项前打上勾 void CLiYuJingView:OnUpdateRect(CCmdUI* pCmdUI)pCmdUI->SetCheck(shape=2); /shape 为 2 时,矩形选项前打上勾void CLiYuJingView:OnUpdateEllipse(CCmdUI* pCmdUI)pCmdUI->SetCheck(shape
23、=3); /shape 为 3 时,椭圆选项前打上勾 void CLiYuJingView:OnColor()CColorDialog Color; / 创建颜色对话框if() = IDOK) / 如果用户点击 OK按钮m_nColor=(); /更改颜色 , 把颜色赋到 m_nColorvoid CLiYuJingView:OnFillcolor()CColorDialog FullColor; /创建颜色对话框if() = IDOK) /如果用户点击 OK按钮m_fColor=(); /更改颜色 , 把颜色赋到 m_fColorvoid CLiYuJingView:OnPaint()CPa
24、intDC dc(this); / device context for paintingCPen pen; /定义画笔CBrush brush; /定义画刷(PS_SOLID,w, m_nColor); / 创建画笔(m_fColor); /创建画刷(&pen); /获取画笔(&brush); /获取画刷if(shape=1),;,; /绘制直线 , 从 opoint 到 cpoint 连线if(shape=2),; / 绘制矩形if(shape=3),; / 绘制椭圆void CLiYuJingView:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call defaultm_Down=TRUE;/ 鼠标按下SetCapture(); /获取坐标cpoint=opoint=point;/ 把鼠标所在坐标赋给起点坐标 opointReleaseCapture(); /释放坐标CView:OnLButtonDown(nFlags, point);void CLiYuJingView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) / 如果鼠标按下SetCursor(m_Cursor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 主皮带保护试验制度
- 机动队奖惩制度
- 酒店安全生产及奖惩制度
- 直播违规员工奖惩制度
- 公益组织内部奖惩制度
- 快递公司分拣工奖惩制度
- 景区森林防火奖惩制度
- 展柜厂主管考核奖惩制度
- 产伤骨折患者家属的护理指导
- 幼儿园教学工资奖惩制度
- 材料表面与界面研究生教案
- 核电设备设计制造规范标准
- 煤矿改扩建项目审批办理流程指南
- 2022年宜春幼儿师范高等专科学校单招笔试职业技能考试试题及答案解析
- GB/T 5286-2001螺栓、螺钉和螺母用平垫圈总方案
- GB/T 41093-2021机床安全车床
- GB/T 25102.1-2010电声学助听器第1部分:具有感应拾音线圈输入的助听器
- 医院运行与医疗业务指标数据统计收集管理规定
- 【高中地理课件】城市的辐射功能 课件 2022-2023学年高二地理人教版(2019)选择性必修二
- 测量管理体系记录表
- 供应商资质能力核实承诺书
评论
0/150
提交评论