




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书模拟时钟程序1.基本功能描述WINDOWS系统自带时钟程序如图1所示,该系统时钟可以实现读取系统时间、显示日历、显示数字式时钟、动态化模拟指针式时钟运动情况、修改系统时间等功能。图1 WINDOWS系统自带时钟程序现要求模仿WINDOWS系统自带时钟程序,使用基于MFC的WINDOWS程序设计编写一个简易的指针式时钟程序,界面上包括数字式时钟、指针式时钟,可以实现对系统时间的修改与再定义。具体要求包括以下三点:1)数字式时钟显示格式为二十四进制“时:分:秒”,如“19:09:56”,显示时间随系统时间变化跳变且与指针式时钟同步,显示字
2、体格式为Times New Roman。2)指针式时钟包含均匀分布的十二个刻度点、时/分/秒三指针,具体表盘形式可自由设计,要求时钟样式得体、易于辨认。同理,要求指针位置随系统时间变化运动且与数字式时钟同步。3)包含修改系统时间菜单项,可在弹出对话框中修改并再定义系统时间。该对话框弹出时,数字式时钟与指针式时钟不停止跳变(与WINDOWS系统自带时钟程序一致)。2.设计思路使用基于MFC的WINDOWS程序设计来编写上述模拟时钟程序,基本程序流程图后页图2所示。武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书分析设计要求易
3、知,程序主题部分应在CView类OnDraw( )函数中。下面对上页程序流程图中关键步骤作出简要分析说明:1)要实现时钟程序的显示及同步跳变,实质上是在实现每隔一秒定时刷新屏幕重新绘图。OnCreate( )函数创建计时器并定义计时间隔为一秒,OnTimer( )函数作计时器的消息处理函数用于通知OnDraw( )函数重新绘图。其中,SetTimer( )函数定义计时器,然后在相应的WM_TIMER消息处理里添加时钟消息响应代码,最后调用KillTimer( )释放该时钟。2)指针式时钟与数字式时钟部分均在CView类OnDraw( )函数中实现。指针式时钟部分由GetClientRect(
4、)函数获取用户区后定义用户区中心点(CenterX,CenterY),取该中心点为指针式时钟表盘中心。使用Ellipse( )函数绘制表盘,MoveTo( )函数和LineTo( )函数绘制钟面刻度和指针。数字式时钟以文本形式输出,CreateFont( )创建数字钟、TextOut( )输出数字钟。3)通过GetCurrentTime( )函数获取当前系统时间,控制指针式时钟和数字式时钟的输出情况。其中,对指针式时钟的输出控制通过角度变量radius实现,以分针为例,定义角度变量radius=(double)Time.GetMinute()+(double)Time.GetSecond()/
5、60.0)*6.28/60.0则,分针从表盘中心点(CenterX,CenterY)指向点(CenterX+R*sin(radius),CenterY-R*cos(radius),这里R为分针针长自定义值;对数字式时钟的输出控制则由通过文本输出的格式指定,使用语句string.Format(%d:%02d:%02d,Time.GetHour(),Time.GetMinute(),Time.GetSecond()即可实现输出值的一一对应。4)当修改系统时间时,首先要做的是创建一个新的类CInputDlg并把修改时间弹出对话框中几个编辑框参数对应为该类下成员,之后通过类向导创建CDoc类下对应修改
6、时间按钮ID值的成员函数OnEditSet( ),然后使用GetLocalTime( )函数获取本地时间、赋值语句如system.wSecond=inputDlg.m_editsecond等修改时间、SetLocalTime( )函数重置本地时间。最后,UpdateAllViews(NULL)更新全部窗口,实现时间修改。3.软件设计3.1 设计步骤1)使用VC+6.0创建MFC 应用程序的工程,定义项目名称为fengwanlin。单击确认后在稍后弹出的MFCAppWizard-Step 1对话框中选择应用程序的类型为单个文档,其它选项使用默认选项。武汉理工大学专业课程设计2(面向对象程序设计)
7、课程设计说明书2)使用建立类向导对话框在类CfengwanlinView中添加消息处理函数OnCreate( )、OnTimer( ),具体操作如下图3所示。图3 添加消息处理函数OnCreate( )、OnTimer( )3)为CfengwanlinView类中OnCreate( )、OnTimer( )函数添加相应的计时器创建与计时器消息处理函数代码。为该类中OnDraw( )函数添加相应绘图操作的控制代码,包括指针式时钟表盘绘制代码、指针式时钟三指针绘制代码、数字式时钟文本输出控制代码。图4 添加“重新设定时间”菜单选项4)在ResourseView选项卡中浏览MFC单文档应用程序的Me
8、nu菜单设置情况,并在主菜单IDR_MAINFRAME中添加“重新设定时间”选项,定义其ID值为IDC_EDIT_SET。武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书如图4所示。5)在ResourseView选项卡中反键单击Dialog资源组,选择Insert Dialog创建对话框最为重新设定时间时的对应弹出对话框,如下图5所示。图5 Insert Dialog创建对话框双击新创建的对话框IDD_DIALOG1,设计对话框界面风格,使包括修改系统时间年、月、日、时、分、秒六个编辑框,如下图6。编辑这六个编辑框的属性,使控制ID分别为IDC_EDITyear、IDC_EDITm
9、onth、IDC_EDITday、IDC_EDIThour、IDC_EDITminute、IDC_EDITsecond。图6 重新设定时间弹出对话框6)使用类向导创建新的类CInputDlg,为该类添加六个成员变量分别对应到上步骤中六个编辑框中的输入变量。7)使用类向导在CFengwanlinDoc中添加重新设定时间菜单选项所对应的成员函数,具体步骤如图7所示,函数名为OnEditSet( )。武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书图7 为CDoc类添加成员函数OnEditSet( )在OnEditSet( )函数中添加代码实现对系统时间的修改操作。这里要注意的是,由于会
10、调用到CInputDlg类的变量,要在fengwanlinDoc.cpp文件中添加对该类对应头文件的调用语句:#include “InputDlg.h”。8)调试文件,试运行软件观察能否实现目标功能。3.2 界面设计图8 模拟时钟程序主界面武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书如图8所示,模拟时钟程序的主界面设计上数字式时钟在上、指针式时钟在下,以整个客户区的中心位置作指针式时钟表盘中心。指针式时钟表盘呈圆形,时、分、秒三指针以颜色、粗细区分,表盘刻度模拟手表表盘以简洁的实线段标识。具体情况如下表1。表1 指针式时钟界面设计自定义变量数字式时钟显示格式为二十四进制“时:分
11、:秒”,字体颜色为黑色,字体为新罗马体Times New Roman。如第5页图6所示为重新设定时间弹出对话框设计方案,该对话框中自定义的内容包含的六个静态文本和六个编辑框,其中编辑框控件的主要参数对应情况如下表2所示。表2 重新设定时间编辑框控件的主要参数3.3 关键功能的实现1)指针式时钟的实现指针式时钟的主要实现代码在fengwanlinView.cpp文件中,其中大部分为绘图控制的代码在OnDraw( )函数中、计时器的创建在OnCreate( )函数中、计时器的消息处理函数在OnTimer( )函数中。下面将分步解析:武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书a)O
12、nCreate( )函数中语句SetTimer(1,1000,NULL);的意义为指定计时器ID为1,且规定计时器的时间间隔为1000ms,即每隔1s调用一次OnTimer( )函数。而OnTimer( )函数中语句UpdateWindow();的作用是更新窗口、重绘时钟,故而,综合两函数得到的结果是每隔1s窗口即时重绘一次,实现时钟显示值的实时更新。b)OnDraw( )函数中首先调用的是GetClientRect(&Rect);语句,该语句作用是获取客户区。在获取客户区后随即定义客户区中心位置作为指针式时钟表盘中心:int CenterX=Rect.right/2; int CenterY
13、=Rect.bottom/2;c)使用语句Ellipse(CenterX-100,CenterY-100,CenterX+100,CenterY+100);绘制指针式时钟的表盘,该语句通过确定椭圆外接矩形的两对角点坐标值绘制椭圆,这里的设置值使得两点相对中心点的增量互为相反数,故可得半径100个像素的圆形轨迹。d)定义角度变量radius=(double)i*2*3.14/12.0,其中i值从1取到12,恰对应十二个刻度线的角度值。在绘制每一刻度线时使用MoveTo( )、LineTo( )语句画实线段:pDC-MoveTo(CenterX+(int)(double)70*sin(radius
14、),CenterY-(int)(double)70*cos(radius); pDC-LineTo(CenterX+(int)(double)97*sin(radius),CenterY-(int)(double)97*cos(radius);e)同理,在绘制指针时以角度值为控制变量。先使用语句CTime Time=CTime:GetCurrentTime();获取当前系统时间,随后重定义角度变量radius,以分针为例,绘制语句为:radius=(double)Time.GetMinute()+(double)Time.GetSecond()/60.0)*6.28/60.0;pDC-Move
15、To(CenterX,CenterY);pDC-LineTo(CenterX+(int)(double)80*sin(radius),CenterY-(int)(double)80*cos(radius);要说明的是,这里画笔的起点定义为客户区中心点,80为分针针长。2)数字式时钟的实现数字钟以文本形式输出,基本思想是将获取的系统时间赋给输出的文本。定义输出格式为string.Format(%d:%02d:%02d,Time.GetHour(),Time.GetMinute(),Time.GetSecond();即可实现二十四进制“时:分:秒”的基本输出形式。Font.CreateFont(
16、)定义文本输出的大小、字体、颜色等,语句pDC-TextOut(CenterX-(size.cx/2),CenterY-135-(size.cy/2),string);决定文本输出的位置,即数字时钟的摆放位置。3)修改系统时间操作的实现武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书这一部分代码添加在void CFengwanlinDoc:OnEditSet( )中,:GetLocalTime(&system);语句实现获取本地时间,其后,形如system.wSecond=inputDlg.m_editsecond;的语句实现将编辑框内输入的整型数值赋给变量system。最后语句:
17、SetLocalTime(&system);用system的值重置本地时间,语句UpdateAllViews(NULL);通知全部窗口重绘,完成重置。4.结论与心得体会这次设计的选题是设计一个模拟时钟,我之所以选择了这个题目是因为这个设计与我们的生活息息相关,也能帮助我了解生活中运用到程序设计的地方。起初听老师的思路指导后认为这个程序会很简单,但是理想与现实的差距总是很遥远。个性略显急躁的我在编程时本就缺乏耐心和细心,东漏一个头文件、西错一个符号,丢三落四地有时一个小小的分号敲成了逗号就使程序报错无法运行。这次课程设计是我的第二次设计,相对于上一次,我觉得这次的设计远比上次实用。说实话,其实在
18、理论课程的学习中,我对面相对象的程序设计把握并不扎实,很多知识点都模模糊糊的、勉强应付考试。可是通过这次课程设计,我把一些学到的知识重新钻研了一遍,也将这些抽象的、纸上谈兵的知识点实际运用到这次课程设计的制作中。贴近生活的选题也从另一个层面上让我认识到,原来这些书上的例题可以变成这么些生活中常用的程序。这让我因为本学科课程难度而略减的兴趣又浓厚了起来。总的来说,从这件小小的设计成果我体会到了作为了一名计算机编程方面的工作者的工作流程的重要性、心思缜密的必要性,也初次让我体味到了看到自己设计成果时的兴奋和自豪。同时,这次课程设计也让我对课堂上的知识更加理解,在帮助我精益求精地复习揣摩书本知识的同
19、时也锻炼了我自我学习自我搜索知识的能力,我在课程设计期间还充分运用了网络和图书馆里的资源,参考了许多作品和相关编程知识,这无疑也让我不只会做了一个模拟时钟,而是让我对更多的程序设计有了初步的概念,能为将来的学习工作打下良好的基础,颇有收益。5.参考文献1 揣锦华.面向对象程序设计与VC+实践.西安电子科技大学出版社,2005.2 肖宏伟.VisualC+6.0实效编程百例.人民邮电出版社,2002.3 王小茹,丁亚,李鹏.VisualC+6.0实例解析.北京大学出版社,2000.6.思考题武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书1)程序中如何实现时钟时间与计算机系统时间保持
20、一致?使用CTime Time=CTime:GetCurrentTime();语句,这里GetCurrentTime( )函数获取系统时间之后赋给Time,再通过Time即时控制时钟输出、保证时钟时间与系统时间一致。2)SetTimer()函数和KillTimer()函数的调用位置与程序运行的关系?SetTimer( )函数作用是定义时钟消息,设定消息产生的时间间隔。KillTimer( )函数作用是释放时钟。程序运行时首先调用SetTimer( )函数设定消息产生间隔为1秒,然后在相应的WM_TIMER消息处理里添加时钟消息响应代码,最后调用KillTimer( )函数释放时钟。3)说明Se
21、tTimer( )函数、WM_TIMER消息和OnTimer( )函数的调用关系?OnCreate( )函数中调用SetTimer( )以安装计时器,SetTimer( )的第一个参数指定计时器ID,第二个参数规定计时时间间隔1s,即每隔1s调用一次OnTimer( ),第三个参数NULL表示由系统调用OnTimer( )函数。另一方面,Windows类提供WM_TIMER消息处理函数OnTimer( )函数,在该函数内进行更新时间窗格的工作。利用类向导加入OnTimer( )消息处理函数后,OnTimer( )函数在系统发给WM_TIMER时产生调用。4)实现数字钟时,设计到的编程有哪些?s
22、tring.Format(%d:%02d:%02d,Time.GetHour(),Time.GetMinute(),Time.GetSecond();语句设定输出形式,而Font.CreateFont( )语句则定义文本输出的大小、字体、颜色等,语句pDC-TextOut(CenterX-(size.cx/2),CenterY-135-(size.cy/2),string);决定文本输出的位置,即数字时钟的摆放位置。7.附录7.1 调试报告1)报错客户区自定义名Rect未定义,检查发现定义语句“RECT rect;”定义的客户区命名与后方调用不一致,故修改为“RECT Rect;”。2)报错提
23、示sin和cos未定义,分析后发现头文件加到了“#include stdafx.h”前不会发生调用,故将程序的头文件“#include math.h”后移。3)程序代码添加完毕后程序可运行,但指针式时钟指针显示位置存在90度偏差,判断是由于编写计算公式时未考虑逻辑坐标系与客户区客观坐标系的偏差导致。以分针为例,修改前代码为:武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书radius=(double)Time.GetMinute()+(double)Time.GetSecond()/60.0)*6.28/60.0;pDC-SelectObject(&MPen);pDC-MoveTo
24、(CenterX,CenterY);pDC-LineTo(CenterX+(int)(double)80*cos(radius),CenterY+(int)(double)80*sin(radius); 修改后代码为:radius=(double)Time.GetMinute()+(double)Time.GetSecond()/60.0)*6.28/60.0;pDC-SelectObject(&MPen);pDC-MoveTo(CenterX,CenterY);pDC-LineTo(CenterX+(int)(double)80*sin(radius),CenterY-(int)(doubl
25、e)80*cos(radius);这里修改的是指向点的计算公式,基本思想是转换逻辑坐标。或者如下所示另一修改方法,修改对角度变量的定义式,补齐90度的角度差值:radius=-3.14/2.0+(double)Time.GetSecond()*6.28/60.0;pDC-SelectObject(&MPen);pDC-MoveTo(CenterX,CenterY);pDC-LineTo(CenterX+(int)(double)80*cos(radius),CenterY+(int)(double)80*sin(radius);7.2 测试结果程序可以实现同步系统时间、数字形式输出系统时间、模
26、拟指针式时钟输出系统时间、修改系统时间,基本测试情况如图9、图10所示。图9 测试模拟时钟程序功能(一)武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书图10测试模拟时钟程序功能(二)可见,设计的程序能准确地完成任务目标要求。7.3 关键源代码1)创建计时器:int CFengwanlinView:OnCreate(LPCREATESTRUCT lpCreateStruct) 2)计时器的消息处理函数:void CFengwanlinView:OnTimer(UINT nIDEvent)if (CView:OnCreate(lpCreateStruct) = -1) return
27、-1; / TODO: Add your specialized creation code here SetTimer(1,1000,NULL); return 0; / TODO: Add your message handler code here and/or call default InvalidateRect(NULL,true); UpdateWindow();/更新窗口,重绘时钟 CView:OnTimer(nIDEvent);武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书3)OnDraw( )函数绘图部分:void CFengwanlinView:OnDraw
28、(CDC* pDC)CFengwanlinDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here/获取客户区并定义客户区中点位置RECT Rect; GetClientRect(&Rect); int CenterX=Rect.right/2; int CenterY=Rect.bottom/2; /绘制指针时钟 /绘制钟面 CPen Pen(PS_SOLID,4,RGB(0,0,0); pDC-SelectObject(&Pen);pDC-Ellipse(CenterX
29、-100,CenterY-100,CenterX+100,CenterY+100);/绘制刻度线double radius; int i; for(i=1;iSelectObject(&Pen);pDC-MoveTo(CenterX+(int)(double)70*sin(radius),CenterY-(int)(double)70*cos(radius); pDC-LineTo(CenterX+(int)(double)97*sin(radius),CenterY-(int)(double)97*cos(radius); /绘制指针CTime Time=CTime:GetCurrentTi
30、me();CPen HPen(PS_SOLID,8,RGB(0,0,255);/定义时针画笔,蓝色 CPen MPen(PS_SOLID,6,RGB(255,0,255);/定义分针画笔,紫色 13武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书CPen SPen(PS_SOLID,2,RGB(0,0,0);/定义秒针画笔,黑色/时针 radius=(double)Time.GetHour()+(double)Time.GetMinute()/60.0+(double)Time.GetSecond()/3600.0)*6.28/12.0;);/分针radius=(double)Ti
31、me.GetMinute()+(double)Time.GetSecond()/60.0)*6.28/60.0; pDC-SelectObject(&HPen); pDC-MoveTo(CenterX,CenterY); pDC-LineTo(CenterX+(int)(double)50*sin(radius),CenterY-(int)(double)50*cos(radius)pDC-SelectObject(&MPen););/秒针radius=(double)Time.GetSecond()*6.28/60.0; pDC-MoveTo(CenterX,CenterY); pDC-Li
32、neTo(CenterX+(int)(double)80*sin(radius),CenterY-(int)(double)80*cos(radius)pDC-SelectObject(&SPen););/绘制数字时钟CString string; CSize size; pDC-MoveTo(CenterX,CenterY); pDC-LineTo(CenterX+(int)(double)90*sin(radius),CenterY-(int)(double)90*cos(radius)CFont Font,*pOldFont;string.Format(%d:%02d:%02d,Time
33、.GetHour(),Time.GetMinute(),Time.GetSecond(); int wide=25,high=40; do if(Font.GetSafeHandle()!=NULL) 14武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书Font.DeleteObject(); Font.CreateFont(high,wide,0,0,FW_DONTCARE,0,0,0,ANSI_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,Times New Roman);pOldFont=pDC-SelectObject(&Fon
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年农村住宅设计与装修合同范本
- 2025金融服务合同协议
- 2024年发电机油投资申请报告代可行性研究报告
- 2025年房屋租赁合同范本模板
- 2025版权使用权转让的合同范本
- 2025音乐制作人聘用合同范本
- 2025茶叶购销合同范本茶叶购销合同
- 2025金属热处理合同
- 2025租赁合同范本协议
- 《创业与创新管理》课件
- 工程造价咨询服务投标方案(专家团队版-)
- 2024年广东省中考生物+地理试卷(含答案)
- 苏园六纪简介及解说词
- 陕西房改工作文件汇编
- (含图纸)啤酒废水处理工程(UASB-CASS工艺)毕业设计_优秀完整版
- 第二章导体周围的静电场
- 和利时DCS控制系统组态
- 05S502阀门井图集
- 光电子学(第三章2)
- 【课件】第9课 美在民间——中国民间美术——剪纸课件-高中美术人教版(2019)美术鉴赏
- 幼儿园幼儿花名册
评论
0/150
提交评论