电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

用vc++制作 模拟时钟应用程序

22页
  • 卖家[上传人]:第***
  • 文档编号:35056448
  • 上传时间:2018-03-08
  • 文档格式:DOC
  • 文档大小:605KB
  • / 22 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、案例五 模拟时钟应用程序 以实例为背景学习基于 MFC 的 WINDOWS 应用程序设计,编写 一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两 个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的 时间一致,下方的矩形框作为秒表。用菜单选项或按钮设置时间和秒 表。时间不必与机器系统时间相同,可任意设置。 模拟时钟示意图 1 编程要求 (1)为该程序设计一个美观大方的图标。 (2)程序界面设计合理,色彩得体大方,显示正确。 (3)时针、分针和秒针形象美观,即使各指针重合也可辨认。 (4)各指针运动规律正确。为便于演示,时钟速度应比实际时间 快 20倍,即 1小时相当于 3分钟。 (5)数字式时钟的时间显示与指针式时钟显示一致。(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前 的时间和日期。 (7)按下秒表控制按钮后,秒表显示窗中显示从 0开始的时间, 单位为百分之一秒。再次按下秒表控制按钮后计时停止,该窗口显示 累计时间。 2 问题分析 本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、 定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字

      2、等。 指针运动算法和屏幕重绘方法是本程序主要难点所在。 不论何种指针,每次转动均以/30 弧度(一秒的角度)为基本 单位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如下: x =圆心 x坐标 + 指针长度 * cos (指针方向角) y =圆心 y坐标 + 指针长度 * sin (指针方向角) 注意,指针长度是指自圆心至指针一个端点的长度(是整个指针 的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端 点。 三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分 针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指 针的运动。若用三个定时器消息分别处理时针、分针和秒针的运动, 就会使问题复杂化且不易实现三个指针联动的正确规律。采用一个定 时器消息可以很容易实现指针联动算法。由于屏幕的重绘速度很快(50 ms 一次),如果采用全屏删除式 重绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假 定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针 以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如 果指针没有动,则直接绘制指针。 另

      3、外,秒表需要采用单独的定时器消息控制。 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,在 Messa

      4、ges 列表框中选择 COMMAND,按下 Add Function 按钮 添加成员函数。ClassWizard 会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数 OnStart ( )、OnStop ( )和 OnSettime ( )。 (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 对话框,为项目添加新的对话框资源。在对话框属性中, 修改对话框名为“时间设定”。在对话框中增加用来输入年、月、日、 时、分、秒的

      5、编辑框控件,如下图所示。对话框 通过控件属性,将年、月、日、时、分、秒等编辑控件的 ID 改为 IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE 和 IDC_SECOND。(6)设计好这个对话框模板后,利用 ClassWizard 自动建立对话 框类。进入 ClassWizard 后,它会发现已建立的对话框模板资源,并弹 出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮, 会弹出 New Class 对话框,在 Name 栏填写对话框类的名称 CSetTimeDlg 后按“OK”按钮,即可为对话框创建一个对应的类。 (7) 利用 ClassWizard 为对话框类添加与各控件对应的数据成员。 选择 MemberVariables 选项卡,确保 Class Name 项为对话框 CSetTimeDlg 类,然后在选项卡下方的窗口中选择各控件的 ID 并按下 “Add Variable”按钮,为其添加对应成员变量,如表 11.4所示。 表 11.4 编辑控件属性 Control IDs Variable Type Member var

      6、iable name Variable Range IDC_YEAR int m_Year 03000 IDC_MONTH int m_Month 112 IDC_DAY imt m_Day 131 IDC_HOUR imt m_Hour 023 IDC_MINUTE int m_Minute 059 IDC_SECOND int m_Second 059最后一列为变量取值范围。 (8)编辑工程的图标资源,在 Resource View 选项窗口中修改 Icon 结点所包含的主框架图标(IDR_MAINFRAME),修改标准图标 (32像素32像素)及小图标(16像素16像素),从而为该程序 设计一个美观大方的图标。 (9)完成以上工作后,即可修改程序框架,添加必要的代码。4 程序清单 按以下步骤向视图类(CClockView)添加下列数据成员及成员函 数。 (1) 添加表示年、月、日、时、分、秒的变量。 int year; int month; int day; int hour; int minute; int second; (2) 添加秒表的计数变量。 int watch; (

      7、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) 在视图类构造函数中增加初始化语句:然后添加下列代码: 绘制表盘上的标记、时针、分针

      8、和秒针,并显示数字时钟及秒表: 在 OnDraw 函数中添加下面代码:/ 用白色覆盖原位置时针 请注意将表示时间的整数转换为 CString 字符串类型的方法以及秒 表的显示方法。另外,watch 计数器以 1/100 秒为计数单位,每达到 100则秒数加 1。 u 按照下列步骤增加时钟控制代码: 修改 Onstart 和 OnStop 函数,设置时钟运动消息。按比正常时 钟快 20倍的假定,50ms 产生一个消息。 其代码为: 修改 OnTimer 函数,正确计算并处理年、月、日、时、分、秒等变 量的联动变化 ,其代码为: 添加时间设置对话框代码。 首先在 ClockView. cpp 文件头部添加下列语句: #include “SetTimeDlg. H” 在时间设定对话框类的构造函数中,做如下修改,将初始日期设 为 2010-7-10:最后,在 OnSettime 函数中添加代码如下:至此,除秒表外,时钟部分程序设计完成。 u 按以下步骤设计秒表控制程序: 在 OnLButtonDown 函数中增加下列内容,以便响应单击秒表启动、 停止框所发出的消息: 程序运行: 下图显示了模拟

      9、时钟运行的情况。“启动”和“停止”框控制秒 表,时钟用菜单控制。 本题采用标准的 SDI 程序结构,完全利用视图类实现了这一程序。 利用定时器消息控制时钟运动是本程序的出发点。利用一个定时器控 制时钟,易于实现指针联动规律。计算指针位置利用了坐标变换和三 角函数的知识。本程序一个较难处理的地方是屏幕重绘,由于完全在OnDraw 函数中实现,因此限制较多。本程序采取了先覆盖,再重绘的 方法。模拟时钟示意图本程序由于完全在 OnDraw 函数中实现,因此屏幕重绘较为麻烦。 如果在 OnDarw 函数中采用“异或”屏幕重绘方式,在程序窗口最大、 最小化及移出屏幕时,会显示异常。解决这一问题较理想的方式是在 定时器处理函数 OnTimer 中采用“异或”方式直接重绘屏幕,而不采 用调用 Invalidate ( )函数的方式;同时在 OnDraw 函数中显示指针的最 后状态,以便处理程序窗口最大、最小化及移出屏幕的情况。在 OnTimer 函数中直接重绘屏幕需要使用 OClientDC 类,具体用法与 OnDraw 函数中的 pDC 对象基本一致。另外,本程序的数字时钟没有 显示星期和农历,读者可尝试添加进去。

      《用vc++制作 模拟时钟应用程序》由会员第***分享,可在线阅读,更多相关《用vc++制作 模拟时钟应用程序》请在金锄头文库上搜索。

      点击阅读更多内容
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.