指针式时钟Word文档下载推荐.docx
《指针式时钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《指针式时钟Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
下达任务书日期:
2012年12月24日
课程设计任务书
1.设计目的:
综合应用VC++的各种编程知识和技巧进行程序设计的能力,最终掌握面向对象的编程技术。
通过本次课程设计,培养自主学习和独立创新能力。
2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等):
功能说明:
使用计时器创建一个时钟。
(1)计时器是程序中最常用的后台任务机制之一,其时间间隔最低约55毫秒,被广泛用于时钟、磁盘备份程序或需要在某一时刻运行的程序等。
(2)多媒体计时器能编程设定1毫秒或者更小,它是诸如MIDI序列发生器之类的专用型应用程序的理想选择,在WindowsAPI中有很多查询时钟的函数,利用它们就可以编写出高精度的计时器。
设计方案:
程序所实现的功能:
运行界面是一指针式时钟,有时分秒三个指针,有12个钟点数字的显示,并通过指针的转动来实现时间的更新。
设计分析:
了解两个函数:
CWnd:
:
SetTimer()函数用来设置一个计时器以指定的时间间隔触发,CWnd:
:
KillTimer()函数用来使一个正在运行的计时器停止。
建立一个MFC单个文档应用程序工程;
打开MFCClassWizard,为1view类添加OnCreate和Ontimer函数,在视图类中添加3个方法:
编辑OnCreate方法的代码,用来设置时钟。
编辑OnTimer方法用来更新窗口。
编辑OnDraw方法的代码,实现绘制时钟。
创建视图消息处理函数,初始化计时器,通过一个计时器消息,使视图一秒发送一次消息,以保证时间的准确性。
计时器消息处理函数。
流程图如下:
开始
绘制椭圆
绘制钟点
绘制时钟、分钟、秒钟针
初始化计时器
计时器处理
结束
。
3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:
本题主要涉及到的知识点有:
时钟指针运动算法、屏幕重绘方法、定时器消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x,y)的公式如下:
x=圆心x坐标+指针长度*cos(指针方向角)
y=圆心y坐标+指针长度*sin(指针方向角)
注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。
(1)OnDraw()函数实现对系统时间的获取和绘制椭圆表面和时钟指针。
(2)设置计时器,创建窗口时启动一个计时器不断发出WM_TIMER消息,调用SetTimer()函数。
(3)用TextOut()函数显示数字钟。
(4)添加菜单,用菜单项控制弹出对话框设置显示的时间。
4.主要参考文献:
VisualC++课程设计案例精编
《VisualC++程序设计——基础与实例分析》,朱晴婷,黄海鹰,陈莲君,清华大学。
《VisualC++6.0开发技巧与实例教程》,同志工作室,人民邮电。
《VisualC++6.0面向对象程序设计教程》,刘瑞新,机械工业。
5.设计成果形式及要求:
程序运行结果;
课程设计说明书。
6.工作计划及进度:
2012年12月24日~2012年12月28日:
查资料
2012年12月29日~2013年1月3日:
在指导教师指导下设计方案及程序
2013年1月4日~2013年1月8日:
学生上机调试程序,指导教师辅导
2013年1月9日~2013年1月11日:
完成课程设计说明书
2013年1月11日:
答辩
系主任审查意见:
签字:
年月日
摘要……………………………………………………………….1
关键词…………………………………………………………….2
设计目的、意义.......................................3
设计内容.............................................4
结果分析.............................................5
设计心得.............................................6
参考文献.............................................7
运行结果.............................................8
摘要:
计时器是程序中最常用的后台任务机制之一,其时间间隔最低约55毫秒,被广泛用于时钟、磁盘备份程序或需要在某一时刻运行的程序等。
而模拟时钟是一种集计时器和时钟显示于一体的程序。
以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个指针式时钟程序,此程序在屏幕正中有一个指针式钟面。
指针式的时钟表盘为椭圆形或圆形,并且圆周上有分布均匀的12个刻度,刻度要求显示清晰,钟面上有长度和颜色及粗细各不相同的指针,即时针、分针、秒针,以便各个指针重合时亦可以轻易辨认,指针的运动要求具有规律性,且为顺时针。
关键词:
设计目的、意义:
设计内容:
(正文)
voidCMy2View:
OnDraw(CDC*pDC)
{
CMy2Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
RECTRect;
GetClientRect(&
Rect);
//计算椭圆中心位置
intCenterX=Rect.right/2;
intCenterY=Rect.bottom/2;
CTimeTime=CTime:
GetCurrentTime();
CStringstr;
inti,x,y;
CSizesize;
//创建一支画笔,用来画椭圆
CPenPen(PS_SOLID,5,RGB(0,0,0));
//设置当前画笔,并记下以前的现笔
CPen*OldPen=pDC->
SelectObject(&
Pen);
//绘制钟面椭圆
pDC->
Ellipse(5,5,Rect.right-5,Rect.bottom-5);
doubleRadians;
//设置字体
SetTextColor(RGB(255,0,0));
for(i=1;
i<
=12;
i++)
{
str.Format("
%d"
i);
size=pDC->
GetTextExtent(str,str.GetLength());
Radians=(double)i*6.28/12.0;
//计算钟点放置的位置
x=CenterX-(size.cx/2)+(int)((double)(CenterX-20)*sin(Radians));
y=CenterY-(size.cy/2)-(int)((double)(CenterY-20)*cos(Radians));
//绘制钟点
pDC->
TextOut(x,y,str);
}
//计算时钟指针的夹角
Radians=(double)Time.GetHour()+(double)Time.GetMinute()/60.0+(double)Time.GetSecond()/3600.0;
Radians*=6.28/12.0;
//创建时钟指针画笔
CPenHourPen(PS_SOLID,5,RGB(100,200,100));
HourPen);
//绘制时钟指针
MoveTo(CenterX,CenterY);
LineTo(CenterX+(int)((double)(CenterX/3)*sin(Radians)),CenterY-(int)((double)(CenterY/3)*cos(Radians)));
Radians=(double)Time.GetMinute()+(double)Time.GetSecond()/60.0;
Radians*=6.28/60.0;
//创建分钟指针画笔
CPenMinutePen(PS_SOLID,3,RGB(0,0,255));
MinutePen);
//绘制分钟指针
LineTo(CenterX+(int)((double)(CenterX*2)/3)*sin(Radians),CenterY-(int)((double)(CenterY*2/3)*cos(Radians)));
Radians=(double)Time.GetSecond();
//创建秒钟指针画笔
CPenSecondPen(PS_SOLID,1,RGB(0,25,0));
SecondPen);
//绘制秒钟指针
LineTo(CenterX+(int)((double)(CenterX*4)/5)*sin(Radians),CenterY-(int)((double)(CenterY*4)/5*cos(Radians)));
SelectObject(OldPen);
}
OnTimer(UINTnIDEvent)
Addyourmessagehandlercodehereand/orcalldefault
InvalidateRect(NULL,true);
UpdateWindow();
CView:
OnTimer(nIDEvent);
intCMy2View:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(CView:
OnCreate(lpCreateStruct)==-1)
return-1;
Addyourspecializedcreationcodehere
SetTimer(1,1000,NULL);
return0;
结果分析: