




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多时区时钟软件的设计与实现摘 要进入21世纪以来,电脑用户数迅速增长,网上的跨国交流也越见频繁,由于时差的关系,不同国家的作息不同,因此需要经常进行时间的切换。本系统主要论述如何利用VC+6.0应用程序开发环境和微软基础类库(MFC),设计与实现一个基于对话框的多时区时钟软件。该软件主要包括时钟显示,闹钟报时以及计时器功能。其中,时钟显示包含单时区时钟显示和多时区时钟显示,计时器可实现倒计时与正常计时。利用MFC中与定时器相关的函数,实现计时和时钟的定时刷新;运用模运算实现不同时区的时间转换;采用多线程技术使三个时钟同时运行。关键词:VC+;MFC;时钟;多线程The design and realization of Multi_ time_ zone ClockAbstractSince the 21stCentury, the number of computer users has increased quickly,the communication among different countries on Internet becomes more and more frequent. Because of the time difference, every country has its own timetable, you need to switch the time frequently. This system has discussed how to design and realize a clock with Visual C+6.0 and Microsoft Foundation Class. This software principally contains these functions: the display of clocks, alarm clock and timer. The function of clock display contains the displays of single time zone clocks and multi time zone clocks. The timer can realize functions of countdown and clock. Take use of the functions related to the timer in Microsoft Foundation Class library to implement time and regular update of the clocks; the time conversion of different time zone could use modular arithmetic to realize; and taking advantage of multithreading could make three clocks run at the same time.Key words: Visual C+; MFC; clock; multithreading目 录论文总页数:27页1 引 言11.1课题背景及意义11.2 课题的研究方法12 程序功能描述12.1 时钟显示12.1.1 单时钟显示12.1.2 多时钟显示12.2闹钟功能12.3计时器22.3.1 倒计时22.3.2 正常计时22.4 开发环境22.4.1 开发环境22.4.2 Visual C+ 6.0简介23主要开发技术33.1 MFC简介33.2 MFC的线程33.2.1多线程概述33.2.2 MFC的线程44程序功能实现54.1单时钟显示54.2多时钟显示104.3闹钟报时134.4计时器174.4.1倒计时174.4.2正常计时20结 论22参考文献23附 录24致 谢26声 明271 引 言1.1课题背景及意义随着社会的发展,进入21世纪,个人电脑已经进入千家万户,人们已习惯于以互联网的方式交流,学习和娱乐。网上跨国交流也越见频繁,由于时差的关系,人们在浏览国外新闻时经常需要进行时间的换算。不同地区作息时间的不同也影响到人们的交流。因此,一种能显示多个时区时间的时钟程序,将给人们的生活与交流带来极大地方便。1.2 课题的研究方法通过对VC+可视化编程的学习以及各地区时间差的查询,本文主要采用MFC控件和多线程编程技术,以及三个与时间有关的函数SetTimer()、OnTimer()和KillTimer(),设计实现一个包含计时器功能和闹钟功能的多时区时钟程序。2 程序功能描述软件主要实现三个功能:时钟显示,闹钟以及计时器。具体功能如下2.1 时钟显示2.1.1 单时钟显示实现三个时区时钟(北京时间,纽约时间,伦敦时间)的单独显示。在程序的主界面上,有一个日历,一个指针式时钟,一个时间显示框,一个确定按钮和一个取消按钮。时钟切换:单击菜单时钟显示单时钟-北京时间/纽约时间/伦敦时间。整点报时:当时间为整点时,扬声器响相应次数。日期显示:在日历控件上显示相应地区的当前日期。单击关闭按钮,关闭主程序。2.1.2 多时钟显示实现三个时区时钟的同时显示及运行。在主界面上,单击菜单时钟显示多时钟,弹出多时钟显示对话框。此对话框上有三个时钟同时运行,每个时钟有一个相对应的数字时间显示。单击关闭按钮,将关闭此对话框。2.2闹钟功能实现三个时区时钟的闹钟设置。在主界面上单击闹钟菜单,将弹出闹钟对话框,此对话框有三个单选按钮,分别选择北京时间,纽约时间和伦敦时间,系统默认为北京时间,右边的指针式时钟以及数字时间随单选按钮而改变。在报时设置框中设置时间后,点击确定,则闹钟设置完成。点击取消,可取消报时。2.3计时器实现以秒为单位的倒计时和正常计时功能。2.3.1 倒计时在主界面上单击菜单计时器-倒计时,将弹出倒计时对话框,在编辑框中输入计时长度,单击开始计时,编辑框置成不可用状态,倒计时开始。在剩余时间栏,将显示剩余时间。单击重新计时,可取消倒计时,编辑框恢复可编辑状态。2.3.2 正常计时在主界面上单击菜单计时器-正常计时,将弹出正常计时对话框,点击开始计时按钮,在流逝的时间栏将显示时间数,开始计时按钮呈不可用状态,而重新计时可用。点击重新计时,取消计时,并将时间设为零秒,开始计时可用。2.4 开发环境2.4.1 开发环境Visual C+ 6.0, Windows 2000/XP2.4.2 Visual C+ 6.0简介 Visual C+是Microsoft公司推出的功能最强大、最复杂的语言产品之一,它是目前为止在W环境下进行大型软件开发的首选。其具有如下特点。l Visual C+的语法符合ANSI C+标准,并在此基础上针对性W操作系统增加了一些语句。l 集成了MFC(Microsoft Foundation Class)类库,MFC封装了Windows API函数和消息,使程序员可以使用MFC高效率地开发各种应用程序。l 提供了MFC AppWizard,可方便地生成程序框架。l 提供了基于MFC的ClassWizard,通过它可以轻松地完成对各种MFC类的使用与维护。Visual C+6.0作为Visual Studio家族中的一员,是微软公司推出的以C+语言为基础,开发Win32应用程序(Windows 95/98/2000/XP/NT)的、面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C+类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容。3 主要开发技术程序主要采用MFC控件和多线程技术实现。3.1 MFC简介 MFC,微软基础类(Microsoft Foundation Classes),是微软提供的,用于在C+环境下编写应用程序的一个框架和引擎,VC+是WinOS下开发人员使用的专业C+ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个输助软件开发包,MFC类是微软为VC+专配的。MFC是Win API与C+的结合,API,即微软提供的WinOS下应用程序的编程语言接口,是一种软件编程的规范,但不是程序开发语言本身,可以允许用户使用各种各样的第三方的编程语言来进行对Win OS下应用程序的开发,使这些被开发出来的应用程序能在WinOS下运行,比如VB,VC+,Java,Dehpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在WinOS的消息机制里。 MFC 是一个很大的、扩展了的 C+ 类层次结构,它能使开发 Windows应用程序变得更加容易。MFC 是在整个 Windows 家族中都是兼容的,也就是说,无论是 Windows3.x、Windows95 还是 Windows NT,所使用的 MFC 是兼容的。每当新的 Windows 版本出现时,MFC 也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC 也会得到扩展,添加新的特性、变得更加容易建立应用程序。3.2 MFC的线程 3.2.1多线程概述进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程终止了,进程也就随之终止。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,好像这些线程都在同时运行。3.2.2 MFC的线程 MFC明确区分两种线程:用户界面线程(User interface thread)和工作者线程(Worker thread)。用户界面线程一般用于处理用户输入并对用户产生的事件和消息作出应答。工作者线程用于完成不要求用户输入的任务,如耗时计算。线程的创建1)创建用户界面线程 通过以下步骤创建一个用户界面线程: 从CWinThread派生一个有动态创建能力的类。使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏来支持动态创建。 覆盖CWinThread的一些虚拟函数,其中,函数InitInstance是必须覆盖的,ExitInstance通常是要覆盖的。 使用AfxBeginThread创建MFC线程对象和Win32线程对象。如果创建线程时没有指定CREATE_SUSPENDED,则开始执行线程。 如果创建线程是指定了CREATE_SUSPENDED,则在适当的地方调用函数ResumeThread开始执行线程。 2)创建工作者线程 程序员不必从CWinThread派生新的线程类,只需要提供一个控制函数,由线程启动后执行该函数。然后,使用AfxBeginThread创建MFC线程对象和Win32线程对象。如果创建线程时没有指定CREATE_SUSPENDED(创建后挂起),则创建的新线程开始执行。如果创建线程是指定了CREATE_SUSPENDED,则在适当的地方调用函数ResumeThread开始执行线程。虽然没有从CWinThread派生类,但是MFC给工作者线程提供了缺省的CWinThread对象。线程的结束 AfxEndThread用来结束调用它的线程:它将清理本线程创建的MFC对象和释放线程局部存储分配的内存空间;调用CWinThread的虚拟函数Delete;调用“C”的结束线程函数_endthreadex释放分配给线程的资源,但是不关闭线程句柄。CWinThread:Delete的缺省实现是:如果本线程的成员函数m_bDelete为TRUE,则调用“C”运算符号delete销毁MFC线程对象自身(delete this),这将导致线程对象的析构函数被调用。若析构函数检测线程句柄非空则调用CloseHandle关闭它。3.3 定时器在程序中我们经常要使用定时刷新的功能, MFC提供了定时器来完成这个功能。在MFC中和定时器相关的有三个函数:UINTSetTimer(UINTnIDEvent,UINTnElapse,void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD);afx_msgvoidOnTimer(UINTnIDEvent);BOOLKillTimer(intnIDEvent);函数功能:SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。OnTimer实际时系统定义消息用来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别响应,这里才时定时程序大展宏图的地方。KillTimer用来结束一个定时器。4 程序功能实现4.1单时钟显示创建一个基于对话框的工程MultiClock。1.在对话框上添加控件资源并设置属性(如图4-1,表4-1)图4-1 程序主对话框(单时钟界面)设计表4-1 对话框资源IDD_MULTICLOCK_DIALOG控件ID及说明文字修改对话框资源修改后的ID说明文字日历控件分组框按钮1静态文本框分隔线(Picture控件)IDC_MONTHCALENDAR1IDC_STATIC1IDCANCELIDC_STATIC2IDC_STATIC无北京时间关闭static类型Frame,颜色Black2.添加菜单资源并导入对话框(如图4-2,图4-3)图4-2 菜单界面设计1图4-3 菜单界面设计2表4-2 菜单项属性设置IDCaptionPop-upID_MCLOCKID_BKTIMEID_NYTIMEID_LDTIMEID_NAOZHONGID_DAOJISHIID_ZHENJIID_HELP时钟显示单时钟计时器多时钟北京时间纽约时间伦敦时间闹钟倒计时正常计时帮助3.使用MFC类向导添加消息响应函数和成员变量(表4-3,4-4)表4-3 向对话框类CMultiClockDlg添加消息响应函数Object IDsMessages消息的描述函数名CMultiClockDlgID_MCLOCKID_NAOZHONGID_DAOJISHIID_ZHENJIID_HELPWM_TIMERCOMMANDCOMMANDCOMMANDCOMMANDCOMMAND时间触发消息菜单消息菜单消息菜单消息菜单消息菜单消息OnTimerOnMclockOnNaozhongOnDaojishiOnZhenjiOnHelp表4-4 向对话框类CMultiClockDlg添加控件对应的成员变量Object IDs变量名变量种类变量类型IDC_MONTHCALENDAR1IDC_STATIC1IDC_STATIC2m_monthcalm_spotm_strControlControlValueCMonthCalCtrlCButtonCString4.添加代码(粗体字部分为添加代码)(1)在MultiClock.h文件中添加函数声明/绘制时钟外观函数void DrawClockFace(HDC hdc);/绘制时钟指针函数void DrawHand(HDC hdc,int nLength,int nWidth,int nDegrees,COLORREF clrColor);(2)在MultiClock.cpp文件中添加:#include DrawClockFace.函数体DrawHand 函数体 (函数体见附录)(3)在MultiClockDlg.h文件中添加CMultiClockDlg类成员变量和函数public:SYSTEMTIME time,tm;int minute,hour,second;private:afx_msg void OnSingleClock(WORD nID);/声明单时钟菜单消息处理函数(4)在MultiClockDlg.cpp文件中添加功能代码:/单时钟消息映射ON_COMMAND_RANGE(ID_BKTIME,ID_LDTIME,OnSingleClock) /初始化时间变量,设置定时器BOOL CMultiClockDlg:OnInitDialog()/ TODO: Add extra initialization here:GetLocalTime(&time);hour=time.wHour;minute=time.wMinute;second=time.wSecond;SetTimer(1,1000,NULL);return TRUE; / return TRUE unless you set the focus to a control/单时钟菜单响应函数void CMultiClockDlg:OnSingleClock(WORD nID)KillTimer(1); m_nsclock=nID-ID_BKTIME;switch(m_nsclock) case 0:GetLocalTime(&time);hour=time.wHour;minute=time.wMinute;second=time.wSecond;SetTimer(1,1000,NULL);m_spot.SetWindowText(北京时间);break;case 1:GetLocalTime(&time);hour=(time.wHour-13+24)%24;minute=time.wMinute;second=time.wSecond;if(time.wHour-13)0)/日历设置 CTime tm1(time.wYear,time.wMonth,time.wDay-1,0,0,0); m_monthcal.SetCurSel(tm1); m_monthcal.SetToday(&tm1); SetTimer(1,1000,NULL);m_spot.SetWindowText(纽约时间);break; case 2:GetLocalTime(&time);hour=(time.wHour-8+24)%24;minute=time.wMinute;second=time.wSecond;if(time.wHour-8)0)/日历设置 CTime tm2(time.wYear,time.wMonth,time.wDay-1,0,0,0); m_monthcal.SetCurSel(tm2); m_monthcal.SetToday(&tm2); SetTimer(1,1000,NULL);m_spot.SetWindowText(伦敦时间); break; /定时刷新,使指针运行void CMultiClockDlg:OnTimer(UINT nIDEvent) /绘制单时钟CClientDC dc(this);dc.SetMapMode(MM_ISOTROPIC);dc.SetViewportOrg(380,100);COLORREF crf=RGB(255,255,255);:GetLocalTime(&time);DrawClockFace(dc);if(time.wMinute!=minute)DrawHand(dc,60,8,hour*30+minute/2,crf);DrawHand(dc,90,6,minute*6,crf);if(m_nsclock=0)hour=time.wHour;if(m_nsclock=1)hour=(time.wHour-13+24)%24;if(time.wHour-13)0) /日历设置 CTime tm1(time.wYear,time.wMonth,time.wDay-1,0,0,0); m_monthcal.SetCurSel(tm1); m_monthcal.SetToday(&tm1); if(m_nsclock=2)hour=(time.wHour-8+24)%24;if(time.wHour-8)0)/日历设置 CTime tm2(time.wYear,time.wMonth,time.wDay-1,0,0,0); m_monthcal.SetCurSel(tm2); m_monthcal.SetToday(&tm2); minute=time.wMinute;if(time.wSecond!=second)DrawHand(dc,120,1,second*6,crf);DrawHand(dc,120,1,time.wSecond*6,RGB(255,0,0);DrawHand(dc,90,6,time.wMinute*6,RGB(0,255,0);DrawHand(dc,60,8,hour*30+minute/2,RGB(0,0,255);second=time.wSecond;m_str.Format(%.2d:%.2d:%.2d,hour,minute,second);UpdateData(false);if(minute=0&second=t1.GetSecond() m_b=false; :Beep(1000,500); AfxMessageBox(时间到); void CNAOZHONG:OnRadio1()/选择北京时区KillTimer(1);m_rad1=0; m_address.SetWindowText(北京时间);:GetLocalTime(&time);hour=time.wHour; minute=time.wMinute;second=time.wSecond; SetTimer(1,1000,NULL);void CNAOZHONG:OnRadio2()/选择纽约时区KillTimer(1);m_rad1=1;m_address.SetWindowText(纽约时间);:GetLocalTime(&time);hour=(time.wHour-13+24)%24;minute=time.wMinute; second=time.wSecond;SetTimer(1,1000,NULL);void CNAOZHONG:OnRadio3()/选择伦敦时区KillTimer(1);m_rad1=2;m_address.SetWindowText(伦敦时间);:GetLocalTime(&time);hour=(time.wHour-8+24)%24;minute=time.wMinute;second=time.wSecond;SetTimer(1,1000,NULL);(3)在MultiClockDlg.cpp文件中添加#include NAOZHONG.h/打开闹钟对话框void CMultiClockDlg:OnNaozhong() / TODO: Add your command handler code hereCNAOZHONG NAOZHONG;NAOZHONG.DoModal();编译后运行效果(如图4-8)4.4计时器4.4.1倒计时1.在Resource View 中右键单击文件夹,选择Insert Dialog,插入一个对话框,ID为IDD_DAOJISHI,新建一个CDialog的派生类CDAOJISHI.2. 在对话框上添加控件资源并设置性(如图4-9,表4-10)3.使用MFC类向导添加消息响应函数和成员变量(表4-11,4-12)图4-8 闹钟运行效果图4-9 倒计时界面设计表4-10 对话框资源IDD_DAOJISHI控件ID及说明文字修改对话框资源修改后的ID说明文字分组框1分组框2静态文本框1静态文本框2静态文本框3文本编辑框1文本编辑框2按钮1按钮2IDC_STATICIDC_STATICIDC_STATIC1IDC_STATICIDC_STATICIDC_EDIT1IDC_EDIT2IDC_STARTIDC_CLEAR请输入计时长度剩余时间static分秒无无开始计时重新计时表4-11 向对话框类CDAOJISHI添加消息响应函数ObjectIDsMessages消息的描述函数名CDAOJISHIIDC_STARTIDC_CLEARWM_TIMERBN_CLICKEDBN_CLICKED时间触发消息单击控件单击控件OnTimerOnEnterOnClear表4-12 向对话框类CDAOJISHI添加成员变量ControlIDs变量名变量种类变量类型IDC_EDIT1IDC_EDIT2IDC_STATIC1m_minm_secm_strValueValueValueUINTUINTCString4.添加代码(粗体字部分)(1)在 DAOJISHI.h文件 中添加CDAOJISHI类成员变量int m_totaltime;(2)在 DAOJISHI.cpp文件中添加如下代码(粗体字部分)void CDAOJISHI:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default if(m_totaltime=0)m_str.Format(%d分%d秒,(int)(m_totaltime/60),m_totaltime-(int)(m_totaltime/60)*60);m_totaltime-;UpdateData(FALSE);elseKillTimer(1);:Beep(1000,500); voi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年健康管理顾问资格认证考试试题及答案解析
- 2025年建筑施工现场监理员专业能力测评试题及答案解析
- 2025年家政服务员职业技能考试试题及答案解析
- 机电行业外贸知识培训班课件
- 2025年宠物音乐疗愈师初级面试模拟题及答案
- 2025年广告文案策划师职业水平评定试题及答案解析
- 中学语文教学通讯课件
- 如何写好讲解课件教学
- 课件上的秘密
- 2025年安全知识家庭版试卷
- 新媒体礼仪知识培训总结
- 2025 年小升初成都市初一新生分班考试语文试卷(带答案解析)-(部编版)
- 人教版七年级上册数学教学计划
- 护理事业十五五发展规划(2026-2030年)
- 2025云南昆明巫家坝建设发展有限责任公司招聘23人笔试备考试题及答案解析
- 重庆市七校联盟2024-2025学年高一下学期期末考试物理试卷(含解析)
- 2024年河北科技师范学院招聘真题
- 培训班校长述职报告课件
- 传染病信息报告管理规范2025年版培训试题及答案
- 临床患者身份识别管理标准
- 抗菌药物处方医师培训考核试题及答案
评论
0/150
提交评论