c++模拟时钟实验报告

上传人:pu****.1 文档编号:552733669 上传时间:2023-02-16 格式:DOC 页数:43 大小:536.50KB
返回 下载 相关 举报
c++模拟时钟实验报告_第1页
第1页 / 共43页
c++模拟时钟实验报告_第2页
第2页 / 共43页
c++模拟时钟实验报告_第3页
第3页 / 共43页
c++模拟时钟实验报告_第4页
第4页 / 共43页
c++模拟时钟实验报告_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《c++模拟时钟实验报告》由会员分享,可在线阅读,更多相关《c++模拟时钟实验报告(43页珍藏版)》请在金锄头文库上搜索。

1、集中上机实习报告指导教师:王利姓 名:赵蕊学号:2010211864班级:0411003时间:2012.5模拟时钟程序一 需求分析1.题目内容:编写一个模拟时钟程序,此程序在屏幕左方有一指针式钟面,右方 有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示 的时间一致,下方的矩形框作为秒表。用菜单选项或按钮设置时间和秒 表。时间不必与机器系统时间相同,只要可任意设置即可。 2.题目分析:(1)模拟时钟是一种集计时器和时钟显示于一体的程序。编写一 个指针式时钟程序,此程序在屏幕左方有一个指针式钟面,右方有两个 矩形框,上面以数字方式显示日期、星期和时间。指针式的时钟表盘为 圆形,并且圆

2、周上有分布均匀的 60 个刻度,刻度要求显示清楚,钟面 上有长度不相同的指针,即时针、分针、秒针,指针的运动要求具有规 律性,且为顺时针。数字钟显示时间的格式是年月日星期时分秒,小时 为 24 进制,分钟和秒是60 进制,指针式的时钟和数字式的时钟显示的 时间同步。按下时钟控制设置时间菜单项可弹出一对话框,用于设置当 前的时间、日期和星期;按下秒表控制按钮后,秒表显示窗中显示从0 开始的时间,单位为百分之一秒。再次按下秒表控制按钮后计时停止, 该窗口显示累计时间。(2) 本实验主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方 法、定时器消息、鼠标消息、菜单命令、对话框、画笔 /画刷、显示文

3、字等。指针运动算法和屏幕重绘方法是本程序主要难点所在。3.最终效果如下图:二概要设计1.程序系统模块划分60东部图401 功能模块图西部北部20第一季度 第三季度2.程序算法分析本程序不论何种指针,每次转动均以兀/30弧度(一秒的角度)为基 本单位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如 下:x =圆心 x 坐标 + 指针长度 * cos (指针方向角)y =圆心 y 坐标 + 指针长度 * sin (指针方向角)指针长度是指自圆心至指针一个端点的长度,由于指针要跨越圆心 因此一个指针需要计算两个端点。三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针 每转 12

4、格引起时针运动一格,而因此应该使用一个定时器消息来处理 指针的运动。若用三个定时器消息分别处理时针、分针和秒针的运动, 就会使问题复杂化且不易实现三个指针联动的正确规律。采用一个定时 器消息可以很容易实现指针联动算法。由于屏幕的重绘速度快,如果采用全屏删除式重绘则闪烁十分明显 显示效果不佳。本程序采用非删除式重绘,假定指针将要移动一格,则 先采用表盘背景色(这里为浅绿色)重绘原来指针以删除原来位置的指 针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接 绘制指针。另外,秒表需要采用单独的定时器消息控制,秒表重绘速度很快,屏幕闪烁明显,故本程序采用了双缓冲绘图。3.系统流程图三 详细

5、设计1模块描述(1)指针式时钟指针式的时钟表盘为圆形,并且圆周上有分布均匀的12 个数字刻 度和 48 个较小的原点刻度,刻度显示清楚,用来表示小时、分钟和秒 数。钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动 具有规律性,为顺时针。2)数字式时钟数字钟显示时间的格式是时分秒,小时为 24 进制,分钟和秒是 60进制,指针式的时钟和数字式的时钟显示的时间同步,且俩时钟可以3)秒表按下秒表控制按钮后,秒表显示窗中显示从0 开始的时间,单位为百分之一秒。再次按下秒表控制按钮后计时停止,该窗口显示累计时间。2函数描述(1) CPoint p;double angle = nvalue *P

6、I/30 ;p.x = m_Center.x + (int)(nlenth*sin(angle);p.y = m_Center.y - (int)(nlenth*cos(angle); return p;用来得到时钟刻度点和时针、分针、秒针的端点(2) hour = hour*5;hour = hour + minute/12;m_OldHour0 = m_Hour0;m_OldHour1 = m_Hour1;m_Hour0 = GetPoint(int(m_Radious/2),hour);m_Hour1 = GetPoint(7,hour + 30);m_OldMin0 = m_Minut

7、e0;m_OldMin1 = m_Minute1;m_Minute0 = GetPoint(int(m_Radious*7/10),minute);m_Minute1 = GetPoint(10,minute + 30);m_OldSec0 = m_Second0;m_OldSec1 = m_Second1;m_Second0 = GetPoint(int(m_Radious*8/10),second);m_Second1 = GetPoint(30, second + 30);用来得到时针、分针、秒针的当前位置和上一时刻位置并将其保存(3) CRect rc;CDC dcMem;GetCli

8、entRect(&rc);CBitmap bmp;dcMem.CreateCompatibleDC(pDC);bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height();CBitmap *pOldBit=dcMem.SelectObject(&bmp); dcMem.FillSolidRect(rc,RGB(255,255,255);./画图代码 pDC-BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY)dcMem.DeleteDC();bmp.DeleteObject();利用双缓冲防止屏

9、幕画面闪烁四 实现环境及工具Win7 环境下VC+ 6.0 MFC五 程序测试1. 对时间设置测试按下确定后测试其设置为需要设置的时间,并正常运行。2. 对秒表测试00:04:33启动停止点下启动后它正常运行;点下停止后它停止运行并记录当前累积时间。再次按下启动按钮时它计时清零并重新开始计时。3. 整体 3 部分测试同时运行时三部分均正常运行,并且屏幕也不闪烁。六心得体会通过本次实验,对C+编程有了进一步的了解和能够更加熟练的 编程,还学习了MFC的一些画图处理函数,以及一些运行机理,能够基 本掌握用MFC画图,且能够实现一些基本的功能。在本次设计的初期,只实现了小部分功能,对画图及其不了解,

10、且 对窗口设置的不合理倒是画面相当丑陋,后来通过请教同学、老师、上 网查资料,最终设计出比较满意的画面。还有,本次设计的秒表设计,由于它的刷新频率太高,导致屏幕闪 烁严重,画面看起来很不舒畅,后面经查资料发现双缓冲技术能够解决 这一问题,也将这个问题成功解决。觉得本次设计中的采用不同的计时器来控制不同的模块效果比较 好,对每一模块进行独立的控制很短单,而且思路清晰。总之在本次实验中我学到了很多知识,而且培养了自己的自学能力 逼着自己进行查阅大量的资料。在本次实验中自己对程序一直修改,一 直增加功能和改善画面,大大的提高了自己的动手能力。附:源代码及详细注释 (由于使用的 MFC 向导形成工程只

11、附 部分核心代码)在蜀ClockView.h 中力口publiC:int year;int month;int day; int hour;int second;int minute;int watch;int wday;CPen m_HouPen,m_NoHouPen,m_MinPen,m_NoMinPen,m_SecPen,m_NoSecPen,m _circle,m_RectPen;HBRUSH m_HurkBrush,m_CircleBrush,m_RecBrush,m_RectBrush,m_RectBrush1 ,m_RectBrush2;CPoint m_Center;doubl

12、e m_Radious;CPoint m_Hour2,m_OldHour2;CPoint m_Minute2,m_OldMin2;CPoint m_Second2,m_OldSec2;CRect m_WatchStart;CRect m_WatchStop;void SetClock(int hour,int minute,int second);CPoint GetPoint(int nlenth,int nvalue);#include stdafx.h#include Clock.h#define PI 3.14159265#include#includeSetTimeDlg.h#inc

13、lude ClockDoc.h#include ClockView.h#include#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifSetTimeDIg.cpp | 中初始化设置变量/ CSetTimeDlg dialogCSetTimeDlg:CSetTimeDlg(CWnd* pParent /*=NULL*/): CDialog(CSetTimeDlg:IDD, pParent)/AFX_DATA_INIT(CSetTimeDlg)long now = time(NULL);tm local = *localtime(&now);m_Day = local.tm_mday;m_Hour = local.tm_hour;m_Minute = local.tm_min;m_Month = local.tm_mon + 1;m_Second = local.tm_se

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 模板/表格 > 财务表格

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号