指针式时钟设计报告.docx
- 文档编号:4522007
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:20
- 大小:221.83KB
指针式时钟设计报告.docx
《指针式时钟设计报告.docx》由会员分享,可在线阅读,更多相关《指针式时钟设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
指针式时钟设计报告
指针式时钟课程设计报告
课程名称:
设计题目:
专业班级:
姓名:
学号:
时间:
指导教师:
1、基本功能描述2
2、设计思路3-
2.1.程序流程图3'
2.2.流程图相应说明4
3、软件设计3-
3.1.设计步骤3'
3.2.界面设计13-
33关键功能的实现33
3.3.1模拟时钟的显示13
3.3.2加载位图作为时钟背景33・
3.3.3启动时钟14
3.3.4设置时间15
3.3.5暂停与开始15-
3.3.6整点报时16
3.3.7秒表计时17
3.3.8页面刷新及防抖动19
4、课程设计问题总结20
5、结论与心得21
6、参考文献23'
7、附录23-
7.1.调试报告23
7.2.测试结果25-
1、基本功能描述
本课程设计的指针式时钟程序是基于MFC的windows应用程序设计,程序运行成功后,单文档界面会出现指针式时钟,数字式时钟和秒表计时器。
指针式时钟圆表盘圆周上有分布均匀的12个大刻度,每个大刻度分别对应一个小时每两个大刻度之间还有4个小刻度,刻度显示清晰,并且3、6、9、12刻度点还采用“Broadway数字字体显示。
时针,分针和秒针由粗细及长度各不相同的黑色绘成,其中时针采用镂空结构,秒针呈黑色细线状,尾部有实心圆点连接使得更容易观测。
时钟界面为圆形,钟的内框为黑色,外框为宽度更粗的枚红色,并且钟面中心背景设计有一张图片,如此的结构设计使得本时钟更有特色指针式的时钟表盘右面则是一个以数字式显示时间的数字钟,数字时钟表盘为
矩形,字体亦采用深枚红色,其日期显示的格式是xxxx年XX月XX日,时间显示格式是xx:
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
CHhlView
OnSetTime()
暂停
ID_StopTime
CHhlView
OnStopTime()
开始
ID_EDIT_RESTART
CHhlView
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)黑色
表盘外围
Pen1
20
RGB(165,42,42)深枚红色
时针
HourPen
10
RGB(0,0,0)黑色
分针
MinutePen
4
RGB(0,0,0)黑色
秒针
SecondPen
1
RGB(0,0,0)黑色
单击设定时间”弹出的对话框如图3所示,具有6个编
辑框和相应的
6个静态文本框,其中编辑框控件的主要参数对应情况如下
表3所示o
表3重新设定时间编辑框控件的主要参数
控件
类型
控件对应ID值
变量名
输入数彳
据范围—
年
int
IDCEDITYEAR
myear
月
int
IDCEDITMONTH
mmonth
1~12
日
int
IDCEDITDAY
mday
1~31
时
int
IDCEDITHOUR
mhour
0~23
分
int
IDCEDITMINUTE
mminute
0~59
秒
int
IDCEDITSECOND
msecond
0~59
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));pDC->SelectObject(&HourPen1);
pDC->MoveTo(CenterX+(int)((double)25*sin(Radians)),CenterY-(int)((double)25*cos(Radians)));
pDC->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);
pDC->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设置时间
单击菜单项中的启动时间”选项,产生消息,调用消息处理函数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();
}
335暂停与开始
单击菜单项中的暂停”后,程序调用voidCHhlView:
:
OnStopTime()函数,
采用KillTimer()函数终止定时器。
单击开始”选项后,程序调用void
CHhlView:
:
OnEditRestart()函数,采用SetTimer函数重启定时器。
具体代码如下:
voidCHhlView:
:
OnStopTime()
{
KillTimer
(1);//停止定时器
}
voidCHhlView:
:
OnEditRestart()
{
SetTimer(1,995,NULL);
CRectrect;
GetClientRect(rect);///取得客户区域
}
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函数中添加秒表显示代码。
//秒表显示
pDC->Rectangle(610,220,880,370);
pDC->TextOut(730,220,"秒表");
intminSec=watch%100;
intSec=(watch/100)%60;
intMin=(watch/100)/60;
CStringm_Time;
m_Time.Format("%02d:
%02d:
%02d",Min,Sec,minSec);
pDC->TextOut(720,270,m_Time);
pDC->Rectangle(&m_WatchStart);
启动");
停止");
pDC->Rectangle(&m_WatchStop);
pDC->TextOut(m_WatchStart.left+18,m_WatchStart.top+5,"pDC->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鼠标处理函数
在该函数中添加控制代码如下:
voidCHhlView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 时钟 设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)