欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:15821355       资源大小:922.55KB        全文页数:19页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

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

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

    3、处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。3) 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。4) 选择图形或其它属性,可进行下一次绘制。 图1 程序流程图3 软件设计3.1 设计步骤1)创建单文档创建一个MFC AppWizardexe工程,命名为“yinshuyan”,如图2所示,并创建单文档,如图3所示。创建成功后,系统自动生成相应的类,如图4所示。图2 创建工程图3 创建

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

    5、shuyanView(通过菜单View-ClassWizard,或者快捷键Ctrl+w打开)中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图7所示。图7 建立类向导【注意:此图有误,Class name的下拉框中,应选择“CyinshuyanView”而非此图显示的“CMainFrame” 】上述操作完成后,可以发现在Class CMainFrame中自动增加了类似OnLine()之类的许多函数,并且在源文件MainFrm.cpp中,自动添加了相应的消息映射。BEGIN_MESSAGE_MAP(CMainFrame, C

    6、FrameWnd) /AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_LINE, OnLine) END_MESSAGE_MAP()3)创建工具栏在插入处选择资源(菜单Insert-Resource,或者快捷键Ctrl+R),新建工具栏,如图8所示;图8 新建工具栏在工具栏上添加相应的按钮,在属性处更改其ID,如图9所示。图9 编辑工具栏4)在相应消息函数处添加代码,实现其功能建立类向导,在视图类CyinshuyanView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE

    7、消息,并在其中添加相应的代码,如图10所示。图10 添加WM_PAINT消息3.2 界面设计各控件名称,类型,属性及相关变量如表2所示。 表2 界面控件表控件名称控件类型属性相关变量绘图下拉式菜单 无 无 直线菜单项工具栏按钮ID_LINEint shape矩形菜单项工具栏按钮ID_RECTint shape椭圆菜单项 工具栏按钮ID_ELLIPSEint shape线宽弹出式菜单 无int w颜色(线色)菜单项工具栏按钮ID_COLORCOLORREF m_nColor填充色菜单项工具栏按钮ID_FILLCOLORCOLORREF m_fColor 3.3 关键源代码1)在“MainFrm.

    8、h”中,在class CMainFrame : public CFrameWnd里的protected下定义: CToolBar m_drawToolBar; /工具栏2)在“MainFrm.cpp”中,在CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)里添加以下代码:if (!m_drawToolBar.Create(this) | !m_drawToolBar.LoadToolBar(IDR_DRAW) TRACE0(Failed to create status barn); return -1; 3)在“YinshuyanView.h

    9、”中,在class CYinshuyanView : public CView里的public下定义相关变量:COLORREF m_nColor;COLORREF m_fColor;CPoint cpoint; CPoint opoint;BOOL m_Down;int w;int shape; 4)在“YinshuyanView.cpp”中,添加如下函数及代码: CYinshuyanView: CYinshuyanView() w=1; /初始线宽默认为1 shape=0; void CYinshuyanView:OnW1() w=1; /令线宽为1void CYinshuyanView:O

    10、nW2() w=2; /令线宽为2void CYinshuyan:OnW3() w=3; /令线宽为3void CYinshuyanView:OnW4() w=4; /令线宽为4void CYinshuyanView:OnW5() w=5; /令线宽为5void CYinshuyanView:OnUpdateW1(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=1); /当线宽为1时,此选项前标有圆点void CYinshuyanView:OnUpdateW2(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=2); /当线宽为2时,此选项前标有圆点voi

    11、d CYinshuyanView:OnUpdateW3(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=3); /当线宽为3时,此选项前标有圆点void CYinshuyanView:OnUpdateW4(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=4); void CYinshuyanView:OnUpdateW5(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=5);void CYinshuyanView:OnLine() shape=1; /选择直线,则令shape为1void CYinshuyanView:OnRect()

    12、 shape=2; /选择矩形,则令shape为2void CYinshuyanView:OnEllipse() shape=3; /选择椭圆,则令shape为3void CYinshuyanView:OnUpdateLine(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=1); /shape为1时,直线选项前打上勾void CYinshuyanView:OnUpdateRect(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=2); /shape为2时,矩形选项前打上勾void CYinshuyanView:OnUpdateEllip

    13、se(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=3); /shape为3时,椭圆选项前打上勾void CYinshuyanView:OnColor() CColorDialog Color; / 创建颜色对话框 if(Color.DoModal() = IDOK) / 如果用户点击OK按钮 m_nColor=Color.GetColor(); / 更改颜色,把颜色赋到m_nColorvoid CYinshuyanView:OnFillColor() CColorDialog FillColor; / 创建颜色对话框 if(FillColor.DoModal()

    14、 = IDOK) / 如果用户点击OK按钮 m_fColor=FillColor.GetColor(); / 更改颜色,把颜色赋到m_fColorvoid CYinshuyanView:OnPaint() 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); /获取画笔

    15、dc.SelectObject(&brush); /获取画刷 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,cpoint.y); /绘制矩形 if(shape=3) dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y); /绘制椭圆void CYinshuyanView:OnLButtonDown(UINT

    16、nFlags, CPoint point) / TODO: Add your message handler code here and/or call default m_Down=TRUE; /鼠标按下 SetCapture(); /获取坐标 opoint=point; /把鼠标所在坐标赋给起点坐标opoint ReleaseCapture(); /释放坐标 CView:OnLButtonDown(nFlags, point);void CYinshuyanView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) /如果鼠标按下 cpoi

    17、nt=point; /把鼠标所在点坐标赋给终点坐标cpoint CView:OnMouseMove(nFlags, point);void CYinshuyanView:OnLButtonUp(UINT nFlags, CPoint point) m_Down=FALSE; /鼠标不按下,即弹起 Invalidate(0); /刷新 CView:OnLButtonUp(nFlags, point);3.4 关键功能实现1)选择要绘制的图形在直线、矩形以及椭圆的消息处理函数里为shape分别赋值为1,2,3,在OnPaint()函数里添加3个if语句的代码来这实现这三个图形的绘制:当选择画直线时

    18、,shape=1,则执行绘制直线代码,当选择画矩形时,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_nCo

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

    20、颜色,则默认填充色为黑色。5)绘制图形 鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在OnLButtonDown()函数里,将捕获的坐标值赋给定义作为起点的变量opoint;按下鼠标左键拖动鼠标时,捕捉鼠标当前位置坐标值为终点坐标值,此时在OnMouseMove()函数里,把捕获的坐标值赋给定义作为终点的变量cpoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画图结束后,刷新窗口,以便重新画图,此时执行的是OnLButtonUp()函数。这次实验中关键就是确定画图起点及终点坐标,因为是用鼠标

    21、绘制图形,所以需用函数来捕获鼠标当前所在位置的坐标,因此设置了OnLButtonDown()函数来捕获起点坐标,OnMouseMove()函数来捕获鼠标移动是的当前位置坐标,OnLButtonUp()函数来捕获终点坐标。而绘制图形使用的函数是OnPaint(),将图形的起点和终点坐标和鼠标的位置坐标相联系后就能用鼠标来绘制图形了,所以在它们之间用opoint和cpoint两变量实现链接。另外将绘图语句集中在OnPaint()函数中,然后其他函数来调用OnPaint()函数,这样不容易引起混乱,同时程序更简单,更有条理,便于修改。4. 思考题1)说明直线、椭圆、矩形绘制使用的函数,及其参数含义?

    22、 答:直线、椭圆、矩形绘制使用的函数是OnPaint()。函数里面定义和创建了绘图的画笔pen和填充图形的画刷brush,3种图形本身对应的消息处理函数里分别赋给shape3个不同的值:1,2,3,在OnPaint()里有3个if语句,用来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2)如何控制菜单项的状态,使用的消息类型?答:通过添加UPDATE_COMMAND_UI消息函数,在生成的函数里添加相关代码来控制菜单项的状态及使用的消息类型。如选择直线时

    23、,使shape=1,则OnUpdateLine里添加pCmdUI-SetCheck(shape=1),那么当shape的值为1时,即代表选择了直线项,此时菜单中的直线选项前就打勾了,代表选中。矩形和椭圆类似。3)如何设置菜单和工具栏按钮的快捷键操作? 答:在资源视图下选择Accelerator,双击IDR_MAINFRAME,打开编辑窗口,双击空白处,在ID下拉列表框中选择需要快捷键的菜单项或工具栏按钮的ID,在键一栏中输入快捷键,选择Ctrl复选框和虚拟键单选按钮即可,如图11所示。图11 快捷键的创建5. 附录5.1 易出错的问题1)一开始没有添加刷新函数Invalidate(),这就使程

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


    注意事项

    本文(基于MFC的简单画图程序实验doc.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开