收藏 分销(赏)

东南大学MFC实践设计优质报告一.doc

上传人:精**** 文档编号:2731032 上传时间:2024-06-05 格式:DOC 页数:18 大小:326.54KB 下载积分:8 金币
下载 相关 举报
东南大学MFC实践设计优质报告一.doc_第1页
第1页 / 共18页
东南大学MFC实践设计优质报告一.doc_第2页
第2页 / 共18页


点击查看更多>>
资源描述
MFC课程设计 ——绘制电路图 姓名: 学号: 指导老师:窦建平 院系:东南大学机械工程学院 日期:.10.10 绘制电路图 摘要内容:本程序可用来绘制简单电路图,程序中有灯泡、电阻、电源、开关、导线、电压表、电流表等常见电路元件。程序可将完成电路图保留,方便下次使用。 关键词:绘制、电路图、保留 Draw The Circuit Diagram  Abstract: This procedure can be used to draw a simple circuit diagram, the light bulb, resistance, power supply, switch, wire, voltmeter, ammeter and other commonly used circuit element program. The program can be completed save circuit diagram, so that next time you can use. Keywords:Drawing, circuit diagram, preservation. 目 录 第一章 绪论 4 1.1 引言 4 1.2 编程思绪 4 第二章 程序使用 5 2.1 程序界面 5 2.2 菜单栏和工具栏 6 2.3 保留和打开 6 第三章 程序代码解析 7 3.1 关键函数及说明 7 3.1.1 View类中关键函数及变量 7 3.1.2 Doc类中关键函数及变量 8 3.1.3 元件类关键函数及变量 9 3.2 编程中碰到问题及处理措施 9 3.2.1 选择按钮后怎样实现元件跟随鼠标移动 9 3.2.2 拖动和删除元件 11 第四章 程序运行测试 14 第五章 总结 17 第六章 附录——未完成电路简化函数 18 第一章 绪论 1.1 引言 从中课时代到大学,电路图一直伴随我们走过了近十年学习生活。而电路图繁琐绘制也为我们学习增添了不少麻烦。我们常常遇见这么情况,在绘制电路时,常常出现一处绘制错误而重新画整幅图情况。而现在有了电路图绘图软件,我们能够轻松增加、拖动、删除错误元件,为电路图绘制提供了效率。大大降低了无须要工作量,让我们愈加轻松学习、绘制电路图。另外,程序设计原本计划加入电路识别,使电路能够自行判定状态并实现对应功效。但电路识别模块所需函数逻辑问题较为复杂,且包含短路、断路、并联、串联等多个模块简化和判定,因为时间原因未能全部完成,本汇报中仅将短路简化和判定函数附在最终,以供参考。 1.2 编程思绪 在本程序编写过程中,采取将各个元件作为一个类方法来实现。将每一个元件经过本身类来完成定义,然后经过程序View类创建类对象并完成Doc中数据存放。每个元件元素均采取中心点方法确定,使程序数据存放愈加简化,节省了存放空间。而在删除某一个元件时,也无需改动元件类函数,只需经过更改Doc类中存放元件中心点坐标,从而使View类在创建函数时所传参数不一样即可实现。 元件绘制也采取较为简单简化画法,即用简单线条替换繁琐元件结构,以元件中心点为基准点,在元件类中调用OnDraw函数,经过Ellipse、Rectangle、Lineto等函数进行圆、矩形、直线简单绘制,使电脑绘制和手绘电路图基础一致,方便打印保留。 第二章 程序使用 状态栏 工具栏 标题栏 绘图区 2.1 程序界面 2.2 菜单栏和工具栏 单击工具栏按钮,如电压表,移动鼠标至绘图区,在所要绘制地方点击鼠标左键,即可绘制出想要图形。若想移除元件,先点击工具栏图标为D按钮,再点击所要删除元件,即可删除。图形拖动时,鼠标左键按住要拖动元件,拖动至所需位置放开鼠标左键,即可完成拖动。绘制导线时,点击导线按钮,在导线起点单击,然后移动鼠标便可绘制出导线轨迹,在导线终点单击鼠标以完成导线绘制。(注:导线暂不支持删除和拖动,菜单栏和工具栏操作相同,不再赘述) 2.3 保留和打开 单击工具栏保留按钮,在弹出以下窗口中输入文件名并保留。打开文件和此相同。 第三章 程序代码解析 3.1 关键函数及说明 3.1.1 View类中关键函数及变量 CEXView::CEXView() // 初始化函数 void CEXView::OnDraw(CDC* pDC) // 创建元件对象并完成视图显示及窗口重绘 void CEXView::OnMouseMove(UINT nFlags, CPoint point) //完成鼠标移动时元件跟随鼠标显示 void CEXView::OnLButtonDown(UINT nFlags, CPoint point) //在鼠标拖动某一元件时对其进行标识 void CEXView::OnLButtonUp(UINT nFlags, CPoint point) //在鼠标左键抬起时将所绘制图形Doc类对应元件中心统计为鼠标所在位置,并使Doc中统计元件个数变量增加对应数量 void CEXView::OnRes() void CEXView::OnKey() void CEXView::OnLine() void CEXView::OnVol() void CEXView::OnAmm () void CEXView::OnLamp () void CEXView::OnPower() void CEXView::OnDelete() //以上函数均为在点击对应工具栏按钮时,将标识其功效变量置为True,并将其它按钮置为False bool m_lamp,m_line,m_linec,m_power,m_key,m_res,m_amm,m_vol,m_delete;//统计各按钮是否被激活 3.1.2 Doc类中关键函数及变量 CEXDoc::CEXDoc()// 初始化函数 void CEXDoc::Serialize(CArchive& ar) // 数据保留和打开 CPoint lampcenter[100]; CPoint powercenter[100]; CPoint keycenter[100]; CPoint rescenter[100]; CPoint volcenter[100]; CPoint ammcenter[100]; //统计各中心点坐标 CPoint line[100][1000];//统计导线中各点坐标 int m_lampindex, m_keyindex, m_powerindex, m_volindex, m_ammindex, m_resindex, m_lineindex,//统计各元件个数 m_lpindex[100];//统计每根导线中点个数 3.1.3 元件类关键函数及变量 这里仅选择灯泡类为例进行说明: void CLAMP::OnDraw(CDC* pDC)//绘制灯泡元件 CPoint center;//灯泡中心 3.2 编程中碰到问题及处理措施 3.2.1 选择按钮后怎样实现元件跟随鼠标移动 在网上查得资料得悉,在鼠标移动时,程序会调用OnMouseMove函数,于是在类向导中添加OnMouseMove函数以下: void CEXView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); CEXDoc* pDoc = GetDocument(); lastpoint=point; ASSERT_VALID(pDoc); if(m_lamp==true) { CLAMP lamp; lamp.GetCenter(point); lamp.OnDraw(&dc); } …… CView::OnMouseMove(nFlags, point); } 得到以下结果,能够看出,在鼠标拖动过程中,窗口并没有刷新,加入刷新函数 Invalidate();后不能取得对应效果,从网上查到Invalidate() -- RedrawWindow() -- UpdateWindow()三个函数异同: Invalidate()是强制系统进行重画,不过不一定就立即进行重画。因为Invalidate()只是通知系统,此 时窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当实施到WM_PAINT消息时才会对敞口进行重绘。 UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判定GetUpdateRect(hWnd,NULL,TRUE)看有没有可绘制用户区域,假如没有,则不发送WM_PAINT。 RedrawWindow()则是含有Invalidate()和UpdateWindow()双特征。申明窗口状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。于是改善后函数变为: CClientDC dc(this); CEXDoc* pDoc = GetDocument(); CRect j(lastpoint.x-40,lastpoint.y+40,lastpoint.x+40,lastpoint.y-40); lastpoint=point; ASSERT_VALID(pDoc); if(m_lamp==true) { CLAMP lamp; lamp.GetCenter(point); RedrawWindow(&j); lamp.OnDraw(&dc); } 加入CRect j;使刷新时不会出现全屏抖动现象。 3.2.2 拖动和删除元件 删除元件和拖动元件全部需要进行元件定位,在鼠标摁下时,要确保其它功效按钮没有被激活。所以在void CEXView::OnLButtonDown(UINT nFlags, CPoint point)中加入以下判定if(m_lamp==false&&m_power==false&&m_key==false&&m_vol==false&&m_amm==false&&m_line==false&&m_res==false&&m_delete==false)。 下面举例说明怎样进行元件拖动: int i,j=0; if(!j) for(i=0;i<pDoc->m_lampindex;i++) { if((point.x>pDoc->lampcenter[i].x-11)&&(point.x<pDoc->lampcenter[i].x+11)&&(point.y>pDoc->lampcenter[i].y-11)&&(point.y<pDoc->lampcenter[i].y+11))//鼠标位置在灯泡中心周围即判定为选定灯泡 { j=1; break; } }其中,j表示元件类型,如j=1表示灯泡型。 经过以上代码,我们找到了想要确定元件,下面要做就是拖动或删除工作。 if(j) { switch (j) { case 1: { for(;i<pDoc->m_lampindex-1;i++) { pDoc->lampcenter[i]=pDoc->lampcenter[i+1];//将现有灯泡中心删除,经过后一位向前一位覆盖方法实现 pDoc->m_lampindex--;//灯泡数量减一 m_lamp=true;激活OnMouseMove函数中灯泡绘制功效 break; } } } 删除函数和这类似,只是将m_lamp=true换成刷新窗口函数即可 。 第四章 程序运行测试 测试拖动 绘制好电路图 测试保留 测试添加多个相同元件 测试删除 成功打开 测试打开 第五章 总结 在程序编写过程中,对MFC有了愈加清楚认识,愈加体会到C++类封装性。能够随心所欲在各个类之间完成对象定义。学会了从网上查找所需要对应函数,经过类向导增加想要函数,并依据函数功效增添代码。如在OnMouseMove函数中体会到了View函数在整个MFC结构中作用。经过每次刷新窗口,了解到用Doc类存放数据关键性。 MFC编程只是一个工具,而编程关键还是代码实现。我们在使用MFC编程时要想学得愈加好就要不停练习,更具体了解其中多种类、函数,多种工具,MFC是一个巨大工具箱,不过假如不知道工具箱里面工具怎么用,那在好工具也无用武之地。所以,我认为此次编程小实习关键是让我初步接触了MFC怎样实现可视化编程。未来要想真正掌握MFC编程还要不停深入了解多种MFC工具,真正和代码结合起来实现高效实用编程效果。总而言之,MFC就是经过多种类和对象应用完成程序运行。 其次,我要说,在面对自己完全陌生领域,不要退缩,要发挥自己聪慧才智,攻克它。对于MFC,我在短学期开始之前,是完全陌生。于是在整个项目设计过程中,我在图书馆借了相关书籍,一开始,先照着上面例子,修修改改,编写一下,以后慢慢知道了其中原理,也就简单了。即使过程是艰苦,但结果是美妙,当看到它成功运行起来时候,那滋味,真是一个字:爽! 经过这次暑期编程试验,不仅充实了暑期生活,也让我学到了部分新知识,在以后学习生活要主动参与类似活动,加强知识学习,能力提升,为未来职业生涯逐步打下一个坚实基础
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服