青岛理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:网络工程学生姓名:_陈岩_班级:_网络092_学号:200907142题目:_指针式时钟____起迄日期:_2013.3.4至2013.4.10___设计地点:实验楼指导教师:李兰完成日期:2013年4月10日一、课程设计目的进行C++面向对象程序设计课程设计主要是在学习C++这门面向对象语言的基础上,在完成C++面向对象程序设计各部分实验的基础上,通过自学MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与C++面向对象程序设计语言特点的认识与理解。同时,可以提高运用C++编程语言解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。在编写本次课程设计指针式时钟时,通过看孙鑫视频,基本掌握了画笔、画刷,对话框、菜单、及画图的操作,熟悉了windows处理消息的机理,增强了处理问题的能力,学会了设定计时器的用法,SetTimer函数和OnTimer函数如何用,怎样获取系统时间,怎样改变颜色等。二、课程设计内容与实现的功能课程设计内容:指针式时钟:运行界面是一指针式时钟,包括时分秒三个指针,有12个钟点的显示,并通过指针的转动来实时更新时间。通过菜单可以进行闹铃设置、表盘背景、指针颜色设置等功能。实现的功能:除了基本的时钟运行,还可以进行表盘形状、边框颜色、背景颜色、指针颜色的改变,还能设置闹钟,当到设置时间,会弹出对话框并播放音乐。按exit键能退出运行界面。三、系统分析与设计1、系统分析按系统分析,编写该程序主要从这几个方面,1、在运行出来的单文档对话框中获取客户区大小,然后得到时钟的中心点。2、画出基本的表盘。3、根据获取的系统即时时间来画表盘上的时分秒指针。4、建立系统函数Oncreat和OnTimer来实现表盘的转动。5、建立各个改变颜色菜单项的消息相应函数,在里面建立CColorDialog的对象或对应对话框写相应代码。6、调试分析结果。(1)信息:表盘形状、边框颜色、背景颜色、指针颜色的改变,还能设置闹钟。(2)行为:进行时钟的正常运转,进行表盘形状、边框颜色、背景颜色、指针颜色的改变,还能设置闹钟。(3)表示:刚运行会出来与系统时间一致的指针式时钟界面,在菜单项可以进行表盘形状、边框颜色、背景颜色、指针颜色的改变,还能设置闹钟,在帮助菜单项是程序版本号,按退出就能退出运行界面。2、系统设计:2.1、模块设计:菜单背景颜色边框颜色设置指针颜色闹钟设置表盘形状退出正方形圆形椭圆时针分针秒针2.2、数据结构说明:本程序用到math.h头文件里的sin和cos函数,数据结构类型只有基本的int,float,bool等,没有用到复杂的数据结构类型。2.3、算法流程图:在画指针式时钟时,基本上所有的画时钟语句都在CClockView类中,自己建的类只有CSETCLOCK和CMyColorDialog,他们在CClockView类里面都用到由他们生成的对象。CClockView类CMyColorDialog类CSETCLOCK类四、系统测试与调试分析1、系统测试测试方法:黑盒测试技术:单元测试、功能测试测试数据:输入设置的闹铃时间。测试报告:本程序是做一个指针式时钟,可以根据菜单项来改变时钟的属性,可直观看到更改后的时钟变化,在做闹钟测试时,输入一个设定的数据,到时间会弹出一个时间到的MessageBox,并播放音乐。测试说明测试名称指针式时钟测试目的验证当到时间闹钟会不会弹出一个时间到的MessageBox,并播放音乐测试技术单元测试测试方法黑盒测试法测试用例测试内容输入闹钟时间测试步骤输入一个闹钟时间测试数据1:32:23预期结果到1:32:23闹钟响应测试结果与预期相符2、调试分析:调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析等。调试过程中遇到的一个问题是定义的时分秒是整形,当获取一个系统时间的时分秒,设定计算指针角度的value值,会用到分除60,或秒除3600,直接除会为零,而得不到一个小数,采用的方法是在除的同时采用double强制转换,还有就是有时时钟会出现频闪,正在试着解决,还有就是刚开始不会创建对话框,后来看孙鑫视频,慢慢熟悉了它的步骤,在时钟程序中,关键就是每秒的时钟界面的刷新,这里建立了一个系统的WM_Creat函数来建立SetTimer计时器,又建立一个系统函数WM_Timer,并在里面写Validate函数来进行重绘。五、用户手册该程序的使用平台是windows操作系统下的VC6.0软件,不需要安装只要打开该project的dsw类型文件,点击运行即可,操作则根据菜单项进行操作即可图1、运行后的界面比如改变表盘形状点击要改变的形状即可,点击边框颜色会弹出一个对话框,进行R、G、B编辑框值的设置就可以改变边框颜色,点击背景颜色会弹出一个颜料盒,进行颜色选择,点击设置指针颜色,同样会弹出一个颜料盒,闹钟设置会弹出一个对话框,进行时间设定,当到时间会弹出一个时间到的MessageBox并播放音乐,按退出就会退出界面。图2、点击菜单项-表盘形状-椭圆后的结果图3、按背景颜色弹出来的颜料框图四、背景颜色改变后的时钟图五、指针颜色改变后的时钟图六、设定时间到后的时钟六、程序清单//View类的主要程序CClockView::CClockView(){//TODO:addconstructioncodehereShape=Circle;m_clr1=RGB(255,0,0);m_clr2=RGB(0,255,0);m_clr3=RGB(0,0,255);m_bc=RGB(128,255,128);shi=-1;fen=-1;miao=-1;}/////////////////////////////////////////////////voidCClockView::OnDraw(CDC*pDC){CClockDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahere/////////////////////////////////////////////////////////////////////////////////////输出表盘CRectrect;GetClientRect(&rect);//得到当前客户区的大小CPointcenter(rect.Width()/2,rect.Height()/2);//得到客户区的中心坐标//---------------------------------------------------------------------------------画表盘CPen*oldpen1,newpen1;//定义一个新画笔,一个老画笔CBrush*oldbrush,newbrush;newbrush.CreateSolidBrush(m_bc);newpen1.CreatePen(PS_SOLID,5,RGB(dialog.m_R,dialog.m_G,dialog.m_B));oldpen1=pDC-SelectObject(&newpen1);oldbrush=pDC-SelectObject(&newbrush);//将新画笔调入当前绘图环境if(Shape==Circle)pDC-Ellipse(center.x-150,center.y-150,center.x+150,center.y+150);elseif(Shape==Rectangle)pDC-Rectangle(center.x-150,center.y-150,center.x+150,center.y+150);elsepDC-Ellipse(center.x-200,center.y-150,center.x+200,center.y+150);//绘图pDC-SelectObject(oldpen1);//恢复老画笔pDC-SelectObject(oldbrush);//选回到设备描述表当中//---------------------------------------------------------------------------获取系统当前时间CTimetm=CTime::GetCurrentTime();hour=tm.GetHour();minute=tm.GetMinute();second=tm.GetSecond();CStrings;s.Format(%d:%d:%d,hour,minute,second);pDC-TextOut(center.x-30,center.y+80,s);//输出数字时钟//--------------------------------------------------------------------------画秒针CPen*oldpen2,newpen2;newpen2.CreatePen(PS_SOLID,1,m_clr3);oldpen2=pDC-SelectObject(&newpen2);doublevalue1=second*3.14159/30.0;pDC-MoveTo(center.x+120*sin(value1),center.y-120*cos(value1));pDC-LineTo(center);pDC-SelectObject(&newpen2);//--------------------------------------------------------------------------画分针CPen*oldpen3,newpen3;newpen3.CreatePen(PS_SOLID,3,m_clr2);oldpen3=pDC-SelectObject(&newpen3);doublevalue2=(minute+(double)second/60.0)*3.14159/30.0;pDC-MoveTo(center.x+100*sin(value2),center.y-100*cos(value2));pDC-LineTo(center);pDC-SelectObject(oldpen3);//--------------------------------------------------------------------------画时针CPen*oldpen4,newpen4;newpen4.CreatePen(PS_SOLID,7,m_clr1);oldpen4=pDC-SelectObject(&newpen4);doublevalue3;if(hour12)value3=(hour+minute/60.0+second/3600.0)*3.14159/6.0;elsevalue3=(hour-12+(double)minute/60.0+(double)second/3600.0)*3.14159/6.0;pDC-MoveTo(center.x+80*sin(value3),center.y-80*cos(value3));pDC-LineTo(center);pDC-SelectObject(oldpen4);//------------------------------------------------------------------------划分表盘for(inti=1;i=60;i++){doublex,y,value;CStrings;intk;if(i%5==0){k=i/5;value=k*3.14159/6;x=center.x-5+130*sin(value);y=center.y-5-130*c