用VC++制作模拟时钟应用程序.docx

上传人:b****4 文档编号:4194794 上传时间:2023-05-06 格式:DOCX 页数:21 大小:467.97KB
下载 相关 举报
用VC++制作模拟时钟应用程序.docx_第1页
第1页 / 共21页
用VC++制作模拟时钟应用程序.docx_第2页
第2页 / 共21页
用VC++制作模拟时钟应用程序.docx_第3页
第3页 / 共21页
用VC++制作模拟时钟应用程序.docx_第4页
第4页 / 共21页
用VC++制作模拟时钟应用程序.docx_第5页
第5页 / 共21页
用VC++制作模拟时钟应用程序.docx_第6页
第6页 / 共21页
用VC++制作模拟时钟应用程序.docx_第7页
第7页 / 共21页
用VC++制作模拟时钟应用程序.docx_第8页
第8页 / 共21页
用VC++制作模拟时钟应用程序.docx_第9页
第9页 / 共21页
用VC++制作模拟时钟应用程序.docx_第10页
第10页 / 共21页
用VC++制作模拟时钟应用程序.docx_第11页
第11页 / 共21页
用VC++制作模拟时钟应用程序.docx_第12页
第12页 / 共21页
用VC++制作模拟时钟应用程序.docx_第13页
第13页 / 共21页
用VC++制作模拟时钟应用程序.docx_第14页
第14页 / 共21页
用VC++制作模拟时钟应用程序.docx_第15页
第15页 / 共21页
用VC++制作模拟时钟应用程序.docx_第16页
第16页 / 共21页
用VC++制作模拟时钟应用程序.docx_第17页
第17页 / 共21页
用VC++制作模拟时钟应用程序.docx_第18页
第18页 / 共21页
用VC++制作模拟时钟应用程序.docx_第19页
第19页 / 共21页
用VC++制作模拟时钟应用程序.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

用VC++制作模拟时钟应用程序.docx

《用VC++制作模拟时钟应用程序.docx》由会员分享,可在线阅读,更多相关《用VC++制作模拟时钟应用程序.docx(21页珍藏版)》请在冰点文库上搜索。

用VC++制作模拟时钟应用程序.docx

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

案例五模拟时钟应用程序

以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。

用菜单选项或按钮设置时间和秒表。

时间不必与机器系统时间相同,可任意设置。

模拟时钟示意图

1 编程要求

(1)为该程序设计一个美观大方的图标。

(2)程序界面设计合理,色彩得体大方,显示正确。

(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。

(4)各指针运动规律正确。

为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。

(5)数字式时钟的时间显示与指针式时钟显示一致。

(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。

(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。

再次按下秒表控制按钮后计时停止,该窗口显示累计时间。

2 问题分析

本题主要涉及到的知识点有:

时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。

指针运动算法和屏幕重绘方法是本程序主要难点所在。

不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。

计算指针端点(x,y)的公式如下:

x=圆心x坐标+指针长度*cos(指针方向角)

y=圆心y坐标+指针长度*sin(指针方向角)

注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。

三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。

若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。

采用一个定时器消息可以很容易实现指针联动算法。

由于屏幕的重绘速度很快(50ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。

本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接绘制指针。

另外,秒表需要采用单独的定时器消息控制。

3 实现步骤  

(1)用AppWizard生成一个名为Clock的单文档(SDI)程序框架。

为了简化应用程序,在第四步时去掉Dockingtoolbar和Initialstatusbar选择项,其他各选项均可用缺省设置。

(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。

在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。

并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。

为了简化菜单,可删除系统原有的“文件”、“编辑”菜单项。

(3)利用ClassWizard为视图类添加菜单命令处理函数。

进入ClassWizard的MessageMaps选项卡,选择ClassName项为CClockView类,在ObjectIDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下AddFunction按钮添加成员函数。

ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart()、OnStop()和OnSettime()。

(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。

进入ClassWizard的MessageMaps选项卡,选择ClassName项为CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息WM_LBUTIONDOWN,按下AddFunction按钮添加成员函数。

ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。

(5)使用DeveloperStudio菜单的Insert/Resource…选项调出InsertSource对话框,为项目添加新的对话框资源。

在对话框属性中,修改对话框名为“时间设定”。

在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件,如下图所示。

 对话框

通过控件属性,将年、月、日、时、分、秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE和IDC_SECOND。

(6)设计好这个对话框模板后,利用ClassWizard自动建立对话框类。

进入ClassWizard后,它会发现已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。

按下“OK”按钮,会弹出NewClass对话框,在Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。

(7)利用ClassWizard为对话框类添加与各控件对应的数据成员。

选择MemberVariables选项卡,确保ClassName项为对话框CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“AddVariable…”按钮,为其添加对应成员变量,如表11.4所示。

表11.4 编辑控件属性

ControlIDs

VariableType

Membervariablename

VariableRange

IDC_YEAR

int

m_Year

0~3000

IDC_MONTH

int

m_Month

1~12

IDC_DAY

imt

m_Day

1~31

IDC_HOUR

imt

m_Hour

0~23

IDC_MINUTE

int

m_Minute

0~59

IDC_SECOND

int

m_Second

0~59

 最后一列为变量取值范围。

(8)编辑工程的图标资源,在ResourceView选项窗口中修改Icon结点所包含的主框架图标(IDR_MAINFRAME),修改标准图标(32像素×32像素)及小图标(16像素×16像素),从而为该程序设计一个美观大方的图标。

(9)完成以上工作后,即可修改程序框架,添加必要的代码。

4 程序清单

按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。

(1)添加表示年、月、日、时、分、秒的变量。

intyear;

intmonth;

intday;

inthour;

intminute;

intsecond;

(2)添加秒表的计数变量。

intwatch;

(3)添加时钟的画笔及画刷变量。

CPenm_HouPen,m_MinPen,m_SecPen;//各种针的画笔

CBrushm_MarkBrush;//表盘标记的画刷

(4)添加时钟控制变量。

CPointm_Center;//表的中心

doublem_Radius;//表的半径

CPointm_Hour[2],m_OldHour[2];//时针当前及前一次位置

CPointm_Minute[2],m_OldMin[2];//分针当前及前一次位置

CPointm_Second[2],m_OldSec[2];//秒针当前及前一次位置

(5)添加秒表的两个按钮位置变量。

CRectm_WatchStart;

CRectm_WatchStop;

(6)添加两个函数,计算时钟各指针位置。

voidSetClock(inthour,intminute,intsecond);

CPointGetPoint(intnLenth,intnValue);

(7)在视图类构造函数中增加初始化语句:

 

 

 

然后添加下列代码:

 

 

 

绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表:

在OnDraw函数中添加下面代码:

//用白色覆盖原位置时针

 

 

 

 

 

请注意将表示时间的整数转换为CString字符串类型的方法以及秒表的显示方法。

另外,watch计数器以1/100秒为计数单位,每达到100则秒数加1。

u按照下列步骤增加时钟控制代码:

①修改Onstart和OnStop函数,设置时钟运动消息。

按比正常时钟快20倍的假定,50ms产生一个消息。

其代码为:

②修改OnTimer函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化,其代码为:

③添加时间设置对话框代码。

首先在ClockView.cpp文件头部添加下列语句:

#include“SetTimeDlg.H”

在时间设定对话框类的构造函数中,做如下修改,将初始日期设为2010-7-10:

 

最后,在OnSettime函数中添加代码如下:

至此,除秒表外,时钟部分程序设计完成。

u 按以下步骤设计秒表控制程序:

在OnLButtonDown函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:

程序运行:

下图显示了模拟时钟运行的情况。

“启动”和“停止”框控制秒表,时钟用菜单控制。

本题采用标准的SDI程序结构,完全利用视图类实现了这一程序。

利用定时器消息控制时钟运动是本程序的出发点。

利用一个定时器控制时钟,易于实现指针联动规律。

计算指针位置利用了坐标变换和三角函数的知识。

本程序一个较难处理的地方是屏幕重绘,由于完全在OnDraw函数中实现,因此限制较多。

本程序采取了先覆盖,再重绘的方法。

 

模拟时钟示意图

 本程序由于完全在OnDraw函数中实现,因此屏幕重绘较为麻烦。

如果在OnDarw函数中采用“异或”屏幕重绘方式,在程序窗口最大、最小化及移出屏幕时,会显示异常。

解决这一问题较理想的方式是在定时器处理函数OnTimer中采用“异或”方式直接重绘屏幕,而不采用调用Invalidate()函数的方式;同时在OnDraw函数中显示指针的最后状态,以便处理程序窗口最大、最小化及移出屏幕的情况。

在OnTimer函数中直接重绘屏幕需要使用OClientDC类,具体用法与OnDraw函数中的pDC对象基本一致。

另外,本程序的数字时钟没有显示星期和农历,读者可尝试添加进去。

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2