ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:152.16KB ,
资源ID:6278534      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6278534.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(模拟时钟程序Word文件下载.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

模拟时钟程序Word文件下载.docx

1、当接收到 调整时间消息时,构建对象,并获取对象中各时间变量的值,并开始计时。在指着重绘时, 需要知道其位置,通过调用 SetClock()函数实现。SetClock()函数形参为时、分、秒时间变 量,通过数学关系确定其在屏幕中的位置,以方便绘图。程序总体流程图如图 1所示:图2 On draw ()函数流程图3.软件设计3.1设计步骤鉴于要求实现的功能,我们采用 MFC的单文档编程来实现上述功能。首先,新建一个基于单文档的工程,集体操作步骤如以下所示:图3建立新工程图点击确定,弹出如下对话框:图4新建单文档程序图如不需要作其它改变,这里我们可以直接点击完成,一个新的基于单文档的应用程序 框架便

2、已经给出。然后,分别链接、运行程序,得到如下结果:图5程序运行图3.2界面设计首先,设计钟面标记,这里,我采用整点用较大的正方形表示,非整点用小圆圈表示,用蓝色较细长指针表示秒针、绿色稍细长指针表示分针、红色粗短指针表示时针,设计效果如下图所示: ” 口日期和数字钟分别位于钟面的上下方,在 On draw ()函数中通过调用TextOut()函数实现。同时,给菜单栏添加控制选项,并设置相应按钮,如下图所示:匚动止吏皋 制月宿调恢W eslie ,rc - tdr_matmframe (Menu)图7添加控制菜单给个按钮添加ID号和消息响应,我们以启动按钮为例进行说明,双击启动按钮,进行相应设置

3、,如下图所示:图8启动按钮设置图停止、调整、恢复按钮也作同样设置,分别添加相应 ID号,即分别为他们添加的ID号为 ID_STOP、ID_SetTime、ID_Reset。在空白处点击鼠标左键,建立类向导,给启动按钮添加消息处理函数,如下图所示:iMlEimb&r VfirlfltilcsAuto nn a Mo nnanic-emofccl; | Jien|i unp n_kiekihe n_h.Efi-heV1cwU ;恻h陌 Ihpalip uliha he Vic thvtiF ahii nirilkjE vhc VltWi E(uip牌凸 ID屛m i-Tirv fajmi D Rs

4、isfll lircTliincitj slolpU POATE CoMMAH D_UIAiIyeX L venia LluiiS InlflI FmnctlanIJrlrlr I点击add Funktion按钮添加消息处理函数,至此,启动按钮的相关设置便已经完成。 参照启动按钮设置,我们为其它各个按钮分别添加消息处理函数。即最后为启动、停止、 设置、恢复等各个按钮分别添加消息处理函数 OnSTART()、OnSTOP()、OnSetTime()、On Reset()函 数。为了在点击调整按钮之后弹出一个新的对话框,我们还必须建立一个对话框类,在资 源视图中添加对话框资源,如下图所示:图10新

5、建对话框图点击新建之后便弹出一个可绘制的编辑窗口,我们选择相应控件,最终效果如下图所示:图11对话框效果图建立好对话框之后,我们需要利用类向导添加一个新的对话框类,即鼠标右键点击对话框空白区域,选择建立类向导,弹出窗口,我们将对话框命名为 CSetTimeDIg,给各个控件添加相应的ID号,完成后我们需要给各控件添加变量,即分别为时间输入控件添加 相应的时间变量,以便于获取输入的时间,并做相应调整,添加结果如下表所示:表1变量及控件对应表控件ID变量类型变量名称ID YEARintm YearID MONTHm Mon thID DAYm DayID HOURm HourID MINUTEm

6、Mi nuteID SECONDm Sec ond为了方便控制,我们给程序添加工具栏。首先将程序默认的工具栏选项删除,然后逐个添加我们需要的工具栏按钮,界面效果如下图所示:H cherlpdiip ail_lchejt lDR_MAIjrRAMr (nitmap)图12工具栏效果图为工具栏分别添加对应ID值,以实现对时钟的控制。其中 S对应停止按钮、R对应 恢复按钮、A对应调整按钮、Q对应启动按钮等的ID号。至此,程序整体便已设计完成。 对程序中需要的使用的各变量分别进行定义, 这里,我们把它们放到视图类的公有成员中, 如下图所示:pubXic;int year , manth a . hau

7、r ? viinute ucinij, ujatch R in i t 訂/加叶=|蜜乍CPen llouren. n_MlitFE?nB m_SecPen: / 占和牛的直琏 CBtuh u Njrkfimth; / 衷盘祢ul两旦用CPcint n conttr: ff 表的屮止,doaUp n_R*dius; / 看脚丰桎CPfllnc n_HMir 2, n_oidnour rl; 琳t当煎眞前一宓仃星 叭int n Minute ?. m OlriWin ?; / ;冷当刁及闿-少巳直 CPoint n_Scond斫” in_01JSec fl; /也:卡亠勻甘阴.曲一反夕筐CHec

8、t rt;Muid Se Ltlock (int buur, Lnt filtiuit* int hetond);engine urtrolnt tint ntentn, Inc nVdiu?):图13添加变量图添加好各个变量之后,我们开始为程序添加消息处理函数和 On draw ()实现函数的具体代码。在使用工具栏时应注意,实现工具栏按钮的删除操作时应直接把不需要的按钮脱出工具栏即可,用delete键是无法删除的,也无法对其进行编辑。3.3关键代码的实现3.3.1构造函数功能实现原理在这个程序中,我们需要用到系统时间,因此首先定义一个 CTime对象,然后调用GetCurre ntTime(

9、)函数得到系统时间,并通过相应函数获得各个时间分量的值传给相应时间 变量。为了在绘图函数中得到我们想要的效果,我们还可以定义相应的画笔和画刷,这需 要调用CreatePen(nPenStyle nWideth,rgbCOLOR)函数,其形参分别为画线类型画线宽度 和画线颜色,颜色我们通过调用 RGB(mRed, mGreen, mBlue)函数获得。3.3.2确定指针位置实现原理在程序中,我们要解决的两一个问题便是:如何确定各个指针的位置?通过分析我们 不难发现,各个指针总是围绕一个相同的圆心运动,且有如下规律:不论何种指针,每次 转动均以n /30弧度(一秒的角度)为基本单位,且都以表盘中心

10、为转动圆心。计算指针 端点(x, y)的公式如下:x =圆心x坐标+指针长度* cos (指针方向角)y =圆心y坐标+指针长度* sin (指针方向角)而指针方向角如何确定?通过分析我们发现,钟面上共有 60个刻度,而每个刻度对应的方向角都是唯一的,即angle=(刻度值)*PI/30-PI/2。将所得到的刻度值代入上述公 式,我们便可以确定某个指针的具体位置。在这个程序中,我们新建了一个SetClock(hour, minute, seco nd函数,通过调用该函数获得指针端点的位置, 有一个需要注意的问题便是,钟面上只有12个时钟刻度,因而在确定其位置时,我们需要用当前的 hour值乘5

11、并加上minute除以12后的值,这样得到的才是真正的指针对应的刻度值。为了方便调用,我们还新建一个 GetPoint(nLength,Nvalue)函数,其实现具体位置的确定,nLen gth变量表示指针长度,Nvalue变量表示刻度值,并用公式:其中指针方向角angle=(刻度值)*PI/30-PI/2,由此,便可以确定指针的具体位置了。3.3.3On Draw()函数实现原理程序要求中,钟面必须位于客户区的中央,因而,我们需要调用相应函数获得用户区 的大小。定义一个CRect对象,调用GetClientRect(&rt)函数,便可得到用户区的相关信息。 由于钟面共有60个指针刻度,我们可

12、以采用一个循环来画出这些标记,画标记之前判断 该刻度值是否能被5整除,能整除则表示是整点值,此时画较大的正方形否则画较小的圆 圈。由于一个指针有两个端点,所以我们用一个数组来保存着两个端点的位置信息,为了 避免刷新整个用户区而造成屏幕闪烁,我们采用直接覆盖原位置指针的方法。首先调用 SelectObject(R2_WHITE)函数,并通过调用MoveTo(x,y)函数得到一个指针端点的位置,然 后调用Lineto(x,y)函数,便可用白色覆盖原位置的指针,然后调用 SelectObject(R2_COPY)函数便可恢复选用的画笔,然后 MoveTo()、LineTo()函数便可画出新的指针位置

13、了。程序 不断接收到刷新请求时,便执行Ondrow()函数。数字钟部分,通过调用TextOut()函数来进 行输出,调用GetCurrentTime()函数获取系统时间并将其显示。3.3.4On Timer()函数的实现原理通过类向导建立一个视图类的 WM_TIMER消息响应函数OnTimer(),这样启动计时 器后,每隔一定时间(由自己设置),由程序自动调用OnTimer()函数,该函数计时规则的 设定,即分、秒、时、日、月的进制设定,进行相关运算后,确定各指针位置,并保存在 预先定义的数组中,调用In va nidate()函数进行刷新,调用On draw ()函数,进行重绘,便实 现了指

14、针的转动和数字时钟的走动。3.3.5其它功能的实现原理在调整按钮的消息处理函数中,调用 DoModle()函数创建新的对话框,并判断返回值是否为IDOK,如果是,就将各时间变量按照设定的值初始化,并刷新;在实现停止功能 时,只需要调用KillTimer(1)函数即可;在实现重新启动时,调用 SetTimer()函数;在实现重新恢复系统时间时,调用 GetCurrre ntTime()函数获得系统时间,并对时间变量进行初始 化,至此,程序的基本功能便已经完全实现,基本符合任务书要求。4.结论与心得体会在此次设计中,综合考察了我们学习并运用知识的能力。由于这部分内容在考试中基 本无从实现,老是把这

15、个内容放到课程设计中来考察,也是对大家掌握知识能力的一个检 测。MFC从来都不是从零开始的,而我们需要掌握的是学会运用系统所提供的各种类和框 架来实现想要的程序。在模拟时钟程序中,我们需要熟练掌握用户区的重绘、刷新以及系 统定时器的用法,这给了我们一个综合运用所学知识的机会与平台。当然在调试过程中也 出现过许多问题,但是通过自己的努力,慢慢的将一些问题解决,从中也着实学到不少东 西。在此次设计中,参考了一些相关的资料,这给了我们很大帮助。通过此次课程设计,我们也更加了解 MFC程序的基本框架和流程图,对加深我们对 MFC的理解颇有帮助。相较于我们这个专业,C语言是一门重要的课程,因为它与我们今

16、 后的就业息息相关。通过一些具体程序的设计,也大大激发了我们的学习热情,在不知不 觉中,我们不仅有了学到了知识,还收获了一份设计完成后的自豪。由于此次课程设计基本靠我们个人独立完成,因而,肯定会有一些不完善的地方,设 计思路也会有较大不同。参考别人的程序,获得一个不同的思路,对我们的学习大有裨益。当程序出现问题时,冷静按照流程分析能帮助我们较快解决问题,同时,熟练运用调 试功能也能帮我们较快解决问题。在此次设计中,便遇到过多次语法错误不存在,但是运 行报错的情况,通过调试我发现,问题便是由于某些变量没有正确初始化,及变量的值是 随机数,由于过大或过小而导致程序不能正确运行。在调试过程中,我们能

17、够清楚看到各 个变量的值,并分析可能出现的问题,因而,熟练运用这个功能是我们在检查程序错误时 应当学会的,这能帮我们快速解决问题。总的来说,这次实验设计令我们受益匪浅,不论学到的知识还是处理问题的方法对我 们今后的学习都有很大帮助。当然,此次实验设计也基本取得成功。5.参考文献1揣锦华面向对象程序设计与VC+实践M.西安:西安电子科技大学出版社,2005.2马德骏,张建宏,汤练兵.C语言程序设计M.北京:科学出版社,2009.3严蔚敏,吴伟民.数据结构(C语言版)M.北京:清华大学出版社,2007.6.思考题1.程序中如何实现时钟时间与计算机系统实践保持一致?答:在初始化时间变量时,调用 Ge

18、tCurre ntTime()函数获取系统时间,并用其对时间 变量进行初始化,而SetTimer()函数定时为1000ms,即每隔一秒刷新一次,因而指针时间 能与系统时间保持一致,数字钟本身显示的就是系统时间,直接通过调用GetCurrentTime() 函数获得,因而始终与系统时间一致。2.SetTimer()函数和KillTimer()函数的调用位置与程序运行的关系?在程序开始运行时即应当调用 SetTimer()函数,计时器开始计时,而钟表开始走 动,当停止按钮被按下时,调用 KillTimer()函数,计时器停止计时,钟表停止走动;当启 动按钮被按下时,调用SetTimer()函数,计

19、时器开始计时,钟表开始走动;当程序窗口撤 销时,应调用KillTimer()函数,关闭计时器。3.说明SetTimer()函数、WM_TIMER消息和OnTimer()函数的调用关系?由于OnTimer()函数定义的是视图类的 WM_TIMER消息处理函数,因而当SetTimer()函数每隔一秒就会发出 WM_TIMER消息,此时OnTimer()函数。4.实现数字钟时,涉及到的编程有哪些?在实现数字钟时,先调用 GetCurre ntTime()函数,获得系统时间,而后调用 SetBkColor()函数确定背景颜色,调用SetTextColor()函数确定字体颜色,调用Format()函数

20、确定输出格式,在调用TextOut()函数进行输出。7.附录7.1调试报告当基本工作完成后,编译,程序报错,查看错误记录,其提示为: “ error C2065:R2_WHRIT : undeclared identifier”、“ error C2065: CSettimeDIg undeclared identifie”,通 过观察,发现第一个错误是由于拼写错误导致的, 将其改为“R2_WHITE ”后,错误消失,而第二个错误是由于没有对新建的对话框类进行申明,在视图类的头文件里加上#include”CSettimeDlg. h”后问题得到解决。再次编译、链接程序,没有错误,但程序无法 运

21、行,结果如下图所示:Microsoft Visual CH十 DeIjliq Libr-aryDebug Assertion Failed?Program i D 门資羁l 面向对.chenpanpan_kes heDebugchenpa npan _ksshe. exeFile: afxvJin2.iniLineSFor infoimation on how your program 匚白n cause ar assertion Fatlurcj see the Visual C-K+ docurrertaiEicn on asserts.(Press Retry to debug the

22、application)终止何 怒略图14运行结果图点击忽略后,程序结果如下图所示:就绪 I 甌宇7图15错误结果图初步分析,可能跟圆心位置不正确有关,在视图类的构造函数前插入断点,进行调试, 发现当圆心坐标的初始化无效,即为一个很大的随机数,从而确定问题的根源。通过进一 步分析,得出的结论是调用构造函数时,用户区窗口还没有产生,因而圆心坐标的确定应 当放到Ondraw()函数中进行确定,改进后问题得到解决。进而观察程序运行结果,发现数字时钟在由 0变为1的时候会出现如下结果:2O:43:31)图16数字钟错误图通过分析,由于在调用SetTimer()函数时,刷新采用的方式为Invalidat

23、e(false),此时会 重新调用Ondraw()函数但是不会对用户区进行刷新,因而造成以上结果,将false改为true, 问题得到解决,但是时钟开始闪烁,数字钟也会闪烁,这与我的设计初衷是相违背的,因 而这种方法显然不是想要的结果。此时,想到另一种方法,就是通过覆盖的方法,即在每 次输出数字钟之前通过调用TextOut()函数输出一串空格符,用以覆盖之前的数字显示,采 用该方法后,问题得到圆满解决,至此程序能够正确运行。7.2测试结果经过调试,程序能够正确运行,在操作界面中,工具栏上的 S按钮对应停止功能,即 时钟暂停走动;R按钮对应恢复按钮,即使时钟时间与系统时间保持一致; A按钮对应调

24、 整按钮,即A被按下后,弹出对话框,对时间进行调整; Q按钮对应启动功能,即当停止 按钮按下后,按下Q按钮,时钟重新开始走动。整体运行结果如下图所示:图17整体效果图7.3关键源代码CChe npanpan _kesheView:CChe npanpan_ kesheView()/初始化时间CTime time;time=CTime:GetCurre ntTime();year=time.GetYear();mon th=time.GetM on th();day=time.GetDay();hour=time.GetHour();minu te=time.GetMi nute();sec o

25、n d=time.GetSec on d();/选取画笔颜色及宽度m_HouPe n.CreatePe n(PS_SOLID,5,RGB(255,0,0);时 针宽度及颜色 m_Mi nPen .CreatePe n(PS_SOLID,3,RGB(0,255,0);份 针宽度及颜色m_SecPe n.CreatePe n(PS_SOLID,1,RGB(0,0,255)秒针宽度及颜色 in it=1;watch=1;/设置时钟半径m_Radius=200;/计算指针位置void CChe npanpan _kesheView:SetClock(i nt hour,i nt min ute,i n

26、t sec ond)hour=hour*5;hour=hour+m inu te/12;保存时针位置m_OldHour0=m_Hour0;m_OldHour1=m_Hour1;/计算时针当前位置m_Hour0=GetPoi nt(i nt(m_Radius/2),hour);m_Hour1=GetPoi nt(7,hou 叶30);保存分针位置m_OldMi n0=m_Mi nu te0;m_OldMi n1=m_Mi nute1;/计算分针当前位置m_Mi nu te0=GetPoi nt(i nt(m_Radius*7/10),mi nute);m_Mi nu te1=GetPoi nt(

27、10,mi nute+30);保存秒针位置m_OldSec0=m_Seco nd0;m_OldSec1=m_Seco nd1;/计算秒针当前位置m_Seco nd0=GetPoi nt(i nt(m_Radius*8/10),seco nd);m_Seco nd1=GetPoi nt(30,seco nd+30);CPoi nt CChe npanpan _kesheView:GetPoi nt(i nt nlen gth,i nt n value)CPoi nt p;double an gle=nvalue*PI/30-PI/2;计算角度p.x=m_Center.x+(int)(nlengt

28、h*cos(angle);/确定 X 位置p.y=m_Center.y+(int)(nlength*sin(angle);/确定 Y 位置return p;void CChe npa npan_kesheView: On Draw(CDC* pDC)CChe npanpan _kesheDoc* pDoc = GetDocume nt();ASSERT_VALID(pDoc);/ TODO: add draw code for n ative data hereGetClie ntRect(&rt);获得用户区大小m_Ce nter.x=rt.right/2;m_Ce nter.y=rt.bottom/2;/圆心选择用户区中央if(in it=1)SetClock(hour,mi nu te,seco nd);in it=0;/定义字体大小LOGFONT lo

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

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