武汉理工大学《专业课程设计3》课程设计说明书
模拟时钟程序
1 基本功能描述
本次课程设计是基于面向对象的应用程序设计,主要运用C++语言在VC++开发环境下的MFC中编程实现。模拟时钟的基本功能是程序初始在屏幕上有一指针式时钟表盘,表盘为椭圆形,内部分布有12个刻度,表盘上有三个长度和颜色不同的时针分针和秒针,相互之间容易辨认,指针的运动通过数学推导之后以代码实现。表盘的下方是一个数字形式显示的数字钟,其显示时间的格式是时:分:秒,指针式时钟和数字式时钟显示的时间同步,且两个时钟所显示的时间与系统时间相致,页面的菜单项设有时间设置项,可以对所显示的时间进行调整,能进行调整的具体内容是年、月、日、时、分、秒。设计成功之后,此应用程序便可以起到时钟显示的作用。
2 设计思路
2.1 程序流程图
武汉理工大学《专业课程设计3》课程设计说明书
图1 模拟时钟程序流程图
2.2 程序流程分析
(1) 绘制指针式的时钟和数字式的时钟图形时,要在CView类下进行。其中OnDraw()函数在绘制视图窗口时被调用, 在定义了画刷CBrush和画笔CPen之后,调用GetClientRect()定义屏幕大小并确定椭圆中心的坐标,然后调用Ellipse绘制椭圆,即指针式的时钟表盘,SetTextColor绘制文本颜色,调用MoveTo和LineTo绘制表盘指针,同时调用CreateFont()创建数字钟字体,TextOut则是用以数字钟的文本输出。
(2) 模拟时钟处理消息的过程:首先调用SetTimer函数定义时钟消息,包括参数指定计时器的ID,消息产生的时间间隔,回调函数为NULL;调用消息处理函数OnTimer()刷新窗口显示。在相应的WM_TIMER消息处理里添加时钟消息响应代码;最后调用KillTimer释放该时钟。
(3) 要实现时钟的动态效果,即时间窗显示的时间每隔一秒钟更新一次,需要在时间窗格的正文调用CStatusBar::SetPaneText()函数。要定时更新,则应利用WM_TIMER消息,计时器每隔一定的时间间隔就会发出一个WM_TIMER消息,而这个时间间隔可由用户指定。MFC的Windows类提供了WM_TIMER消息处理函数OnTimer(),应在该函数内进行更新时间窗格的工作。先利用ClassWazard给CMainFrame类加入WM_TIMER消息处理函数OnTimer(),CMainFrame:: OnTimer()函数是在系统发给框架窗口消息WM_TIMER时调用
武汉理工大学《专业课程设计3》课程设计说明书
的,在CMainFrame::OnCreate()函数内调用CWnd::SetTimer()以安装一个计时器,使OnTimer()在设定的时间间隔被调用。
(4) 通过调用GetCurrentTime()函数来实现时钟时间与计算机系统时间保持一致,,在时间与计算机同步后,然后在File View选项卡中的Source File资源组里面的little1Doc.cpp中的void Clittle1Doc::OnEditSet()添加相应的变量以实现对时间的调整。
(5) 在程序设计过程之中添加“时钟控制”菜单,用菜单项控制弹出对话框设置时间,使时钟达到可调的效果。
(6) 程序运行正常,界面设置合理,指针式的时钟和数字式的时钟的运动达到任务书的要求,并且能用菜单项控制对话框以实现对当前时间的调整,程序达到各项功能之后,退出界面,程序结束。
3 软件设计
3.1 设计步骤
(1) 用AppWizard创建一个单文档的的MFC工程,将之命名为little1。所有步骤均使用AppWizard给出的默认设置。
(2) 编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。
图2 “时钟控制”菜单效果
(3)利用ClassWizard为视图类添加菜单命令处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为Clittle1View类,在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下Add Function按钮添加
武汉理工大学《专业课程设计3》课程设计说明书
成员函数。ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart ( )、OnStop ( )和OnSettime ( )。
(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为 Clittle1View类,在Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息WM_LBUTIONDOWN,按下Add Function按钮添加成员函数。ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。
(5)使用Developer Studio菜单的Insert / Resource…选项调出Insert Source对话框,为项目添加新的对话框资源。在对话框属性中,修改对话框名为“时间设定”。在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件,如下图所示。
图3 时间设置对话框
(6)设计好这个对话框模板后,利用ClassWizard自动建立对话框类。进入ClassWizard后,它会发现已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会弹出New Class对话框,在Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。
(7)利用ClassWizard为对话框类添加与各控件对应的数据成员。选择MemberVariables选项卡,确保Class Name项为对话框CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable…”按钮,为其添加对应成员变量,如表1所示。
表1 编辑控件属性
Control IDs IDC_YEAR IDC_MONTH IDC_DAY Variable Type Int Int Imt Member variable name m_Year m_Month m_Day Variable Range 0~3000 1~12 1~31 武汉理工大学《专业课程设计3》课程设计说明书
IDC_HOUR IDC_MINUTE IDC_SECOND 最后一列为变量取值范围。
Imt Int Int m_Hour m_Minute m_Second 0~23 0~59 0~59 (8)完成以上工作后,即可修改程序框架,添加必要的代码。在Clittle1View类中加入消息处理函数OnTimer(),OnEraseBkgnd()和OnCreate()并添加代码,在Clittle1View::OnDraw(CDC* pDC)中添加绘制时钟钟面、刻度、指针以及输出数字时钟的代码。
(9) 在头文件中添加对各种函数及变量的声明,同时在类的原文件中添加实现功能所需要的各种函数,并添加相应的代码。
(10) 对完成后的程序不断进行调试,分析并修改其中的错误,直到程序运行不再报错,并能够实现所要求的各项功能。
3.2 界面设计
模拟时钟的界面设计比较简单,如图3所示,只需6个编辑框和相应的6个静态文本框,由于显示的时间都是整数,所以控件的类型都选为int型,因而所需要设计的控件也比较简单,界面设计的控件表如表2所示。 控件序号 1 2 3 4 5 6 控件名称 年 月 日 时 分 秒 表2 界面控件表 控件类型 控件ID 编辑框(int) IDC_EDIT1 编辑框(int) IDC_EDIT2 编辑框(int) IDC_EDIT3 编辑框(int) IDC_EDIT4 编辑框(int) IDC_EDIT5 编辑框(int) IDC_EDIT6 相应变量 m_edit1 m_edit2 m_edit3 m_edit4 m_edit5 m_edit6 3.3 关键功能的实现
3.3.1 模拟时钟显示
模拟时钟的显示主要在于绘图这一方面,也是本次模拟时钟课程设计的重中之重。这一部分所要添加的代码在File View选项卡中的Source File资源组里little1View.cpp中:
(1) 首先要调用SetTimer()函数设置时间间隔,语句是SetTimer(1,1000,NULL),SetTimer()的第一个参数指定计时器ID为1,第二个参数规定了计时器的时间间隔为1000ms,即1s,这样,每隔1s就调用一次OnTimer()函数。