com时钟控件课程设计报告_第1页
com时钟控件课程设计报告_第2页
com时钟控件课程设计报告_第3页
com时钟控件课程设计报告_第4页
com时钟控件课程设计报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、com时钟控件课程设计报告 学院:计算机科学与工程 专业:计算机科学与技术 班级: 090603 学号: 090603120 姓名: 张阳阳 指导老师: 耿军雪 目 录目 录i1 课题背景11.1 背景、目的、意义、解决的主要问题及应达到的技术要求12 课程设计内容及要求23 系统分析与设计33.1 系统分析33.2 系统设计33.2.1 模块设计33.2.2 详细设计54 系统调试与测试分析84.1 系统测试84.2 系统调试85运行效果96程序清单117 心得体会16参考文献11附录主要程序代码12一、 课程设计目的时钟几乎是每个人生活中必备的生活用品。时钟虽小确非常重要。一款良好的时钟可

2、以给人们带来极大的便利。当然,现在关于时钟的各种应用程序层出不求,我的目的是设计一款界面简单、方便易用、功能相对丰富的指针式时钟程序。为了达到上述目标,以及课程设计的要求,结合自己自身的情况,选择了pc平台、windows操作系统、visual c+ 6.0开发平台、mfc框架来实现自己的程序。而且希望能通过自己这款小应用程序的设计,来掌握面向对象的程序设计方法,了解c+面向对象的设计方法和技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。二、 课程设计内容及要求程序所实现的功能:运行界面是一指针式

3、时钟,包括时分秒三个指针,有12个钟点的显示,并通过指针的转动来实时更新时间。同时可以显示相应时间的数字钟形式。通过菜单可以实现闹铃功能、表盘背景、指针颜色设置、倒计时等功能。同时为程序窗口增加了一张精美图片作为背景三、 系统分析与设计1、 系统分析为了使程序的显示更加美观,该程序使用了c+可视化程序设计方法进行设计。在可视化程序设计中,建立了一个mfc单文档应用程序工程,该工程包括了视图类、文档类对话框类和主框架类。在主框架类中修改窗口等属性,使整个时间的显示更加协调。模拟电子时钟是一个显示和计时的小程序,因此只要在视图类和文档类添加相关的属性和方法即可完成模拟电子时钟的功能。文档类定义时钟

4、的相关属性,包括int类型的year、month、day、hour、minute、second,和包括cstring类型的str_year、str_month、str_day、str_hour、str_minute、str_second等信息。int类型的时间日期属性用以计算,csrting类型的时间日期属性用以显示,通过cstring类中的成员函数formart可以把int型的数据转成cstring型的。视图类实现时钟的主要功能,在该类的ondraw函数里面对时间日期进行显示输出。向窗口输出信息时,为了保证高刷新率下绘图不闪烁,使用内存绘图的方法,在内存中创建一个与屏幕绘图区域一致的对象,使

5、得重绘视图时可以大大提高运行速度。为了使计时能够达到几乎无误差,使用了一个获取系统两秒间隔作为计时间隔的方法,使得计时间隔和系统时间间隔一致。每次重绘视图的时候都重新获取系统时间,当该两次获得的秒不一致时,就对时间加一秒。通过一个计时器消息,使视图50ms刷新一次,以保证时间的准确性。在视图类中需要添加几个方法:用于计算时间的方法runtime()、计算星期的方法week()、int型转cstring型的方法change()、获取系统时间的方法getdatetime()、重获系统时间方法onreset()和计时器消息。在计算时间日期的时候,每达到1秒的时候对second进行加1,然后判断是否达

6、到60秒,达到的话minute就加1,同样的方法对hour、day、month和year进行计算,在对day计数时,考虑到大小月和闰年,对day进行加1时,判断是哪一月和是否为闰年。在确定年、月、日之后,使用函数week()进行对星期几的计算,根据1901年每月1号是星期几可以得出现在是星期几。在这个程序中,还使用了一个对话框类,使用对话框来对时间日期的设置。在菜单栏里添加一个“设置时间”的选项和一个菜单消息,当点击这个选项就会弹出设置时间日期的对话框,对话框中编辑控件设定了每个值的取值范围,从而对输入错误进行排除。2、 系统设计2.1 模块设计主要类图 时钟程序时间查看功能时钟工作状态设置功

7、能个性化颜色设置功能开始工作暂停工作倒计时功能表盘颜色设置功能时针颜色设置分钟颜色设置闹铃功能秒针颜色设置各模块关系图画出主程序及其主要模块的流程图:开始用图片来填充背景窗口和系统时间同步时钟功能选择绘制时钟指针制作数字时钟绘制表盘刻度关闭 结束主要模块1、 时钟表盘的绘制、表盘的刻度,当前时刻表盘时分秒针运行的数据闹钟的时、分、秒数据的输入;当前时刻表盘时分秒针运2.2 详细设计 时钟组件的绘制1、 打开 vc+6.0,新建一个 mfc appwizard(exe),工程名称为shizhong。选择单文档窗口,点击完成就可以创建成功。2、 添加wm_timer消息响应函数,加入invalid

8、ate();/重绘窗口该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘。在 view 类中的 ondraw( )中对表盘进行绘制,输入绘制代码。四、 系统测试与调试分析1、系统测试测试说明测试名称指针式时钟测试目的验证软件的时间功能测试技术单元测试测试方法黑盒测试法测试用例测试内容显示时间和系统时间对比测试步骤运行程序测试数据预期结果显示时间和系统时间一致测试结果与预期相符测试说明测试名称指针式时钟测试目的验证闹钟功能测试技术单元测试测试方法黑盒测试法测试用例测试内容闹钟功能 时间测试步骤正确输入闹钟时间正确输入闹钟时间测试数据当前时间下一分钟的时间预期结果立即报时时间到后闹

9、钟报时测试结果与预期相符与预期相符测试说明测试名称指针式时钟测试目的验证倒计时功能测试技术单元测试测试方法黑盒测试法测试用例测试内容倒计时功能测试步骤正确时间测试数据随意输入时间 预期结果从输入的时间开始倒计时测试结果与预期相符测试说明测试名称指针式时钟测试目的验证改换颜色测试技术单元测试测试方法黑盒测试法测试用例测试内容换指针颜色功能测试步骤选择换表盘颜色选择换指针颜色测试数据红色时针蓝色 分针黑色 秒针绿色预期结果表盘颜色变为红时针蓝色 分针黑色 秒针绿色测试结果与预期相符与预期相符2.调试分析程序的调试过程会发现很多设计程序过程中的漏洞,也会有很多bug出现,需要仔细的不断调试才能尽量的

10、把程序调试的完美,我的程序调试的过程中出现的问题较多,现列举几个比较有代表性的,希望供其他人参考1、 我最初想到的是设计出一个不依靠读取系统时间就能独立运行的时钟,但是,个人能力实在有限,设计了一段时间还是没有头绪,只能投机取巧的读取系统时间代替了,这样的话一些个性话的功能就不能够实现了,像把一分钟设置成120秒,每小时30分钟等2、 目前的程序虽然能正常运行,但是,对于一些错误是不能反映出来的,像输入闹钟时间,如果输入的范围不对的话也不能给出提示3、 闹钟的时间输入因为没有秒的限制,如果是当前时间的话,目前的程序会直接报时,应该可以改成当前时间不报时的五、运行效果1、windows系统 vc

11、+6.0设计2、本程序不需要安装使用,直接运行即可弹出时钟对话框3、图1 时钟主界面图2 程序功能界面进入程序后会弹出图1界面显示系统时间,点击设置按钮可以出现图2功能列表 图3 闹钟时间设置界面 图4 倒计时时间设置界面打开功能列表可以选择各个功能,图3为选择闹钟功能弹出的对话框,图4为选择倒计时功能弹出的对话框六、程序清单(1): /视图类的构造函数cshejiview:cshejiview()/ todo: add construction code herecbitmap bmp;/定义一个位图类型的变量。bmp.loadbitmap(idb_bitmap1); /加载位图 m_bru

12、shbackground.createpatternbrush(&bmp);/创建位图画刷。ctime curtime = ctime:getcurrenttime();/同步系统时间。m_hour = curtime.gethour();m_minute = curtime.getminute();m_second = curtime.getsecond();flag=0;/时钟正常工作状态flag2=1;/倒计时无效;hour=-1;minute=-1;set=0;(2)/ondraw()函数进行绘制void cshejiview:ondraw(cdc* pdc)cshejidoc* pd

13、oc = getdocument();assert_valid(pdoc);/ todo: add draw code for native data herecrect rect;getclientrect(rect);/取得客户区域 pdc-fillrect(rect,&m_brushbackground); /用背景画刷填充区域,而我们在mbrushbackground里加载了位图,所以理所当然就变成了我们设置的图片/画表盘,标注刻度crect client;getclientrect(&client);int centerx = client.width()/2;int centery

14、 = client.height()/2;int clockradius = centerx centery ? centery : centerx;/用较小的一个作为钟表的半径,避免半径太大矩形放不开clockradius = clockradius * 0.9;int kedudradius = clockradius * 0.85;int keduxradius = clockradius * 0.95;int hourradius = clockradius * 0.3;/时针半径int minuteradius = clockradius * 0.5;/分针半径int secondr

15、adius = clockradius * 0.7;/秒针半径/cpen clockpen(ps_solid, 2, rgb(0,0,255); cpen clockpen(ps_solid, 2, bpcolor);/配合下面的执行代码,使用自己定义的画笔来设置表盘的颜色cpen * oldpen = pdc-selectobject(&clockpen);/恢复到原来的画笔/标注刻度for(int i = 0; imoveto(centerx + kedudradius * cos(i * 30 * pi / 180), centery + kedudradius * sin(i * 30

16、 * pi / 180);pdc-lineto(centerx + clockradius * cos(i * 30 * pi / 180), centery + clockradius * sin(i * 30 * pi / 180);for(int j = 0; jmoveto(centerx + keduxradius * cos(j * 6 * pi / 180),/keduxradius是0.95,更加接近圆周,所以比起时针当然理所当然的更短 centery + keduxradius * sin(j * 6 * pi / 180);pdc-lineto(centerx + cloc

17、kradius * cos(j * 6 * pi / 180), centery + clockradius * sin(j * 6 * pi / 180);pdc-selectobject(oldpen);/调节时,分,秒针角度显示的关系double secondradians = m_second * 2 * pi / 60;/一个圆周是2pi,共有60秒,所以一秒是左边这个表达式,用的是弧度值double minuteradians = m_minute * 2 * pi / 60 + secondradians / 60;/秒针每动一格,其效果等同于分针动1/60格double hou

18、rradians = m_hour * 2 * pi / 12 + minuteradians*5 / 60; /依照所计算的角度画出时,分,秒针/cpen secondpen(ps_solid, 2, rgb(0,255,0);cpen secondpen(ps_solid,2,secondcolor);oldpen = pdc-selectobject(&secondpen);pdc-moveto(centerx , centery);/时针的起点在中心pdc-lineto(centerx + double(secondradius) * sin(secondradians), cente

19、ry - double(secondradius) * cos(secondradians);pdc-selectobject(oldpen); /cpen minutepen(ps_solid, 4, rgb(255,255,0);cpen minutepen(ps_solid, 4, minutecolor);oldpen = pdc-selectobject(&minutepen);pdc-moveto(centerx , centery);pdc-lineto(centerx + double(minuteradius) * sin(minuteradians), centery -

20、double(minuteradius) * cos(minuteradians);pdc-selectobject(oldpen);/cpen hourpen(ps_solid, 8, rgb(255,0,255);cpen hourpen(ps_solid,8,hourcolor);oldpen = pdc-selectobject(&hourpen);pdc-moveto(centerx , centery);pdc-lineto(centerx + double(hourradius) * sin(hourradians), centery - double(hourradius) *

21、 cos(hourradians);pdc-selectobject(oldpen);/画表盘中心cbrush abrush(rgb(255,0,0);cbrush * oldbrush = pdc-selectobject(&abrush);pdc-ellipse(centerx - 8, centery - 8 , centerx +8, centery +8);/最左是圆心减8,最右是圆心加8pdc-selectobject(oldbrush);/定义数字时钟的位置,显示当前时间crect dianzibiao(centerx-52,centery*6/15, centerx+52,ce

22、ntery);cstring shijian;char temp13, temp23, temp33;itoa(m_hour, temp1, 10);itoa(m_minute, temp2, 10);/itoa功能,把一整书转换为字符串,10进制itoa(m_second, temp3, 10);shijian.insert(0, temp1);/temp1用来保存小时,temp2用来保存分钟,temp3用来保存秒 shijian += :;/时和分之间的帽号 if(m_minute 10)shijian += 0;/如果分钟小于10,则在前面加上字符“0”,以用来显示 “07”、“08”之

23、类的形式shijian += temp2;shijian += :;if(m_second setbkmode (transparent);pdc-settextcolor(rgb(255,0,0); pdc-drawtext(shijian,&dianzibiao,dt_center);/dianzibiao是一个矩形,shijian是我们转换后的cstring类型/设置文本的字体大小,颜色cstring b(指针式时钟-陈庆敬);cfont abc;abc.createfont(15, / nheight 0, / nwidth 0, / nescapement 0, / norienta

24、tion fw_ultrabold, / nweight false, / bitalic false, / bunderline 0, / cstrikeout ansi_charset, / ncharset out_default_precis, / noutprecision clip_default_precis, / nclipprecision default_quality, / nquality default_pitch | ff_swiss, / npitchandfamily b); / lpszfacenamecfont * oldfont = pdc-selecto

25、bject(&abc);pdc-settextcolor(rgb(255,0,0);crect recttext1(centerx-52,centery*3/2, centerx+52,centery*2);pdc-drawtext(b, &recttext1, dt_center); cstring c(12);crect recttext2(centerx-8,centery-kedudradius*10/9+10, centerx+8,centery-(kedudradius*10/9-14)+10);pdc-settextcolor(rgb(255,0,0); pdc-drawtext

26、(c, &recttext2, dt_center); cstring d(6);crect recttext3(centerx-5,centery+(kedudradius*10/9-14-10), centerx+5,centery+kedudradius*10/9-10);pdc-drawtext(d, &recttext3, dt_center); cstring e(9);crect recttext4(centerx-(kedudradius*10/9-14)+10,centery-7, centerx-kedudradius*10/9+10,centery+7);pdc-draw

27、text(e, &recttext4, dt_center); cstring f(3);crect recttext5(centerx+(kedudradius*10/9-14)-10,centery-7, centerx+kedudradius*10/9-10,centery+7);pdc-drawtext(f, &recttext5, dt_center);pdc-selectobject(oldfont);/若定时时间到则提醒“时间到”if(m_hour=hour)&(m_minute=minute)&(set=0)playsound(lpctstr)idr_wave1, afxget

28、instancehandle(), snd_resource | snd_async);/播放插入的格式为wav的音乐文件set=1;/这个函数使你能够获得当前应用程序的实例句柄。afxgetinstancehandle总是/返回代表你的可执行文件(.exe)的hinstance值,除非它从与mfc的usrdll/版本连接的dll内调用的。在这种情况下,它返回的是dll的hinstance值。/如果要求时钟暂停,则不调用ontimer函数if(flag&flag2)return;/调用ontimer函数settimer(1,1000,null);/每1000毫秒产生一个消息,在ontimer函

29、数里编辑相应的/响应代码(3): /工作状态设定void cshejiview:onbegin() /开始运行/ todo: add your command handler code hereflag=0;/0为正常,表示时钟正常运行flag2=1;/1为不正常,表示此时倒计时不工作invalidate();void cshejiview:onpause() /暂停运行/ todo: add your command handler code hereflag=1;flag2=1;killtimer(1);/killtimer:移除定时器函数的声明:移除先前用settimer设置的定时器。在

30、定时器使用完毕后移除定时器时使用invalidate();void cshejiview:onsetback() /倒计时功能/ todo: add your command handler code herecsetback dia;if(dia.domodal()=idok)/如果点击确认“(idok)之后,用输入的时间来代替系统本来的时间m_hour=dia.m_hour;m_minute=dia.m_minute;m_second=dia.m_second;flag2=0;flag=1;invalidate();/invalidaterect只是增加重绘区域,在下次wm_paint的时

31、候才生效/invalidaterect函数中的参数true表示系统会在你画之前用背景色将所选区域覆盖一/次,默认背景色为白色,可以通过设置brush来改变背景色。void cshejiview:onsettimer() /闹钟功能/ todo: add your command handler code herecmydialog md;md.m_shour=hour;md.m_sminute=minute;updatedata(false);if(md.domodal()=idok)/如果updatedata(true),将控件的值赋值给成员变/量;updatedata(false),将成员

32、变量的值赋值给控件;updatedata(true);hour=md.m_shour;minute=md.m_sminute;set=0;(4):/对时钟消息进行响应void cshejiview:ontimer(uint nidevent) /ontimer()函数是响应用settimer()函数设/定的时钟发送的时钟消息的。/为类添加wm_timer消息响应,会看到类中多了个ontimer(uint nidevent)。 /然后用settimer(1,1000,null)就行了。第一个参数是id,第二个是间隔时间,单位/是毫秒,第3个是响应函数,因为要在ontimer(uint nidev

33、ent)里面做响应操作,所/以此处给个null就行了。/ todo: add your message handler code here and/or call default/若为时钟状态则获取系统当前时间if(flag=0)ctime curtime = ctime:getcurrenttime();m_hour = curtime.gethour();m_minute = curtime.getminute();m_second = curtime.getsecond();/若为倒计时状态则判断是否倒计时结束if(flag2=0) if(m_second|m_minute|m_hour

34、)/如果时、分、秒不同时为零,则进行倒计时if(m_second=0)/如果在时分秒不同时为零的情况下,秒为零,那么秒向/分借60秒,如果此时分也恰好为零,则同时向时借60分,因为被秒借去60秒,所/以分为59,hour减1m_second=60;if(m_minute=0)m_minute=59;m_hour-;elsem_minute-;m_second-;else afxmessagebox(倒计时时间到);flag2=1;killtimer(1);invalidate();cview:ontimer(nidevent);(5):/设置表盘颜色void cshejiview:onbpco

35、lor() / todo: add your command handler code hereccolordialog colordlg; /创建调色板对象colordlg.m_cc.flags|=cc_fullopen;if(idok = colordlg.domodal() /将调色板实例化bpcolor= colordlg.getcolor(); /获取选中的颜色void cshejiview:onhourcolor()/设置时针颜色 / todo: add your command handler code hereccolordialog colordlg; /创建调色板对象colordlg.m_cc.flags|=cc_fullopen;if(idok = colordlg.domodal() /将调色板实例化hourcolor= col

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论