指针式时钟设计报告文档格式.docx
《指针式时钟设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《指针式时钟设计报告文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
xx:
xx,小时为24进制,分钟和秒是60进制。
页面的菜单栏中设有时钟控制的栏目,用来对所显示的时间进行设置。
用户可直接点击菜单栏中时钟控制的下拉列表的选项,或者直接按对应的快捷键。
时钟整体外观简单时尚,使用方便快捷。
页面的菜单栏设有时钟控制,可以对所显示的时间进行设置,用户可直接点击菜单栏中时钟控制的下拉列表的选项,或者直接使用快
捷键。
本模拟时钟可实现如下功能:
(1)指针式的时钟和数字式的时钟显示的时间同步,且与计算机的系统时间一致,能显示的具体内容是年、月、日、时、分、秒。
若想获得系统准确时间只需单击启动时钟。
(2)用户可自定义时间,单击设置时间后,在弹出的对话框中填入符合要
(3)用户可点击菜单栏中的时钟控制中的暂停,开始选项即可实现随时暂停,开始时钟。
(4)本时钟可实现整点报时,每整点时会有铃声播放出来并弹出消息框显示提示整点。
(5)鼠标左键单击秒表计时器的启动按钮,可开始秒表计时,点击停止,即停止计时。
2、设计思路
2.1程序流程图
程序结束
2.2流程图相应说明
(1)程序运行开始定义全局变量theAPP(),对构造函数及相应函数进行初始化,调用OnCreate()函数对时间变量进行初始化
(2)在voidCHhlView:
:
OnDraw(CDC*pDC)函数体中,通过调用
GetClientRect()函数获区客户区,定义屏幕的大小并确定时钟中心坐标。
接着
定义画笔CPen()、画刷CBrush()设置钟面圆周的粗细和颜色(外围圆周是黑色,
内围是粗的枚红色),然后调用ELLipse()函数确定钟面圆周大小。
采用
SetTextColor()函数定义输出字体颜色,并用CreateFont()函数定义输出文本字
体,采用TextOut()函数输出字体。
调用MoveTo(),LineTo()绘制表盘刻度及指针。
通过得到在CHlView中定义变量Hour,Minute,Second的值,计算时针、分针、秒针在表盘刻度上的位置。
无论何种指针,每次转动均以Pi/30弧度(1s的刻度)为基本单位,且都以表盘中心为转动圆心。
圆心坐标为
(CenterX,CenterY),端点坐标(X,Y)=(CenterX+指针长度*sin0,
CenterY+指针长度*cos0)。
对数字式时钟的输出控制可通过文本输出格式语
句T_data.Format("
%02年%02d月%02d日"
Year,Month,Day)来实现输出值的一一对应。
其中:
时针偏转弧度0=(Hou叶Minute/60+Second/3600)*Pi/6
分针偏转弧度0=(Minute+Second/60)*Pi/30
秒针偏转弧度0=Second*Pi/30
指针偏转弧度0弋表指针顺时针方向相对于0刻度的弧度。
(3)首先在启动时钟前,时钟是不工作的。
启动时钟后,在void
CHhIView:
OnStartTime()函数体中调用SetTimer()函数设置时间间隔,每一秒
钟产生一次时间消息。
同时通过调用GetCurrentTime()函数获取系统时间,使得该时钟显示的时间与计算机的系统时间相一致。
InvaIidateRect(NULL,TRUE)
更新窗口,指针开始转动。
在Window中,定时器每隔1秒钟就会发出一个WM_TIMER消息。
MFC的Windows类中提供了WM_TIMER消息处理函数OnTimer(),通过OnTimer()函数处理时间消息,对秒加一,并进行时间判断,计算正确时间,从而每1秒钟调用OnDraw()函数对界面进行更新,实现钟表走的过程。
(4)启动时钟后,用户可对时钟进行控制,单击菜单栏中的时钟控制”选项,在下拉列表中自行选择(或者按对应的快捷键)。
用户可单击设置时间”
选项,在弹出对话框中设置时间后点击确定,程序通过调用OnSetTime()处理
该消息,对时间进行重新赋值后,然后再次调用OnDraw()函数进行刷新重绘,实现设置时间功能;
单击暂停”选项后,通过函数OnStopTime()处理消息,调用KillTimer()函数,终止定时器运行,达到暂停的效果;
单击开始”选项,通过调用函数OnEditRestart()处理消息,调用OnSetTime()函数,重新启动定时器,重新对时间进行更新后,调用OnDraw()函数实现指针的再次运转。
当点击菜单项中的退出”或直接关闭画面后,程序停止运行。
3、软件设计
3.1.设计步骤
(1)首先在VC++6.0使用MFCAppWizard(exe)创建一个基于单文档的MFC工程,定义项目名称为Hhl后单击确定。
在稍后弹出的MFC应用程序向导—步骤1对话框中选择应用程序的类型为单个文档,其它选项使用默认选项,
直接点击完成,完成单文档工程的创建
(2)右键点击在ClassView选项卡中的CHhIView,在弹出的列表中选择
中的AddMemberVariable…即直接采用向导定义int型的时间变量Year、
Month、Day、Hour、Minute、Second和坐标变量CenterX,CenterY,及秒表变量watch,还有一个Double型的表示指针转动角度变量Radians,另外定义一个CString型的表示输出文本字体类型变量strDigits。
(3)单击菜单栏中的查看”选择建立类向导”在CHhlView类中添加消息处理函数OnCreate()、OnTimer(),具体操作如下图1所示。
然后分别单击EditCode在hhlView.cpp中的intCLiuJianView:
OnCreate(LPCREATESTRUCTlpCreateStruct)函数中添加对日期及时间初始化的代码,将日期赋值为2015年7月5日,时间为0时0分0秒。
并且在voidCHhlView:
OnTimer(UINTnIDEvent)函数中添加消息处理函数代码。
详细源代码见压缩文件。
图1添加消息处理函数OnCreate()、OnTimer()
(4)在FileView中的hhlView.cpp找到voidChhlView:
OnDraw(CDC*pDC)函数,添加绘制时钟钟面、刻度、指针、数字时钟的代码。
详细源代码见压缩文件。
(5)在ResourceView选项卡中打开Menu,双击IDR_MAINFRAME,在菜
单项中添加一个时钟控制”的菜单项,再在时钟控制”的目录下分别添加启动时间”、设置时间”、暂停”、开始”等选项,菜单效果图如图2所示。
右击各选项选择属性”设置对应的ID号及标题。
标题中可加上&
和一个字母(如&
Q启动时钟),然后打开Accelerator,双击IDR_MAINFRAME,双击下面空白处,在弹出的对话框中填入对应的ID号及设置快捷键。
然后右击选择建立类向导”为菜单连接视图类ChhIView,选择个选项对应的消息处理函数,单击EditCode在各消息处理函数中添加处理该消息的源代码。
菜单设置各选项情况表如表1所示。
图2菜单效果图
表1菜单设置各选项情况表
操作
ID
对应类
对应消息处理函数
启动时钟
ID_StartTime
CHhlView
OnStartTime()
设置时间
ID_SetTime
OnSetTime()
暂停
ID_StopTime
OnStopTime()
开始
ID_EDIT_RESTART
OnEditRestart()
(6)在ResourceView选项卡中右击Dialog,选择插入Dialog”,新建一个对话框,右击选择属性”,将对话框ID设置为IDD_SETTIME_DIALOG,将标题改为设置时间。
设计对话框界面风格,使包括修改系统时间年、月、日、时、分、秒六个编辑框,如图3所示。
编辑这六个编辑框的属性,使控制ID分别为IDC_EDIT_YEARIDC_EDIT_MONTH、IDC_EDIT_DAYIDC_EDIT_HOUR、IDC_EDITMINUTE、IDC_EDIT_SECOND右击选择建立类向导”选择Createanewclass,将类名定义为CInputDIg,选择MemberVariable选项卡,为该类添加六个成员变量分别对应六个编辑框中的输入变量,并且设置各变量的输入值
范围,如图4所示。
图3设置日期和事件对话框
图4为CInputDIg类添加成员变量
(7)给程序添加一个标题。
找到hhlDoc.cpp中的
BOOLCLiuJianDoc:
OnNewDocument()函数,在其中加上语句:
SetTitle(”模拟
时钟"
);
。
(8)对程序进行反复调试、更改,直至成功运行,完成所要求的全部功
3.2界面设计
模拟时钟程序的主界面如图5所示,指针式时钟在整个客户区的左边,数
字式时钟在右边。
指针式时钟界面自定义变量的具体情况如下表2所示。
汕15年(1了月1!
5日
11:
2-1:
JI
00:
015^1
启动伴止
图5模拟时钟的主界面
表2指针式时钟界面自定义变量参数设置
画笔
宽度
颜色(RGB)
表盘内围
Pen1
3
RGB(0,0,0)黑色
表盘外围
20
RGB(165,42,42)深枚红色
时针
HourPen
10
RGB(0,0,0)黑色
分针
MinutePen
4
秒针
SecondPen
1
单击设定时间”弹出的对话框如图3所示,具有6个编
辑框和相应的
6个静态文本框,其中编辑框控件的主要参数对应情况如下
表3所示o
表3重新设定时间编辑框控件的主要参数
控件
类型
控件对应ID值
变量名
输入数彳
据范围—
年
int
IDCEDITYEAR
myear
月
IDCEDITMONTH
mmonth
1~12
日
IDCEDITDAY
mday
1~31
时
IDCEDITHOUR
mhour
0~23
分
IDCEDITMINUTE
mminute
0~59
秒
IDCEDITSECOND
msecond
3.3关键功能的实现
3.3.1模拟时钟的显示
指针式时钟的显示主要是对界面的绘制,其实现代码在hhlView.cpp文件中。
其中界面绘制代码在voidCHhlView:
OnDraw(CDC*pDC)函数中。
SetTimer()产生周期的时间消息,调用OnDraw()函数对画面进行刷新重绘。
每次重绘的时候,由于OnTimer()函数控制时间的改变而导致每次绘制显示的画面不同,从而实现时钟动态显示
(1)在CHhlView.cpp中的voidCHhlViewView:
OnStartTime()函数中调用SetTimer()函数,SetTimer(1,1000,NULL);
意义为指定计时器ID为1,且规定计时器的时间间隔为1000ms,即每隔1s调用一次OnTimer()函数NULL代表获取的是系统振荡时间。
而OnTimer()函数中语句UpdateWindow();
的作用是更新窗口、重绘时钟,故而,综合两函数得到的结果是每隔1s窗口即时重绘一次,实现时钟显示值的实时更新。
(2)OnDraw()函数首先采用GetClientRect()函数获取窗口大小并确定钟面中心坐标(CenterX,CenterY)。
接着定义画笔CPen()、画刷CBrush()设置钟面圆周的粗细和颜色,然后调用Ellipse()函数确定钟面圆周的大小。
采用SetTextColor()函数定义输出字体颜色,并用CreateFont()函数定义输出文本字
体,采用TextOut()函数输出字体。
调用MoveTo()和LineTo()绘制表盘刻度及指针。
3、6、9、12刻度点采用“Broadway数字字体显示。
调用BitBlt()函数加载位图作为时钟的背景。
对于时针,首先利用时间变量计算出时针偏转弧度。
偏转弧度Radians=((double)Hour+(double)Minute/60.0+(double)Second/3600)*Pi/6.0;
然后定义要采用的颜色画笔:
CPenHourPen(PS_SOLID,10,RGB(0,0,0));
pDC->
SelectObject(&
HourPen);
采用MoveTo()定义时针起点pDC->
MoveTo(CenterX,CenterY);
接着利用偏转角度及自定的时针长度计算出时针的终点利用LineTo()画出时针
pDC->
LineTo(CenterX)(int)((double)80*sin(Radians)),CenterY-(int)((double)80*cos(Radians)));
最后采用同样的原理对时针进行镂空处理:
CPen
HourPen1(PS_S0LID,3,RGB(200,200,200));
SelectObject(&
HourPen1);
MoveTo(CenterX+(int)((double)25*sin(Radians)),CenterY-(int)((double)25*cos(Radians)));
LineTo(CenterX+(int)((double)75*sin(Radians)),CenterY-(int)((double)75*cos(Radians)));
对于分针、秒针的画法与时针类似,详细源代码见压缩文件。
而对于数字钟,首先编写数字钟输出日期的格式,T_date.Format("
%02d年%02d月%02d日"
,丫ear,Month,Day);
最后采用TextOut()对时间和日期进行输出。
3.3.2加载位图作为时钟背景
首先准备一张.BMP格式的图片,单击菜单栏的插入”,选择资源”,选择弹出的对话框中BitMap后单击引入”,然后选择所准备的照片即可。
然后在
voidCHhIView:
OnDraw(CDC*pDC)函数中加入如下代码(需加在画指针的代码前,否则会覆盖住指针):
CDCdeMemory;
dcMemory.CreatCompatibleDC(pDC);
CBitmappOIdBmp;
pOldBmp.LoadBitmap(IDB_BITMAP1);
dcMemory.SeIectObject(&
pOldBmp);
BitBlt(CenterX-100,CenterY-65,400,400,&
dcMemory,1,1,SRCCOPY);
333启动时钟
单击菜单项中的启动时间”选项,产生消息,调用消息处理函数void
CCHhlView:
OnStartTime(),其中该函数中调用了SetTimer()函数,启动定时器,开始计时。
同时利用GetCurrentTime()函数获得当前时间,对时间变量进行更改。
具体代码如下:
voidCHhlView:
OnStartTime()
{
SetTimer(1,995,NULL);
〃安装一个计时器
CRectrect;
GetClientRect(rect);
///取得客户区域
CTimeTime=CTime:
GetCurrentTime();
//获取系统时间
Year=Time.GetYear();
Month=Time.GetMonth();
Day=Time.GetDay();
Hour=Time.GetHour();
Minute=Time.GetMinute();
Second=Time.GetSecond();
}
334设置时间
335暂停与开始
单击菜单项中的暂停”后,程序调用voidCHhlView:
OnStopTime()函数,
采用KillTimer()函数终止定时器。
单击开始”选项后,程序调用void
CHhlView:
OnEditRestart()函数,采用SetTimer函数重启定时器。
具体代码如下:
OnStopTime()
KillTimer
(1);
//停止定时器
OnEditRestart()
336整点报时
每到整点时会有铃声播放出来,并弹出消息框显示提醒整点。
首先准备一首.Wav格式的铃声,在工程所存文件夹中的Debug文件夹中新建一个sound文件夹,将铃声存进去。
然后在hhlView.cpp中添加三个头文件,分别为#includevwindows.h>
、#pragmacomment(lib,"
winmm.lib"
)、#include"
mmsystem.h"
最后在voidCHhlView:
OnTimer(UINTnIDEvent)函数中添加如下代码:
if(Minute==0&
&
Second==0)//整点报时
PlaySound("
sound//zhong.wav"
NULL,SND_FILENAME|
SND_ASYNC);
AfxMessageBox("
亲~整点啦!
"
);
3.3.7秒表计时
1)在CHhlView:
CHhlView()设定初始化值即watch=0,并在OnDraw函数中添加秒表的两个按钮位置变量。
//秒表的按钮变量
CRectm_WatchStart;
CRectm_WatchStop;
2)设定秒表计数器及按钮位置
//设定秒表计数器及按钮位置
m_WatchStart=CRect(670,310,750,340);
//启动
m_WatchStop=CRect(780,310,850,340);
〃停止
3)在OnDraw函数中添加秒表显示代码。
//秒表显示
Rectangle(610,220,880,370);
TextOut(730,220,"
秒表"
intminSec=watch%100;
intSec=(watch/100)%60;
intMin=(watch/100)/60;
CStringm_Time;
m_Time.Format("
%02d:
%02d"
Min,Sec,minSec);
TextOut(720,270,m_Time);
Rectangle(&
m_WatchStart);
启动"
停止"
m_WatchStop);
TextOut(m_WatchStart.left+18,m_WatchStart.top+5,"
TextOut(m_WatchStop.left+18,m_WatchStop.top+5,"
4)秒表定时器消息处理
//秒表定时器消息处理
if(nIDEvent==2)
watch++;
5)添加鼠标消息处理函数。
进入ClassWizard的MessageMap选项卡,
在CHhlView类的Message列表框中选择鼠标消息WM_LBUTTONDOWN,按下
AddFunction按钮添加成员函数OnLButtonDown。
如图6所示:
图6.添加OnLButtonDown鼠标处理函数
在该函数中添加控制代码如下:
OnLButtonDown(UINTnFlags,CPointpoint)
//TODO:
Addyou