指针式时钟设计报告文档格式.docx

上传人:b****6 文档编号:17456701 上传时间:2022-12-01 格式:DOCX 页数:20 大小:221.83KB
下载 相关 举报
指针式时钟设计报告文档格式.docx_第1页
第1页 / 共20页
指针式时钟设计报告文档格式.docx_第2页
第2页 / 共20页
指针式时钟设计报告文档格式.docx_第3页
第3页 / 共20页
指针式时钟设计报告文档格式.docx_第4页
第4页 / 共20页
指针式时钟设计报告文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

指针式时钟设计报告文档格式.docx

《指针式时钟设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《指针式时钟设计报告文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

指针式时钟设计报告文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1