2022年用VC++制作模拟时钟应用程序 .pdf
-
资源ID:39694500
资源大小:1.22MB
全文页数:22页
- 资源格式: PDF
下载积分:4.3金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
2022年用VC++制作模拟时钟应用程序 .pdf
案例五模拟时钟应用程序以实例为背景学习基于MFC 的 WINDOWS 应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。用菜单选项或按钮设置时间和秒表。时间不必与机器系统时间相同,可任意设置。模拟时钟示意图1 编程要求(1)为该程序设计一个美观大方的图标。(2)程序界面设计合理,色彩得体大方,显示正确。(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。(4)各指针运动规律正确。为便于演示,时钟速度应比实际时间快 20 倍,即 1 小时相当于 3 分钟。(5)数字式时钟的时间显示与指针式时钟显示一致。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 22 页 -(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。(7)按下秒表控制按钮后,秒表显示窗中显示从0 开始的时间,单位为百分之一秒。再次按下秒表控制按钮后计时停止,该窗口显示累计时间。2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。指针运动算法和屏幕重绘方法是本程序主要难点所在。不论何种指针,每次转动均以/30 弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。计算指针端点(x,y)的公式如下:x=圆心 x 坐标+指针长度*cos(指针方向角)y=圆心 y 坐标+指针长度*sin(指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。采用一个定时器消息可以很容易实现指针联动算法。由于屏幕的重绘速度很快(50 ms 一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定指名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 22 页 -针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接绘制指针。另外,秒表需要采用单独的定时器消息控制。3 实现步骤(1)用 AppWizard 生成一个名为Clock 的单文档(SDI)程序框架。为了简化应用程序,在第四步时去掉Docking toolbar 和 Initial status bar 选择项,其他各选项均可用缺省设置。(2)编 辑 项 目 的 菜 单 资 源,在 主 框 架 窗 口 的 主 菜 单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。并在菜单属性项中设定“启动时钟”菜单的ID 标号为ID_START,“停止时钟”菜单的ID 标号为 ID_STOP,“时间设置”菜单的 ID 标号为 ID_SETTIME。为了简化菜单,可删除系统原有的“文件”、“编辑”菜单项。(3)利用ClassWizard 为视图类添加菜单命令处理函数。进入ClassWizard的 Message Maps选项卡,选择 Class Name项为 CClockView类,在Object IDs 列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下 Add Function 按钮添加成员函数。ClassWizard 会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart()、OnStop()和 OnSettime()。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 22 页 -(4)利用 ClassWizard为视图类添加定时器和鼠标消息处理函数。进入 ClassWizard 的 Message Maps 选项卡,选择Class Name 项为CClockView 类,在 Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息 WM_LBUTIONDOWN,按下 Add Function 按钮添加成员函数。ClassWizard 会添加相应的定时器和鼠标消息响应函数OnTimer 和OnLButtonDown。(5)使用 Developer Studio菜单的 Insert/Resource选项调出 Insert Source对话框,为项目添加新的对话框资源。在对话框属性中,修改对话框名为“时间设定”。在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件,如下图所示。对话框通过控件属性,将年、月、日、时、分、秒等编辑控件的ID 改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE和 IDC_SECOND。(6)设计好这个对话框模板后,利用 ClassWizard自动建立对话框类。进入 ClassWizard 后,它会发现已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 22 页 -弹出 New Class对话框,在 Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。(7)利用 ClassWizard为对话框类添加与各控件对应的数据成员。选择 MemberVariables选项卡,确保 Class Name项为对话框 CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable”按钮,为其添加对应成员变量,如表11.4 所示。表 11.4 编辑控件属性Control IDsVariable TypeMember variable nameVariable RangeIDC_YEARintm_Year03000IDC_MONTHintm_Month112IDC_DAYimtm_Day131IDC_HOURimtm_Hour023IDC_MINUTEintm_Minute059IDC_SECONDintm_Second059最后一列为变量取值范围。(8)编辑工程的图标资源,在 Resource View选项窗口中修改Icon结点所包含的主框架图标(IDR_MAINFRAME),修改标准图标(32像素 32 像素)及小图标(16 像素 16 像素),从而为该程序设计一个美观大方的图标。(9)完成以上工作后,即可修改程序框架,添加必要的代码。4 程序清单按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 22 页 -(1)添加表示年、月、日、时、分、秒的变量。int year;int month;int day;int hour;int minute;int second;(2)添加秒表的计数变量。int watch;(3)添加时钟的画笔及画刷变量。CPen m_HouPen,m_MinPen,m_SecPen;/各种针的画笔CBrush m_MarkBrush;/表盘标记的画刷(4)添加时钟控制变量。CPoint m_Center;/表的中心double m_Radius;/表的半径CPoint m_Hour 2,m_OldHour 2;/时针当前及前一次位置CPoint m_Minute 2,m_OldMin 2;/分针当前及前一次位置CPoint m_Second 2,m_OldSec 2;/秒针当前及前一次位置(5)添加秒表的两个按钮位置变量。CRect m_WatchStart;CRect m_WatchStop;(6)添加两个函数,计算时钟各指针位置。void SetClock(int hour,int minute,int second);CPoint GetPoint(int nLenth,int nValue);(7)在视图类构造函数中增加初始化语句:名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 22 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 22 页 -然后添加下列代码:名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 22 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 22 页 -绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表:在 OnDraw 函数中添加下面代码:名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 22 页 -/用白色覆盖原位置时针名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 22 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 22 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 22 页 -请注意将表示时间的整数转换为CString 字符串类型的方法以及秒表的显示方法。另外,watch 计数器以 1/100 秒为计数单位,每达到100则秒数加 1。u 按照下列步骤增加时钟控制代码:名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 22 页 -修改 Onstart 和 OnStop 函数,设置时钟运动消息。按比正常时钟快 20 倍的假定,50ms 产生一个消息。其代码为:修改 OnTimer 函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化,其代码为:名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 22 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 22 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 22 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 22 页 -添加时间设置对话框代码。首先在 ClockView.cpp 文件头部添加下列语句:#include“SetTimeDlg.H”在时间设定对话框类的构造函数中,做如下修改,将初始日期设为2010-7-10:名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 22 页 -最后,在 OnSettime函数中添加代码如下:名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 22 页 -至此,除秒表外,时钟部分程序设计完成。u 按以下步骤设计秒表控制程序:在 OnLButtonDown 函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:程序运行:下图显示了模拟时钟运行的情况。“启动”和“停止”框控制秒表,时钟用菜单控制。本题采用标准的SDI 程序结构,完全利用视图类实现了这一程序。利用定时器消息控制时钟运动是本程序的出发点。利用一个定时器控制时钟,易于实现指针联动规律。计算指针位置利用了坐标变换和三角函数的知识。本程序一个较难处理的地方是屏幕重绘,由于完全在 OnDraw函数中实现,因此限制较多。本程序采取了先覆盖,再重绘的方法。名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 22 页 -模拟时钟示意图本程序由于完全在OnDraw 函数中实现,因此屏幕重绘较为麻烦。如果在 OnDarw 函数中采用“异或”屏幕重绘方式,在程序窗口最大、最小化及移出屏幕时,会显示异常。解决这一问题较理想的方式是在定时器处理函数OnTimer 中采用“异或”方式直接重绘屏幕,而不采用调用 Invalidate()函数的方式;同时在OnDraw 函数中显示指针的最后状态,以便处理程序窗口最大、最小化及移出屏幕的情况。在OnTimer函数中直接重绘屏幕需要使用OClientDC 类,具体用法与 OnDraw 函数中的 pDC 对象基本一致。另外,本程序的数字时钟没有显示星期和农历,读者可尝试添加进去。名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 22 页 -