




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学专业课程设计3(面向对象程序设计)课程设计说明书模拟时钟程序1. 基本功能描述运行程序后,将在屏幕的左边显示一个指针式钟面,屏幕右边显示一个数字时钟。指针式的时钟表盘为圆形,并且圆周上有分布均匀的12个刻度,刻度显示清晰,钟面上有长度和颜色及粗细各不相同的指针,即时针、分针、秒针,从而使各个指针重合时亦可以轻易辨认,指针的运动具有规律性,且为顺时针。数字钟的钟面为一个规则的矩形,其显示时间的格式是_年_月_日_时_分_秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步, 且时间与用户设置的时间一致。在达到老师的设计要求的基础上,还增加了时间设置对话框,用户可根据自己的需要,对当前的时间进行设置。同时还添加了停止时钟按钮,启动时钟按钮和获取当前时间按钮,界面交互性好,很方便用户使用。2. 设计思路2.1 程序流程图绘制时间设置对话框并对对话框分配内存和变量开始程序定义全局变量构造函数并初始化计算指针位置调用GetPoint()确定指针端点坐标获取初始时间并显示创建数字时钟边框调用MoveTo()和LineTo()绘制时钟钟面的指针和刻度()调用消息处理函数OnTimer()刷新窗口显示时间显示?调出菜单项,调整时间N退出?Y调用TextOut()对数字时钟进行输出程序结果YN图1 模拟时钟程序流程图2.2 程序流程相应说明1) 程序刚开始时要先定义全局变量,构造函数和相应函数的初始化。2) 绘制指针式的时钟和数字式的时钟图形时,可以运用CGaoYingView类,CGaoYingView类提供了视图类所需要的最基本的功能实现,其提供的虚拟方法使应用程序可以重写它们提供CGaoYingView派生类中的方法,其中OnDraw()函数是重绘视图窗口时被调用, 在定义了画刷CBrush之后,调用GetPoint()定义指针时钟表盘的大小,然后调用Ellipse()和Rectangle()绘制表盘上的刻度,调用MoveTo和LineTo绘制表盘指针, TextOut()则是用以数字钟的文本输出。3) 模拟时钟处理消息的过程:首先调用SetTimer函数定义时钟消息,包括参数指定计时器的ID,消息产生的时间间隔等;然后在相应的WM_TIMER消息处理里添加时钟消息响应代码;最后调用KillTimer释放该时钟。在该模拟时钟设计的程序中,调用消息处理函数OnTimer()刷新窗口显示。4) 要实现时钟的动态效果,即时间窗显示的时间每隔一秒钟更新一次,要定时更新,则应利用WM_TIMER消息。在Window中,用户可以安装一个个计时器,计时器每隔一定的时间间隔就会发出一个WM_TIMER消息,而这个时间间隔被设置为1s。MFC的Windows类提供了WM_TIMER消息处理函数OnTimer(),应在该函数内进行更新时间窗格的工作。5) 通过调用CGaoYingView()函数来实现时钟时间与程序设置时间保持一致,,在时间与程序设置时间同步后,然后在IDR_MAINFRAME中时钟控制选项中添加相应的选项,再通过建立类向导,设置相应的变量及函数以实现对时间的调整。3. 软件设计3.1 设计步骤1)使用创建一个基于对话框的MFC工程,将之命名为GaoYing,所有步骤均使用AppWizard给出的默认设置, 完成对话框的创建。2) 在Resource View选项卡中打开Menu资源组,双击IDR_MAINFRAME,在菜单项中添加一个“设置”的控件,再在“设置”的目录下添加一个“时间”的控件,设ID为IDC_EDIT_SET,通过ClassWizard为菜单连接对话框类CInputDlg,使菜单便能在程序运行后显示在应用程序主对话框上,菜单效果图如图2所示。图2 菜单效果图3) 在Resource View选项卡中打开Dialog资源组,新建并双击IDD_DIALOG1,在出现的对话框中添加所需的控件,根据需要对其属性进行修改,并建立类向导,编辑框效果图如图3所示。图3 编辑框效果图4)对上述设置的对话框设置相应的变量,并通过类向导将变量与实现相应功能的函数建立联系。5)在Header Files选项中选择GaoYingView.h中添加定义的变量。6)在GaoYingView.cpp中添加构造函数,SetGaoYing(),OnDraw(CDC*pDC),OnSettime(),OnStart(),OnStop()和OnTimer(UINT nIDEvent),其中OnSettime()是设置时间函数,OnTimer()是加入的消息处理函数,OnStop()和OnStart()分别是停止时钟和启动时钟,在CGaoYingView:OnDraw(CDC* pDC)中添加绘制时钟钟面、刻度、指针以及输出数字时钟的代码。以上函数均要加入相应的代。7)在CSetTimeDlg:CsetTimeDlg()中添加初始化时间设置框的代码。8)在头文件中添加对各种函数及变量的声明,同时在类的原文件中添加实现功能所需要的各种函数,并添加相应的代码。9) 对完成后的程序不断进行调试,直到程序运行不再报错,并能够实现所要求的各项功能。3.2 界面设计模拟时钟的界面设计比较简单,如图3所示,只需6个编辑框和相应的6个静态文本框以及确定和取消按钮,由于显示的时间都是整数,所以控件的类型都选为int型,因而所需要设计的控件也比较简单,时间设置界面的控件表如表1所示。表1 时间设置界面控件表控件序号控件名称控件类型控件ID相应变量1年编辑框(int)ID_YEARm_Year2月编辑框(int)ID_MONTHm_Month3日编辑框(int)ID_DAYm_Day4时编辑框(int)ID_ HOURm_Hour5分编辑框(int) ID_MINUTEm_Minute6秒编辑框(int)ID_SECONDm_Second3.3 关键功能的实现3.3.1 模拟时钟显示模拟时钟的显示主要在于绘图这一方面,也是本次模拟时钟课程设计的重中之重。这一部分所要添加的代码在File View选项卡中的Source File资源组里GaoYingView.cpp中:1) 首先要构造函数并初始化,接着调用SetGaoYing(int hour,int minute,int second)计算时钟当前位置,调用OnDraw(CDC*pDC)函数来绘制指针时钟和数字时钟,调用SetTimer()函数设置时间间隔,语句是SetTimer(1,1000,NULL),SetTimer()的第一个参数指定计时器ID为1,第二个参数规定了计时器的时间间隔为1000ms,即1s,这样,每隔1s就调用一次OnTimer()函数来刷新窗口显示。2) 定义画笔CPen和画刷CBrush,并通过n_Center.x=200,n_Center.y=200定义指针时钟中心坐标的位置,横坐标定义为int n_Center.x=200,纵坐标定义为int n_Center.y=200,接着调用GetPoint()确定指针时钟的大小并确定钟面上每个刻度的位置,即angle=nValue*PI/30-PI/2,P.x=n_Center.x+(int)(nLenth*cos(angle),P.y=n_Center.y+(int)(nLenth*sin(angle),再调用Ellipse()和Rectangle()绘制时钟的刻度,绘制整点刻度用pDC-Rectangle(pt.x-5,pt.y-5,pt.x+5,pt.y+5),绘制非整点刻度用pDC-Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2)来定义。4) 调用MoveTo()和LineTo()绘制时钟钟面的指针,并定义其类型、粗细和颜色,例如时针,CPen HourPen( PS_SOLID, 5, RGB( 0, 255, 0 ) ) 定义了时针的类型、粗细和颜色,n_Hour0=GetPoint(int(n_Radius/2),hour) 定义了时针的终点,n_Hour1=GetPoint(7,hour+30)定义了时针的起点,pDC-SetROP2(R2_WHITE),pDC-MoveTo(n_OldHour0),pDC-LineTo(n_OldHour1) 定义了用白色覆盖原位置时针,pDC-MoveTo(n_Hour0),pDC-LineTo(n_Hour1)定义绘制新的时针,分针和秒针也是如此。5) 对于数字钟,先编写数字钟输出时间的格式,具体语句是m_Date.Format(%4d年%4d月%4d日,year,month,day),m_Time.Format(%4d时%4d分%4d秒,hour,minute,second)。 6) 调用TextOut()对数字钟进行输出, pDC-TextOut(510,250,m_Time),510和250为输出所在位置的横纵坐标。3.3.2 显示时间程序先调用消息处理函数OnTimer()刷新窗口显示,即在void CGaoYingView:OnTimer(UINT nIDEvent)中添加如下代码 /ToDo:add your message handler code here and/or call defaultif(nIDEvent=1)second+;/秒增加if(second59)second=0;minute+;/分增加if(minute59)minute=0;hour+;/小时增加if(hour23)hour=0;day+;/日增加switch(month)case 1:/大月case 3:case 5:case 7:case 8:case 10:case 12: if(day31) day=1; month+;/月增加 break;case 4:/小月case 6:case 9:case 11: if(day30) day=1; month+;/月增加 break;case 2: if(year%4=0&day29)/润二月 day=1; month+;/月增加 if(year%4!=0&day28)/二月day=1;month+;break;if(month12)/年增加year+;month=1;SetGaoYing(hour,minute,second);Invalidate(false);然后通过调用获取程序设定的时间来实现时钟时间与程序设定的时间保持一致,如果想使时钟显示的时间与系统时间保持一致,则可以可以在时钟控制中选择系统时间复选框,它的实现需要在File View选项卡中的Source File资源组里面的SetTimeDlg.cpp中的CSetTimeDlg:CSetTimeDlg里面添加如下代码:if(m_CurrentTime)CTime Time = CTime:GetCurrentTime();/获取当前时间m_Day = Time.GetDay();m_Hour = Time.GetHour();m_Minute = Time.GetMinute();m_Month = Time.GetMonth();m_Second = Time.GetSecond();m_Year = Time.GetYear();elsem_Day=4;m_Hour=0;m_Minute=0;m_Month=7;m_Second=0;m_Year=2011; 3.3.3 修改时间要修改时间,需要在File View选项卡中的Source File资源组里面的GaoYingView.cpp中的CGaoYingView:OnSettime()里面添加如下代码:CSetTimeDlg SetDlg;if(SetDlg.DoModal()=IDOK)year=SetDlg.m_Year;month=SetDlg.m_Month; day=SetDlg.m_Day; hour=SetDlg.m_Hour; minute=SetDlg.m_Minute; second=SetDlg.m_Second;4. 结论与心得体会 通过近两周的摸索学习,我的课程设计总算有了圆满的结果,我所做的模拟时钟能显示指针式和数字式的时钟,且显示的时间既可以与程序设置的时间一致,也可以与计算机系统时间保持一致,还可以打开菜单项对当前的时间加以调整,并且有对时钟停动进行控制的按钮,整个页面简洁大方,方便用户读取,且操作简捷,符合课程设计中的各项要求。通过这次课程设计,我们对生活中常见的时钟的工作原理有了更深的了解,并且将书本中的知识更好地与实际生活中的应用结合在了一起。在这次拿到课设要求时,完全无从下手,因为C+在一年前学的,很多东西都已经忘记了,并且在Visual C+ 6.0环境下,编写MFC的Windows应用程序,这在以前从没做过,最后在图书馆借了书,在网上搜了类似的例子,这对本次课设的内容有了大致的了解,把找的程序程序加以修改,再加上自己想要的功能,我的程序的雏形就这样成型了,在程序的调试过程之中,可以说是困难重重,我花了两天的时间坐在电脑前修改程序,特别是对模拟时钟的绘制,更是此次对于模拟时钟设计过程中的重点,绘制的过程之中要考虑表盘坐标的定位,时钟的时针、分针和秒针的长短、粗细以及颜色的选取,以便指针重合时用户也可轻易辨认,还要考虑指针式的时钟与数字式的时钟与系统时间保持一致。本程序一个较难处理的地方是屏幕重绘,由于完全在OnDraw函数中实现,因此限制较多。我的程序采取了先覆盖,再重绘的方法。程序由于完全在OnDraw函数中实现,因此屏幕重绘较为麻烦。在不断的改正错误和调试的过程之中,所要求设计的模拟时钟总算是运行成功。通过这次课程设计,使我对课本上的知识在实际生活中的运用也有了进一步的了解,同时对MFC功能也有了一定的了解,与此同时,对C+语言的一些知识得到了强化学习。5. 参考文献1 揣锦华.面向对象程序设计与VC+实践.西安电子科技大学出版社,2005.2 吕凤翥. C+ 语言程序设计.电子工业出版社, 2011.3 李凤霞,薛静峰,黄都培.Visual C+6.0实用教程.电子工业出版社,2001.6. 思考题(1) 程序中如何实现时钟时间与计算机系统时间保持一致?答:程序是通过调用GetCurrentTime()来实现时钟时间与计算机系统时间保持一致,程序中的具体语句是CTime Time = CTime:GetCurrentTime()。(2) SetTimer()函数和KillTimer()函数的调用位置与程序运行的关系?答:SetTimer()函数和KillTimer()函数都参与了模拟时钟处理消息的过程,程序运行时首先调用SetTimer函数定义时钟消息,包括消息产生的时间间隔等;然后在相应的WM_TIMER消息处理里添加时钟消息响应代码;最后调用KillTimer释放该时钟。(3) 说明SetTimer()函数、WM_TIMER消息和OnTimer()函数的调用关系?答:MFC的Windows类提供了WM_TIMER消息处理函数OnTimer(),应在该函数内进行更新时间窗格的工作,利用ClassWizard给CmainFrame类加入WM_TIMER消息处理函数OnTimer(),CMainFrame: OnTimer()函数是在系统发给框架窗口消息WM_TIMER时调用的,在CMainFrame:OnCreate()函数内调用CWnd: SetTimer()以安装一个计时器,SetTimer()的第一个参数指定计时器的ID,第二个参数规定了计时器的时间间隔,如间隔是1s,则每隔1s就调用一次OnTimer()函数,第三个参数NULL表示由系统调用OnTimer()函数。(4) 实现数字钟时,设计到的编程有哪些?答:实现数字时钟时,设计到的编程有数字钟输出时间的格式,具体语句是m_Date.Format(%4d年%4d月%4d日,year,month,day),m_Time.Format(%4d时%4d分%4d秒,hour,minute,second)。调用TextOut()对数字钟进行输出。7. 附录7.1 调试报告程序界面设计与代码添加完毕后,就开始对该对程序进行调试,在调试的过程之中发现有如下错误:1) 程序添加完毕后,点击连接,发现提示PI未定义,于是在程序的头文件中增加#define PI 3.14159265。2) 在调试的过程中出现符号错误问题,经检查并修改后,错误提示消失。3)在调试的过程中会出现某些变量未定义,检查后发现是在添加代码的时侯变量名输错导致的。4)在程序成功运行后,发现时钟并不走,只有点击启动时钟后,指针式时钟和数字式时钟才运行,最后在void CGaoYingView:OnDraw(CDC*pDC)中添加如下代码后,时钟运行。if(mmm) SetTimer(1,1000,NULL);/此即为添加的部分,注意在此之前mmm要先定义为BOOL型CGaoYingDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/ToDo:add draw code for native data here pDC-SelectObject(n_MarkBrush);for(int i=0;iRectangle(pt.x-5,pt.y-5,pt.x+5,pt.y+5);/绘制整时刻点elsepDC-Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);/绘制整时刻点之外的刻度点/画时针pDC-SelectObject(m_HouPen);if(n_OldHour0!=n_Hour0)/用白色覆盖原位置时针pDC-SetROP2(R2_WHITE);pDC-MoveTo(n_OldHour0);pDC-LineTo(n_OldHour1);pDC-SetROP2(R2_COPYPEN);/时针绘制pDC-MoveTo(n_Hour0);pDC-LineTo(n_Hour1);else/时钟绘制pDC-MoveTo(n_Hour0);pDC-LineTo(n_Hour1);/画分针pDC-SelectObject(m_MinPen);if(n_OldMin0!=n_Minute0)/用白色覆盖原位置分针pDC-SetROP2(R2_WHITE);pDC-MoveTo(n_OldMin0);pDC-LineTo(n_OldMin1);pDC-SetROP2(R2_COPYPEN);/分针绘制pDC-MoveTo(n_Minute0);pDC-LineTo(n_Minute1);else/分针绘制pDC-MoveTo(n_Minute0);pDC-LineTo(n_Minute1);/用白色覆盖原位置秒针pDC-SelectObject(m_SecPen);pDC-SetROP2(R2_WHITE);pDC-MoveTo(n_OldSec0);pDC-LineTo(n_OldSec1);pDC-SetROP2(R2_COPYPEN);/秒针绘制pDC-MoveTo(n_Second0);pDC-LineTo(n_Second1);/数字时钟显示pDC-SelectStockObject(WHITE_BRUSH);pDC-Rectangle(450,300,700,130);pDC-TextOut(535,130,当前时间);CString m_Date,m_Time;m_Date.Format(%4d年%4d月%4d日,year,month,day);pDC-TextOut(510,170,m_Date);m_Time.F
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024新教材高中政治 第四课 只有坚持和发展中国特色社会主义才能实现中华民族伟大复兴 4.1 中国特色社会主义进入新时代说课稿 部编版必修1
- Unit 8 In the bathroom说课稿-2023-2024学年小学英语四年级下册教科版(EEC)
- 11《大家排好队》(教学设计)2023-2024学年统编版道德与法治二年级上册
- 感染复发预后研究-洞察及研究
- 7.2《快乐成长》(教学设计)-2024-2025学年三年级下册数学北师大版
- 1.2内环境的稳态教学设计-2024-2025学年高二上学期生物人教版选择性必修1
- 机械车间安全事故培训课件
- 2025年教师招聘之《小学教师招聘》试题1套附答案详解
- 2025年教师招聘之《小学教师招聘》考试题库(完整版)附答案详解
- 机械能课件教学课件
- 2025重庆市专业应急救援总队应急救援人员招聘28人考试参考题库及答案解析
- 2025年国际贸易业务员招聘考试试题集及答案
- 2025年建筑涂料采购专项合同
- 2025-2026学年人教版(2024)小学美术二年级上册(全册)教学设计(附目录P144)
- 智慧校园建设“十五五”发展规划
- 流管专员笔试题目及答案
- DBJ15 31-2016建筑地基基础设计规范(广东省标准)
- 第2课《树立科学的世界观》第2框《用科学世界观指导人生发展》-【中职专用】《哲学与人生》同步课堂课件
- 《照明线路安装与检修》一体化课件-第一章 职业感知与安全用电
- 2020年春统编版四年级语文下册第16课《海上日出》教学设计
- 自学考试国际商务谈判笔记精华
评论
0/150
提交评论