c++简单画图程序 whut(18页).doc

上传人:1595****071 文档编号:35367757 上传时间:2022-08-21 格式:DOC 页数:18 大小:247KB
返回 下载 相关 举报
c++简单画图程序 whut(18页).doc_第1页
第1页 / 共18页
c++简单画图程序 whut(18页).doc_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《c++简单画图程序 whut(18页).doc》由会员分享,可在线阅读,更多相关《c++简单画图程序 whut(18页).doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-c+简单画图程序 whut-第 16 页目录1. 基本功能描述12. 设计思路13. 软件设计33.1 设计步骤33.2 界面设计83.3 关键功能的实现94. 结论与心得体会105. 思考题106. 附录116.1 调试报告116.2 测试结果116.3 关键源代码12简单画图程序1. 基本功能描述简单画图程序实现了常见图形的绘制、图形属性的设置和图形数据的暂存等功能。该程序的具体功能模块包括以下几项:1) 图形绘制模块。该模块实现直线段、椭圆、矩形等图形的绘制功能。在鼠标移动的过程中能实时显示当前绘制的图形。2) 图形属性设置模块。该模块实现绘图线条的线宽,线色,图形填充色等属性设置功能

2、。3) 图形数据暂存模块。该模块实现直线段、椭圆、矩形等图形数据暂存功能,涉及图形的坐标、线宽、线色、填充色等数据。2. 设计思路1) 对需要用到的变量进行初始化。2) 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。3) 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。4) 选择图形或其它属性,可进行下一次绘制。5) 程序的流程图如下:开始定义并初始化

3、变shape 线色m_ncolor 填充色 m_fcolor 画笔pen画刷brush绘图起点opoint绘图终点cpoint选择线宽默认值(W=1)改变画笔属性选择线色默认值(黑色)改变画笔属性选择填充默认值(白色)改变画刷属性椭圆矩形直线响应函数OnLine()shape=1响应函数OnEllipse()shape=3响应函数OnRect()shape=2鼠标左键按下 响应函数OnLButtonDown()opoint=point鼠标移动 响应函数OnMouseMove()epoint=point响应OnPaint(),绘制图形鼠标左键弹起响应函数OnLButtonUp()刷新,得到图形结

4、束图1 程序流程图3. 软件设计3.1 设计步骤1) 创建单文档创建一个MFC AppWizardexe工程,命名为“LiYuJing”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。图2 创建工程图3 创建单文档图4 生成类2) 编辑菜单添加需要的菜单项,如图4所示;并在菜单的属性中设定好所对应的ID,如图5所示,各项菜单对应的ID如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)。图5 添加菜单项图6 设置菜单ID表1 对应菜单ID菜单名ID菜单名ID直线ID_LINE线宽1I

5、D_W1矩形ID_RECT线宽2ID_W2椭圆ID_ELLIPSE线宽3ID_W3颜色ID_COLOR线宽4ID_W4填充色ID_FILLCOLOR线宽5ID_W5建立类向导,在视图类CLiYuJingView中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图7所示。图7 建立类向导3) 创建工具栏在插入处选择资源,新建工具栏,如图8所示;图8 新建工具栏在工具栏上添加相应的按钮,在属性处更改其ID,如图9所示。图9 编辑工具栏4) 添加鼠标消息处理函数添加鼠标消息处理函数OnLButtonDown()、OnMouseMo

6、ve()、OnLButtonUp(),利用橡皮筋技术实时显示绘制图形,并绘制最终图形,具体源代码参看附录。添加过程为:选择View菜单下的ClassWizard菜单项打开类向导,在类列表中选择CLiYuJingView类,在消息列表框中选择WM_LBUTTONDOWN消息并用鼠标左键双击,此时类向导自动在成员函数列表框中添加该消息的处理函数。然后再用同样方法添加WM_MOUSEMOVE消息和WM_LBUTTONUP消息的处理函数,如图10所示。图10 添加相应代码3.2 界面设计各控件名称,类型,属性以及相关变量如表2所示。表2 界面控件表控件名称控件类型属性相关变量绘图下拉式菜单无无直线菜单

7、项工具栏按钮ID_LINEint shape矩形菜单项工具栏按钮ID_RECTint shape椭圆菜单项工具栏按钮ID_ELLIPSEint shape线宽弹出式菜单无int w颜色(线色)菜单项工具栏按钮ID_COLORCOLORREF m_nColor填充色菜单项工具栏按钮ID_FILLCOLORCOLORREF m_fColor整体界面如图11所示。图11 整体界面显示3.3 关键功能的实现1) 选择要绘制的图形在直线、矩形以及椭圆的消息处理函数里为shape分别赋值为1,2,3,在OnPaint()函数里添加3个if语句的代码来这实现这三个图形的绘制:当选择画直线时,shape=1,

8、则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2) 改变线宽在OnPaint()创建的画笔中,pen.CreatePen(PS_SOLID,w, m_nColor),线宽处用w表示,则改变w的值即改变了画笔的粗细。选择菜单绘图线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w。若不选择线宽值,则w=1(即默认线宽值为1)。3) 改变线色在OnPaint()创建的画笔中,pen.CreatePen(PS_SOLID,w, m_nColor),线的颜色处用m_nColor表示,则改变m_nColor即改变了画笔

9、的颜色。选择菜单绘图颜色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化。若不选择颜色,则默认(线)颜色为黑色。4) 改变填充色在OnPaint()创建的画刷中,brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor表示的,改变m_fColor即改变了画刷的颜色。选择菜单绘图填充色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色

10、为白色。5) 橡皮筋技术实现鼠标实时绘图利用橡皮筋技术可以实现在鼠标拖拽作图时,实时显示当前绘图的情况。这样,我们就要在鼠标移动的消息处理函数中添加相应的代码。在鼠标左键按下的时候,记录下图元起始点;在鼠标移动的时候,获取鼠标当前位置,绘制出新的图形,同时,将上一次绘制的图形擦除,这就是橡皮筋技术。在OnMouseMove()函数中调用SetROP2()函数将绘图模式设置为NOTXORPEN(同或)模式,使用同或模式绘图就可以画上真实的图形,并擦除上次绘制的图形。在OnLButtonDown()函数中调用SetCapture()函数捕捉鼠标,OnLButtonUp()函数中调用ReleaseC

11、apture()函数释放鼠标。整个绘图过程就是在鼠标左键按下时确定绘图起点,移动鼠标实时显示绘制的图形,鼠标左键弹起即完成图形的绘制的过程。4. 结论与心得体会这次课设我成功地完成了设计要求,能用鼠标拖动绘制直线段、椭圆、矩形等基本图形;能控制所绘制图形的线宽、线色、填充色等。经过程序调试,该简单画图程序能够绘制指定线宽、线色、填充色的图形,在鼠标移动的过程中能实时显示当前绘制的图形。在拿到任务书后,我通过查阅资料,不断编程调试,以及请教同学,最终实现绘图程序的要求。我学会了鼠标消息的分类,鼠标消息处理函数的常见编程方法,以及捕捉鼠标SetCapture()函数,释放鼠标ReleaseCapt

12、ure()函数。同时,利用橡皮筋技术实现鼠标绘图的实时显示是我最大的收获。我在调试程序时,发现绘制直线时鼠标左键弹起直线并没有绘制结束,而再次单击鼠标左键,又以上次绘制的直线段终点作为起点绘制直线,即绘制出的直线段是一段连着一段的。在自己检查数遍并未发现错误之处后,我求助了同学,在OnLButtonDown()函数中添加了一句cpoint=opoint=point0之后问题得以解决。通过这次课程设计,我学到了很多与计算机绘图相关的基础知识,并进一步体会到面向对象的程序设计的强大,以及Windows应用程序用户界面统一、友好,独立于设备的图形操作特点。这次的课程设计虽只是做了一个简单的绘图工具,

13、但是也让我从设计者的角度了解了设计一个程序的过程,看似一个很简单的工具,其制作的背后工作是繁琐的。哪怕是平时我们使用的很顺手的一个小工具,其开发的一切步骤都不可小觑,所以,关于编程还有太多的东西等着我们去了解,学习。5. 思考题1) 说明直线、椭圆、矩形绘制使用的函数,及其参数含义?答:直线、椭圆、矩形绘制使用的函数是OnPaint()。函数里面定义和创建了绘图的画笔pen和填充图形的画刷brush,3种图形本身对应的消息处理函数里分别赋给shape3个不同的值:1,2,3,在OnPaint()里有3个if语句,用来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当

14、选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2) 如何控制菜单项的状态,使用的消息类型?答:通过添加UPDATE_COMMAND_UI消息函数,在生成的函数里添加相关代码来控制菜单项的状态及使用的消息类型。如选择直线时,使shape=1,则OnUpdateLine里添加pCmdUI-SetCheck(shape=1),那么当shape的值为1时,即代表选择了直线项,此时菜单中的直线选项前就打勾了,代表选中。矩形和椭圆类似。3) 如何设置菜单和工具栏按钮的快捷键操作?答:切换到资源视图,选择Accelerator资源类型,双击ID

15、R_MAINFRAME加速键资源,打开加速键编辑窗口。在ID下拉列表框中选择相应菜单项的ID,在Key一栏中输入相应键值(比如L),选择Ctrl复选框和VirtKey单选按钮,关闭加速键编辑窗口,即可完成加速键设置,如图12所示。图12 快捷键设置6. 附录6.1 调试报告1) 一开始我并没有添加刷新函数Invalidate(),这就使程序运行之后,无论鼠标左键按下时如何移动无法绘图,这是因为当一个窗口内键入内容其实就是将窗口刷新了,相当于更新了窗口,故必须有刷新函数。2) 在调试程序时,发现绘制直线时鼠标左键弹起直线并没有绘制结束,而再次单击鼠标左键,又以上次绘制的直线段终点作为起点绘制直线

16、,即绘制出的直线段是一段连着一段的。在OnLButtonDown()函数中添加了一句cpoint=opoint=point0之后问题得以解决。这是因为要给初始坐标和终止坐标赋个0值,不然系统无法判断坐标位置。6.2 测试结果编译、连接、运行程序后,在窗口中绘制不同线宽,不同线色,不同填充色的图形后窗口如图13所示。图13 绘制各个图形6.3 关键源代码1) 在“MainFrm.h”中,在class CMainFrame : public CFrameWnd里的protected下定义:CToolBar m_drawToolBar; /工具栏2) 在“MainFrm.cpp”中,在CMainFr

17、ame:OnCreate(LPCREATESTRUCT lpCreateStruct)里添加以下代码:if (!m_drawToolBar.Create(this) |!m_drawToolBar.LoadToolBar(IDR_DRAW)TRACE0(Failed to create status barn);return -1; 3) 在“LiYuJingView.h”中,在class CLiYuJingiew : public CView里的public下定义相关变量:CLiYuJingDoc* GetDocument(); COLORREF m_nColor; COLORREF m_f

18、Color; CPoint cpoint; CPoint opoint; BOOL m_Down; int w; int shape;HCURSOR m_Cursor;/光标资源句柄 4) 在“LiYuJingViewView.cpp”中,添加如下函数及代码:CLiYuJingView:CLiYuJingView()/ TODO: add construction code here w=1; /初始线宽默认为1 shape=0;m_fColor=RGB(255,255,255);/初始填充色为白色m_Cursor=AfxGetApp()-LoadStandardCursor(IDC_CROS

19、S);void CLiYuJingView: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:OnUpdate

20、W2(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 CLiYuJingView:OnLin

21、e() shape=1; /选择直线,则令shape为1m_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()-LoadStandardCursor(IDC_CROSS); void CLiYu

22、JingView: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=3); /shape为3时,椭圆选项前打上勾void CLiYuJingView:OnColor() CC

23、olorDialog Color; / 创建颜色对话框 if(Color.DoModal() = IDOK) / 如果用户点击OK按钮 m_nColor=Color.GetColor(); / 更改颜色,把颜色赋到m_nColorvoid CLiYuJingView:OnFillcolor() CColorDialog FullColor; / 创建颜色对话框 if(FullColor.DoModal() = IDOK) / 如果用户点击OK按钮 m_fColor=FullColor.GetColor(); / 更改颜色,把颜色赋到m_fColorvoid CLiYuJingView:OnPa

24、int() CPaintDC dc(this); / device context for painting CPen pen; /定义画笔 CBrush brush; /定义画刷 pen.CreatePen(PS_SOLID,w, m_nColor); /创建画笔 brush.CreateSolidBrush(m_fColor); /创建画刷 dc.SelectObject(&pen); /获取画笔 dc.SelectObject(&brush); /获取画刷 if(shape=1) dc.MoveTo(opoint.x,opoint.y); dc.LineTo(cpoint.x,cpoin

25、t.y); /绘制直线,从opoint到cpoint连线 if(shape=2) dc.Rectangle(opoint.x,opoint.y,cpoint.x,cpoint.y); /绘制矩形 if(shape=3) dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y);/绘制椭圆void CLiYuJingView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default m_Down=TRUE; /

26、鼠标按下 SetCapture(); /获取坐标cpoint=opoint=point; /把鼠标所在坐标赋给起点坐标opoint ReleaseCapture(); /释放坐标CView:OnLButtonDown(nFlags, point);void CLiYuJingView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) /如果鼠标按下SetCursor(m_Cursor);/设置使用光标资源CClientDC dc(this);/构造设备环境对象CPen newpen;/新画笔CPen *oldpen;/老画笔CBrush new

27、brush;/新画刷CBrush *oldbrush;/老画刷/创建指定宽度和线色的画笔newpen.CreatePen(PS_SOLID, w,m_nColor); newbrush.CreateSolidBrush(m_fColor);/创建指定颜色的画刷oldpen=dc.SelectObject(&newpen);/将创建的画笔选入设备环境oldbrush=dc.SelectObject(&newbrush);/将创建的画刷选入设备环境dc.SetROP2(R2_NOTXORPEN);/设置同或绘图模式/判断鼠标移动的同时鼠标左键按下,并且要绘制的是直线段if(m_Down&shape

28、=1)/重新绘制前一个鼠标移动消息处理函数绘制的直线段/因为绘图模式的原因,结果是擦除了该线段dc.MoveTo(opoint);dc.LineTo(cpoint);/绘制新的直线段cpoint=point;/保存新的终止点dc.MoveTo(opoint);dc.LineTo(point);/判断鼠标移动的同时鼠标左键按下,并且要绘制的是椭圆if(m_Down&shape=2)dc.Rectangle(opoint.x,opoint.y,cpoint.x,cpoint.y);/绘制新的矩形dc.Rectangle(opoint.x,opoint.y,point.x,point.y);cpoi

29、nt=point;/保存新的终止点/判断鼠标移动的同时鼠标左键按下,并且要绘制的是矩形if(m_Down&shape=3)dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y);dc.Ellipse(opoint.x,opoint.y,point.x,point.y);cpoint=point;/保存新的终止点newbrush.DeleteObject();/删除新画笔dc.SelectObject(oldpen);/恢复原有画笔newbrush.DeleteObject();/删除新画刷dc.SelectObject(oldbrush);/恢复原有画刷CView:OnMouseMove(nFlags, point);void CLiYuJingView:OnLButtonUp(UINT nFlags, CPoint point) m_Down=FALSE; /鼠标不按下,即弹起 Invalidate(0); /刷新 CView:OnLButtonUp(nFlags, point);

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

当前位置:首页 > 教育专区 > 单元课程

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁