收藏 分享(赏)

基于MFC的简单画图程序实验.doc

上传人:精品资料 文档编号:10359016 上传时间:2019-11-03 格式:DOC 页数:17 大小:694KB
下载 相关 举报
基于MFC的简单画图程序实验.doc_第1页
第1页 / 共17页
基于MFC的简单画图程序实验.doc_第2页
第2页 / 共17页
基于MFC的简单画图程序实验.doc_第3页
第3页 / 共17页
基于MFC的简单画图程序实验.doc_第4页
第4页 / 共17页
基于MFC的简单画图程序实验.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、1简单画图程序【实验目的】本实验目的是通过构建基于 MFC的 windows画图程序,使学生:(1) 理解 MFC应用程序的运行机制(2) 掌握使用 MFC构建 Windows应用程序的基本结构及编程的基本方法(3) 理解和掌握 MFC应用程序消息处理机制及应用(4) 掌握类向导( ClassWizard)的使用【实验要求】(1) 必须做好实验原理的预习。(2) 需要对提供的程序代码进行分析,并明确实验时还应在何处添加哪些语句。【实验环境】Microsoft Windows XPMicrosoft Visual C+ 6.01 基本功能描述1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名

2、为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,线宽选项,有 1-5可供选择,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。2 设计思路1) 对需要用到的变量进行初始化。2) 选择相应的图形之后就响应相应的消息处理函数,给 shape

3、 赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。23) 鼠标的按下响应函数 OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数 OnMouseMove()改变终点的坐标,鼠标的弹起响应 OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。4) 选择图形或其它属性,可进行下一次绘制。开始定义并初始化变 shape 线色 m_ncolor 填充色 m_fcolor 画笔 pen画刷 brush 绘图起点opoint 绘图终点 cpoint选择线宽改变画笔属性 默认值(w=1)改变画刷属性默认值(黑色)矩形默认值(黑色)直线选择填充色响应

4、函数OnEllipse()shape=3改变画笔属性响应函数OnRect()shape=2响应函数OnLine()shape=1椭圆选择线色3图 1 程序流程图3 软件设计3.1 设计步骤1)创建单文档创建一个 MFC AppWizardexe工程,命名为“yinshuyan” ,如图 2所示,并创建单文档,如图 3所示。创建成功后,系统自动生成相应的类,如图 4所示。图 2 创建工程鼠标左键按下 响应函数 OnLButtonDown()opoint=point鼠标左键弹起响应函数 OnLButtonUp()刷新,得到图形鼠标移动 响应函数 OnMouseMove()epoint=point响

5、应 OnPaint(),绘制图形结束4图 3 创建单文档图 4 生成类2)编辑菜单添加需要的菜单项,如图 5所示(可以通过拖动调整菜单的顺序) ;并在菜单的属性中设定好所对应的 ID,如图 6所示,各项菜单对应的 ID 如表 1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符(Separator)选项即可) 。5图 5 添加菜单项图 6 设置菜单 ID表 1 菜单项对应 ID菜单名 ID 菜单名 ID直线 ID_LINE 线宽 1 ID_W1矩形 ID_RECT 线宽 2 ID_W2椭圆 ID_ELLIPSE 线宽 3 ID_W3颜

6、色 ID_COLOR 线宽 4 ID_W4填充色 ID_FILLCOLOR 线宽 5 ID_W5建立类向导,在视图类 CyinshuyanView(通过菜单 View-ClassWizard,或者快捷键 Ctrl+w 打开)中,对各菜单项添加对应的 COMMAND 消息处理函数,部分菜单项还添加对应的 UPDATE_COMMAND_UI 消息函数,如图 7所示。6图 7 建立类向导【注意:此图有误,Class name 的下拉框中,应选择“CyinshuyanView”而非此图显示的“CMainFrame” 】上述操作完成后,可以发现在 Class CMainFrame中自动增加了类似 OnL

7、ine()之类的许多函数,并且在源文件 MainFrm.cpp中,自动添加了相应的消息映射。BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_COMMAND(ID_LINE, OnLine)END_MESSAGE_MAP()3)创建工具栏在插入处选择资源(菜单 Insert-Resource,或者快捷键 Ctrl+R) ,新建工具栏,如图 8所示;7图 8 新建工具栏在工具栏上添加相应的按钮,在属性处更改其 ID,如图 9所示。图 9 编辑工具栏4)在相应消息函数处添加代码,实现其功

8、能建立类向导,在视图类 CyinshuyanView 中,添加 WM_PAINT 消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE 消息,并在其中添加相应的代码,如图 10所示。图 10 添加 WM_PAINT消息83.2 界面设计各控件名称,类型,属性及相关变量如表 2所示。 表 2 界面控件表控件名称 控件类型 属性 相关变量绘图 下拉式菜单 无 无直线菜单项工具栏按钮 ID_LINE int shape矩形菜单项工具栏按钮 ID_RECT int shape椭圆菜单项 工具栏按钮 ID_ELLIPSE int shape线宽 弹出式菜单无 int

9、 w颜色(线色 )菜单项工具栏按钮ID_COLORCOLORREF m_nColor填充色菜单项工具栏按钮 ID_FILLCOLOR COLORREF m_fColor3.3 关键源代码1)在“MainFrm.h”中,在 class CMainFrame : public CFrameWnd 里的 protected 下定义:CToolBar m_drawToolBar; /工具栏2)在“MainFrm.cpp”中,在 CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)里添加以下代码:if (!m_drawToolBar.Create(this

10、) |!m_drawToolBar.LoadToolBar(IDR_DRAW) TRACE0(“Failed to create status barn“);return -1; 3)在“YinshuyanView.h”中,在 class CYinshuyanView : public CView 里的 public 下定义相关变量:COLORREF m_nColor;COLORREF m_fColor;9CPoint cpoint; CPoint opoint;BOOL m_Down;int w;int shape;4)在“YinshuyanView.cpp”中,添加如下函数及代码:CYin

11、shuyanView: CYinshuyanView() w=1; /初始线宽默认为 1shape=0;void CYinshuyanView:OnW1() w=1; /令线宽为 1void CYinshuyanView:OnW2() w=2; /令线宽为 2void CYinshuyan:OnW3() w=3; /令线宽为 3void CYinshuyanView:OnW4() w=4; /令线宽为 4void CYinshuyanView:OnW5() w=5; /令线宽为 510void CYinshuyanView:OnUpdateW1(CCmdUI* pCmdUI) pCmdUI-S

12、etRadio(w=1); /当线宽为 1时,此选项前标有圆点void CYinshuyanView:OnUpdateW2(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=2); /当线宽为 2时,此选项前标有圆点void CYinshuyanView:OnUpdateW3(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=3); /当线宽为 3时,此选项前标有圆点void CYinshuyanView:OnUpdateW4(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=4); void CYinshuyanView:OnUpdate

13、W5(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=5);void CYinshuyanView:OnLine() shape=1; /选择直线,则令 shape 为 1void CYinshuyanView:OnRect() 11shape=2; /选择矩形,则令 shape 为 2void CYinshuyanView:OnEllipse() shape=3; /选择椭圆,则令 shape 为 3void CYinshuyanView:OnUpdateLine(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=1); /shape 为 1时,

14、直线选项前打上勾void CYinshuyanView:OnUpdateRect(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=2); /shape 为 2时,矩形选项前打上勾void CYinshuyanView:OnUpdateEllipse(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=3); /shape 为 3时,椭圆选项前打上勾void CYinshuyanView:OnColor() CColorDialog Color; / 创建颜色对话框if(Color.DoModal() = IDOK) / 如果用户点击 OK 按

15、钮 m_nColor=Color.GetColor(); / 更改颜色,把颜色赋到 m_nColorvoid CYinshuyanView:OnFillColor() CColorDialog FillColor; / 创建颜色对话框if(FillColor.DoModal() = IDOK) / 如果用户点击 OK 按钮 12m_fColor=FillColor.GetColor(); / 更改颜色,把颜色赋到 m_fColorvoid CYinshuyanView:OnPaint() CPaintDC dc(this); / device context for paintingCPen

16、pen; /定义画笔CBrush brush; /定义画刷pen.CreatePen(PS_SOLID,w, m_nColor); /创建画笔brush.CreateSolidBrush(m_fColor); /创建画刷dc.SelectObject( /获取画笔dc.SelectObject( /获取画刷if(shape=1)dc.MoveTo(opoint.x,opoint.y);dc.LineTo(cpoint.x,cpoint.y); /绘制直线,从 opoint 到 cpoint 连线if(shape=2)dc.Rectangle(opoint.x,opoint.y,cpoint.x

17、,cpoint.y); /绘制矩形if(shape=3)dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y); /绘制椭圆void CYinshuyanView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_Down=TRUE; /鼠标按下 SetCapture(); /获取坐标opoint=point; /把鼠标所在坐标赋给起点坐标 opointReleaseCapture(); /释放坐

18、标CView:OnLButtonDown(nFlags, point);void CYinshuyanView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) /如果鼠标按下cpoint=point; /把鼠标所在点坐标赋给终点坐标 cpointCView:OnMouseMove(nFlags, point);13void CYinshuyanView:OnLButtonUp(UINT nFlags, CPoint point) m_Down=FALSE; /鼠标不按下,即弹起Invalidate(0); /刷新CView:OnLButton

19、Up(nFlags, point);3.4 关键功能实现1)选择要绘制的图形在直线、矩形以及椭圆的消息处理函数里为 shape 分别赋值为 1,2,3,在 OnPaint()函数里添加 3个 if语句的代码来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2)改变线宽在 OnPaint()创建的画笔中, pen.CreatePen(PS_SOLID,w, m_nColor),线宽处用 w 表示,则改变 w 的值即改变了画笔的粗细。选择菜单绘图 线宽选择划线

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

21、ush(m_fColor),颜色就是用 m_fColor表示的,改变 m_fColor 即改变了画刷的颜色。选择菜单绘图填充色,会弹出通过WM_COLORREF 从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值14就赋给变量 m_fColor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色为黑色。5)绘制图形鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在 OnLButtonDown()函数里,将捕获的坐标值赋给定义作为起点的变量 opoint;按下鼠标左键拖动鼠标时,捕捉鼠标当前位置坐标值为终点坐标值,此时在 OnMouseMove()函数里,把捕获的坐标值赋

22、给定义作为终点的变量 cpoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画图结束后,刷新窗口,以便重新画图,此时执行的是 OnLButtonUp()函数。这次实验中关键就是确定画图起点及终点坐标,因为是用鼠标绘制图形,所以需用函数来捕获鼠标当前所在位置的坐标,因此设置了 OnLButtonDown()函数来捕获起点坐标,OnMouseMove()函数来捕获鼠标移动是的当前位置坐标,OnLButtonUp()函数来捕获终点坐标。而绘制图形使用的函数是 OnPaint(),将图形的起点和终点坐标和鼠标的位

23、置坐标相联系后就能用鼠标来绘制图形了,所以在它们之间用 opoint 和 cpoint 两变量实现链接。另外将绘图语句集中在 OnPaint()函数中,然后其他函数来调用 OnPaint()函数,这样不容易引起混乱,同时程序更简单,更有条理,便于修改。4. 思考题1)说明直线、椭圆、矩形绘制使用的函数,及其参数含义?答:直线、椭圆、矩形绘制使用的函数是 OnPaint()。函数里面定义和创建了绘图的画笔 pen 和填充图形的画刷 brush,3 种图形本身对应的消息处理函数里分别赋给 shape3个不同的值:1,2,3,在 OnPaint()里有 3个 if 语句,用来这实现这三个图形的绘制:

24、当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2)如何控制菜单项的状态,使用的消息类型?答:通过添加 UPDATE_COMMAND_UI 消息函数,在生成的函数里添加相关代码来控制菜单项的状态及使用的消息类型。如选择直线时,使 shape=1,则 OnUpdateLine 里添15加 pCmdUI-SetCheck(shape=1),那么当 shape 的值为 1时,即代表选择了直线项,此时菜单中的直线选项前就打勾了,代表选中。矩形和椭圆类似。3) 如 何 设 置 菜 单 和

25、工 具 栏 按 钮 的 快 捷 键 操 作 ?答:在资源视图下选 择 Accelerator, 双 击 IDR_MAINFRAME, 打 开 编 辑 窗 口 ,双 击 空 白 处 , 在 ID 下 拉 列 表 框 中 选 择 需 要 快 捷 键 的 菜 单 项 或 工 具 栏 按 钮 的ID, 在 键 一 栏 中 输 入 快 捷 键 , 选 择 Ctrl 复 选 框 和 虚 拟 键 单 选 按 钮 即 可 , 如 图11 所 示 。图 11 快捷键的创建5. 附录5.1 易出错的问题1)一开始没有添加刷新函数 Invalidate(),这就使程序运行之后,无论鼠标左键按下时如何移动无法绘图,这

26、是因为当一个窗口内键入内容其实就是将窗口刷新了,相当于更新了窗口,故必须有刷新函数,这和生活中的白纸写字不一样。2)当添加 Invalidate()后,把 Invalidate()放在 OnMouseMove()里,但是这样只能在窗口内画一个图形,即每画完一个图形就刷新一次。将 Invalidate()改为了 Invalidate(0),这时是可绘制多个图形,但鼠标每移动一个位置都进行一次刷新,绘图结束后,绘图过程中的所有痕迹都在,产生了很多拖动的影子。将 Invalidate(0) 放在了 OnLButtonUp()中,16那么每次重绘,上次的图形会作为背景被保留下来,而不会被刷新掉。5.2 测试结果1)点击链接,编译,运行后的窗口如图 12 所示。图 12 运行结果2)改变绘制图形形状,颜色,线宽,填充色之后绘制的图形如图 13所示。17图 13 改便各项属性厚后的图形

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报