指针式时钟课程设计报告.docx
- 文档编号:26319187
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:24
- 大小:321.57KB
指针式时钟课程设计报告.docx
《指针式时钟课程设计报告.docx》由会员分享,可在线阅读,更多相关《指针式时钟课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
指针式时钟课程设计报告
青岛理工大学
C++面向对象课程设计报告
院(系):
计算机工程学院
专业:
网络工程
************************
班级:
网络081学号:
题目:
指针式时钟
起讫日期:
2011.7.5—2011.7.14
设计地点:
学院机房101
**************
完成日期:
2011年7月14日
一、课程设计目的
时钟几乎是每个人生活中必备的生活用品。
时钟虽小确非常重要。
一款良好的时钟可以给人们带来极大的便利。
当然,现在关于时钟的各种应用程序层出不求,我的目的是设计一款界面简单、方便易用、功能相对丰富的指针式时钟程序。
为了达到上述目标,以及课程设计的要求,结合自己自身的情况,选择了PC平台、Windows操作系统、VisualC++6.0开发平台、MFC框架来实现自己的程序。
而且希望能通过自己这款小应用程序的设计,来掌握面向对象的程序设计方法,了解C++面向对象的设计方法和技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。
二、课程设计内容及要求
程序所实现的功能:
运行界面是一指针式时钟,包括时分秒三个指针,有12个钟点的显示,并通过指针的转动来实时更新时间。
同时可以显示相应时间的数字钟形式。
通过菜单可以实现闹铃功能、表盘背景、指针颜色设置、倒计时等功能。
同时为程序窗口增加了一张精美图片作为背景
三、系统分析与设计
1、系统分析
为了使程序的显示更加美观,该程序使用了C++可视化程序设计方法进行设计。
在可视化程序设计中,建立了一个MFC单文档应用程序工程,该工程包括了视图类、文档类对话框类和主框架类。
在主框架类中修改窗口等属性,使整个时间的显示更加协调。
模拟电子时钟是一个显示和计时的小程序,因此只要在视图类和文档类添加相关的属性和方法即可完成模拟电子时钟的功能。
文档类定义时钟的相关属性,包括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函数里面对时间日期进行显示输出。
向窗口输出信息时,为了保证高刷新率下绘图不闪烁,使用内存绘图的方法,在内存中创建一个与屏幕绘图区域一致的对象,使得重绘视图时可以大大提高运行速度。
为了使计时能够达到几乎无误差,使用了一个获取系统两秒间隔作为计时间隔的方法,使得计时间隔和系统时间间隔一致。
每次重绘视图的时候都重新获取系统时间,当该两次获得的秒不一致时,就对时间加一秒。
通过一个计时器消息,使视图50ms刷新一次,以保证时间的准确性。
在视图类中需要添加几个方法:
用于计算时间的方法RunTime()、计算星期的方法Week()、int型转CString型的方法Change()、获取系统时间的方法GetDateTime()、重获系统时间方法OnReset()和计时器消息。
在计算时间日期的时候,每达到1秒的时候对second进行加1,然后判断是否达到60秒,达到的话minute就加1,同样的方法对hour、day、month和year进行计算,在对day计数时,考虑到大小月和闰年,对day进行加1时,判断是哪一月和是否为闰年。
在确定年、月、日之后,使用函数Week()进行对星期几的计算,根据1901年每月1号是星期几可以得出现在是星期几。
在这个程序中,还使用了一个对话框类,使用对话框来对时间日期的设置。
在菜单栏里添加一个“设置时间”的选项和一个菜单消息,当点击这个选项就会弹出设置时间日期的对话框,对话框中编辑控件设定了每个值的取值范围,从而对输入错误进行排除。
2、系统设计
2.1模块设计
主要类图
各模块关系图
画出主程序及其主要模块的流程图:
2.2算法流程图
OnDraw函数流程图
四、系统测试与调试分析
1、系统测试
测试说明
测试名称
指针式时钟
测试目的
验证软件的时间功能
测试技术
单元测试
测试方法
黑盒测试法
测试用例
测试内容
显示时间和系统时间对比
测试步骤
运行程序
测试数据
预期结果
显示时间和系统时间一致
测试结果
与预期相符
测试说明
测试名称
指针式时钟
测试目的
验证闹钟功能
测试技术
单元测试
测试方法
黑盒测试法
测试用例
测试内容
闹钟功能时间
测试步骤
正确输入闹钟时间
正确输入闹钟时间
测试数据
当前时间
下一分钟的时间
预期结果
立即报时
时间到后闹钟报时
测试结果
与预期相符
与预期相符
测试说明
测试名称
指针式时钟
测试目的
验证倒计时功能
测试技术
单元测试
测试方法
黑盒测试法
测试用例
测试内容
倒计时功能
测试步骤
正确时间
测试数据
随意输入时间
预期结果
从输入的时间开始倒计时
测试结果
与预期相符
测试说明
测试名称
指针式时钟
测试目的
验证改换颜色
测试技术
单元测试
测试方法
黑盒测试法
测试用例
测试内容
换指针颜色功能
测试步骤
选择换表盘颜色
选择换指针颜色
测试数据
红色
时针蓝色分针黑色秒针绿色
预期结果
表盘颜色变为红
时针蓝色分针黑色秒针绿色
测试结果
与预期相符
与预期相符
2调试分析
程序的调试过程会发现很多设计程序过程中的漏洞,也会有很多bug出现,需要仔细的不断调试才能尽量的把程序调试的完美,我的程序调试的过程中出现的问题较多,现列举几个比较有代表性的,希望供其他人参考
1、我最初想到的是设计出一个不依靠读取系统时间就能独立运行的时钟,但是,个人能力实在有限,设计了一段时间还是没有头绪,只能投机取巧的读取系统时间代替了,这样的话一些个性话的功能就不能够实现了,像把一分钟设置成120秒,每小时30分钟等
2、目前的程序虽然能正常运行,但是,对于一些错误是不能反映出来的,像输入闹钟时间,如果输入的范围不对的话也不能给出提示
3、闹钟的时间输入因为没有秒的限制,如果是当前时间的话,目前的程序会直接报时,应该可以改成当前时间不报时的
五、用户手册
1、windows系统vc++6.0设计
2、本程序不需要安装使用,直接运行即可弹出时钟对话框
3、
图1时钟主界面图2程序功能界面
进入程序后会弹出图1界面显示系统时间,点击设置按钮可以出现图2功能列表
图3闹钟时间设置界面图4倒计时时间设置界面
打开功能列表可以选择各个功能,图3为选择闹钟功能弹出的对话框,图4为选择倒计时功能弹出的对话框
图5表盘及指针颜色设置界面
选择设置表盘或者各指针颜色时都会弹出图5,选择喜欢的颜色点击确定后即可改变颜色
六、程序清单
(1):
//视图类的构造函数
CShejiView:
:
CShejiView()
{
//TODO:
addconstructioncodehere
CBitmapbmp;//定义一个位图类型的变量。
bmp.LoadBitmap(IDB_BITMAP1);///加载位图
m_brushBackground.CreatePatternBrush(&bmp);///创建位图画刷。
CTimecurtime=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()函数进行绘制
voidCShejiView:
:
OnDraw(CDC*pDC)
{
CShejiDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CRectrect;
GetClientRect(rect);///取得客户区域
pDC->FillRect(rect,&m_brushBackground);///用背景画刷填充区域,而我们在mbrushbackground里加载了位图,所以理所当然就变成了我们设置的图片
//画表盘,标注刻度
CRectclient;
GetClientRect(&client);
intcenterX=client.Width()/2;
intcenterY=client.Height()/2;
intclockRadius=centerX>centerY?
centerY:
centerX;//用较小的一个作为钟表的半径,避免半径太大矩形放不开
clockRadius=clockRadius*0.9;
intkeduDRadius=clockRadius*0.85;
intkeduXRadius=clockRadius*0.95;
inthourRadius=clockRadius*0.3;//时针半径
intminuteRadius=clockRadius*0.5;//分针半径
intsecondRadius=clockRadius*0.7;//秒针半径
//CPenclockPen(PS_SOLID,2,RGB(0,0,255));
CPenclockPen(PS_SOLID,2,bpcolor);//配合下面的执行代码,使用自己定义的画笔来设置表盘的颜色
CPen*oldPen=pDC->SelectObject(&clockPen);//恢复到原来的画笔
//标注刻度
for(inti=0;i<12;i++)
{
pDC->MoveTo(centerX+keduDRadius*cos(i*30*PI/180),
centerY+keduDRadius*sin(i*30*PI/180));
pDC->LineTo(centerX+clockRadius*cos(i*30*PI/180),
centerY+clockRadius*sin(i*30*PI/180));
}
for(intj=0;j<60;j++)
{
pDC->MoveTo(centerX+keduXRadius*cos(j*6*PI/180),//keduxradius是0.95,更加接近圆周,所以比起时针当然理所当然的更短
centerY+keduXRadius*sin(j*6*PI/180));
pDC->LineTo(centerX+clockRadius*cos(j*6*PI/180),
centerY+clockRadius*sin(j*6*PI/180));
}
pDC->SelectObject(oldPen);
//调节时,分,秒针角度显示的关系
doublesecondRadians=m_second*2*PI/60;//一个圆周是2pi,共有60秒,所以一秒是左边这个表达式,用的是弧度值
doubleminuteRadians=m_minute*2*PI/60+secondRadians/60;//秒针每动一格,其效果等同于分针动1/60格
doublehourRadians=m_hour*2*PI/12+minuteRadians*5/60;
//依照所计算的角度画出时,分,秒针
//CPensecondPen(PS_SOLID,2,RGB(0,255,0));
CPensecondPen(PS_SOLID,2,secondcolor);
oldPen=pDC->SelectObject(&secondPen);
pDC->MoveTo(centerX,centerY);//时针的起点在中心
pDC->LineTo(centerX+double(secondRadius)*sin(secondRadians),
centerY-double(secondRadius)*cos(secondRadians));
pDC->SelectObject(oldPen);
//CPenminutePen(PS_SOLID,4,RGB(255,255,0));
CPenminutePen(PS_SOLID,4,minutecolor);
oldPen=pDC->SelectObject(&minutePen);
pDC->MoveTo(centerX,centerY);
pDC->LineTo(centerX+double(minuteRadius)*sin(minuteRadians),
centerY-double(minuteRadius)*cos(minuteRadians));
pDC->SelectObject(oldPen);
//CPenhourPen(PS_SOLID,8,RGB(255,0,255));
CPenhourPen(PS_SOLID,8,hourcolor);
oldPen=pDC->SelectObject(&hourPen);
pDC->MoveTo(centerX,centerY);
pDC->LineTo(centerX+double(hourRadius)*sin(hourRadians),
centerY-double(hourRadius)*cos(hourRadians));
pDC->SelectObject(oldPen);
//画表盘中心
CBrushabrush(RGB(255,0,0));
CBrush*oldbrush=pDC->SelectObject(&abrush);
pDC->Ellipse(centerX-8,centerY-8,centerX+8,centerY+8);//最左是圆心减8,最右是圆心加8
pDC->SelectObject(oldbrush);
//定义数字时钟的位置,显示当前时间
CRectdianzibiao(centerX-52,centerY*6/15,centerX+52,centerY);
CStringshijian;
chartemp1[3],temp2[3],temp3[3];
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”之类的形式
}
shijian+=temp2;
shijian+=":
";
if(m_second<10)
{
shijian+="0";//同理
}
shijian+=temp3;
//完成数字时钟显示当前时间
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
pDC->DrawText(shijian,&dianzibiao,DT_CENTER);//dianzibiao是一个矩形,shijian是我们转换后的cstring类型
//设置文本的字体大小,颜色
CStringb("指针式时钟--陈庆敬");
CFontabc;
abc.CreateFont(15,//nHeight
0,//nWidth
0,//nEscapement
0,//nOrientation
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);//lpszFacename
CFont*oldFont=pDC->SelectObject(&abc);
pDC->SetTextColor(RGB(255,0,0));
CRectrectText1(centerX-52,centerY*3/2,centerX+52,centerY*2);
pDC->DrawText(b,&rectText1,DT_CENTER);
CStringc("12");
CRectrectText2(centerX-8,centerY-keduDRadius*10/9+10,centerX+8,centerY-(keduDRadius*10/9-14)+10);
pDC->SetTextColor(RGB(255,0,0));
pDC->DrawText(c,&rectText2,DT_CENTER);
CStringd("6");
CRectrectText3(centerX-5,centerY+(keduDRadius*10/9-14-10),centerX+5,centerY+keduDRadius*10/9-10);
pDC->DrawText(d,&rectText3,DT_CENTER);
CStringe("9");
CRectrectText4(centerX-(keduDRadius*10/9-14)+10,centerY-7,centerX-keduDRadius*10/9+10,centerY+7);
pDC->DrawText(e,&rectText4,DT_CENTER);
CStringf("3");
CRectrectText5(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,AfxGetInstanceHandle(),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函数里编辑相应的//响应代码
}
(3):
//工作状态设定
voidCShejiView:
:
OnBegin()//开始运行
{
//TODO:
Addyourcommandhandlercodehere
flag=0;//0为正常,表示时钟正常运行
flag2=1;//1为不正常,表示此时倒计时不工作
Invalidate();
}
voidCShejiView:
:
OnPause()//暂停运行
{
//TODO:
Addyourcommandhandlercodehere
flag=1;
flag2=1;
KillTimer
(1);//KillTimer:
移除定时器函数的声明:
移除先前用SetTimer设置的定时器。
在定时器使用完毕后移除定时器时使用
Invalidate();
}
voidCShejiView:
:
OnSetback()//倒计时功能
{
//TODO:
Addyourcommandhandlercodehere
Csetbackdia;
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的时候才生效//InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一//次,默认背景色为白色,可以通过设置BRUSH来改变背景色。
}
voidCShejiView:
:
OnSettimer()//闹钟功能
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 时钟 课程设计 报告