




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、( 3)时针、分针和秒针形象美观,即使各指针重合也可辨认。(4)各指针运动规律正确。为便于演示,时钟速度应比实际时间快 20 倍,即 1 小时相当于 3 分钟。( 5)数字式时钟的时间显示与指针式时钟显示一致。(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前 的时间和日期。(7)按下秒表控制按钮后,秒表显示窗中显示从 0 开始的时间, 单位为百分之一秒。 再次按下秒表控制按钮后计时停止,该窗口显示累 计时间。 矚慫润厲钐瘗睞枥庑赖。2 问题分析 本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、 定时器消息、鼠标消息、菜单命令、对话框、画笔 /画刷、显示文字等。 指针运动算法
2、和屏幕重绘方法是本程序主要难点所在。 聞創沟燴鐺險爱氇谴净。不论何种指针,每次转动均以 /30 弧度(一秒的角度)为基本单 位,且都以表盘中心为转动圆心。计算指针端点( x, y)的公式如下: 残 骛楼諍锩瀨濟溆塹籟。x = 圆心 x 坐标 + 指针长度 * cos (指针方向角 )y =圆心 y 坐标 + 指针长度 * sin ( 指针方向角 )注意, 指针长度是指自圆心至指针一个端点的长度 (是整个指针的 一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。 酽锕极額閉镇桧猪訣锥。三个指针的运动是相关联的, 秒针转一圈引起分针运动一格, 分针 转一圈引起时针运动一格, 因此应该使
3、用一个定时器消息来处理指针的运动。若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。 采用一个定时器消息 可以很容易实现指针联动算法。 彈贸摄尔霁毙攬砖卤庑。 由于屏幕的重绘速度很快( 50 ms 一次),如果采用全屏删除式重 绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定指 针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除 原来位置的指针, 再采用指针的颜色在当前位置绘制指针; 如果指针没 有动,则直接绘制指针 。 謀荞抟箧飆鐸怼类蒋薔。另外,秒表需要采用单独的定时器消息控制。4 程序清单按以下步骤向视图类( CC
4、lockView )添加下列数据成员及成员函 数。(1) 添加表示年、月、日、时、分、秒的变量。int year;int month;int day;int hour;int minute;int second;(2) 添加秒表的计数变量。int watch;(3) 添加时钟的画笔及画刷变量。CPen m_HouPen, m_MinPen, m_SecPen; / 各种针的画笔CBrush m_MarkBrush; / 表盘标记的画刷(4) 添加时钟控制变量。CPoint m_Center; / 表的中心double m_Radius; / 表的半径CPoint m_Hour 2, m_Old
5、Hour 2; / 时针当前及前一次位置CPoint m_Minute 2, m_OldMin 2; / 分针当前及前一次位置CPoint m_Second 2, m_OldSec 2; / 秒针当前及前一次位置(5) 添加秒表的两个按钮位置变量。CRect m_WatchStart;CRect m_WatchStop;(6) 添加两个函数,计算时钟各指针位置。void SetClock (int hour, int minute, int second);CPoint GetPoint (int nLenth, int nValue);(7) 在视图类构造函数中增加初始化语句:CClockV
6、iew:CClockView()/设定时间year=2010;month=11;day=22;hour=0;minute=0;second=0;/设定画笔画刷m_HouPen.CreatePen(PS_SOLID,5,RGB(255,0,0);/时针画笔 m_MinPen.CreatePen(PS_SOLID,3,RGB(0,0,250);/分针画笔 m_SecPen.CreatePen(PS_SOLID,1,RGB(0,0,0);/秒/ 针画笔 m_MarkBrush.CreateSolidBrush(RGB(250,250,0);/设定表芯位置m_Center.x=222;m_Center
7、.y=222;/设定时钟半径m_Radius=222;/计算指针位置SetClock(hour,minute,second);/设定秒表计数器及按钮位置watch=0;m_WatchStart=CRect(480,310,560,340);/启动按钮m_WatchStop=CRect(590,310,670,340);/停止按钮编写指针位置函数 SetClock和 GETpOINT 。首先在 ClockView.cpp 文件头部下添加下面两行代码,以便进行数学计算。#define PI 3includemath.h然后添加下列代码:/计算个指针位置的函数继價骚。voi
8、d CClockView:SetClock(int hour,int minute,int second) 厦礴恳蹒骈時盡hour=hour*5; hour=hour+minute/12;/保存时针原位置m_OldHour0=m_Hour0;m_OldHour1=m_Hour1;/计算时针当前位置 m_Hour0=GetPoint(int(m_Radius/2),hour); m_Hour1=GetPoint(7,hour+30);/保存分针原位置m_OldMin0=m_Minute0;m_OldMin1=m_Minute1;/计算分针当前位置 m_Minute0=GetPoint(int(m
9、_Radius*7/10),minute); m_Minute1=GetPoint(10,minute+30);/保存秒针原位置 m_OldSec0=m_Second0; m_OldSec1=m_Second1;/计算秒针当前位置m_Second0=GetPoint(int(m_Radius*8/10),second); m_Second1=GetPoint(30,second+30);/计算以表为原点的指针端点位置CPoint CClockView:GetPoint(int nLenth,int nValue)CPoint p;double angle=nValue*PI/30-PI/2;p
10、.x=m_Center.x+(int)(nLenth * cos(angle);p.y=m_Center.y+(int)(nLenth * sin(angle);return p;绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表: 在 OnDraw 函数中添加下面代码: void CClockView:OnDraw(CDC*pDC)CClockDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/绘制表盘标记pDC-SelectObject(m_MarkBrush);for(int i=0;iRectangle(pt.x-5,pt.y-5,pt.x+5,
11、pt.y+5); else pDC-Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);/画时针 pDC-SelectObject(m_HouPen); if(m_OldHour0!=m_Hour0)/ 用白色覆盖原位置时针 pDC-SetROP2(R2_WHITE); pDC-MoveTo(m_OldHour0); pDC-LineTo(m_OldHour1); pDC-SetROP2(R2_COPYPEN);/时针绘制 pDC-MoveTo(m_Hour0);pDC-LineTo(m_Hour1); else pDC-MoveTo(m_Hour0);pDC-LineT
12、o(m_Hour1);/画分针pDC-SelectObject(m_MinPen);if(m_OldMin0!=m_Minute0)/用白色覆盖原位置的分针pDC-SetROP2(R2_WHITE);pDC-MoveTo(m_OldMin0);pDC-LineTo(m_OldMin1); pDC-SetROP2(R2_COPYPEN);/分针绘制pDC-MoveTo(m_Minute0); pDC-LineTo(m_Minute1);elsepDC-MoveTo(m_Minute0); pDC-LineTo(m_Minute1);/画秒针/用白色覆盖原位置的秒针 pCD-SelectObjec
13、t(m_SecPen) pDC-SetROP2(R2_WHITE); pDC-MoveTo(m_OldSec0); pDC-LineTo(m_OldSec1); pDC-SetROP2(R2_COPYPEN);/秒针绘制 pDC-MoveTo(m_Second0); pDC-LineTo(m_Second1);/数字时钟显示 pDC-SelectStockObject(WHITE_BRUSH); pDC-Rectangle(450,30,700,180);pDC-TextOut(535,52, 当前时间 );CString m_Date,m_Time;m_Date.Format(%4d 年%4
14、 月%4 日 ,year,month,day); pDC-TextOut(510,70,m_Date);m_Time.Format(%4d 点%4 分%4 秒,hour,minute,second); pDC-TextOut(510,100,m_Time);/秒表显示 pDC-Rectangle(450,220,700,370); pDC-TextOut(545,200, 秒 表);int minSec=watch%100;int Sec=(watch/100)%60;int Min=(watch/100)/60; m_Time.Format(%02d:%02d:%02d,Min,Sec,mi
15、nSec);pDC-TextOut(535,260,m_Time); pDC-Rectangle(&m_WatchStart); pDC-Rectangle(&m_WatchStop);pDC-TextOut(m_WatchStart.left + 18,m_WatchStart.top + 5, 启动 ); 茕桢广鳓鯡选块网羈泪。pDC-TextOut(m_WatchStop.left + 18,m_WatchStop.top + 5, 停止); 鹅娅尽損鹌惨歷茏鴛賴。请注意将表示时间的整数转换为 CString 字符串类型的方法以及秒 表的显示方法。 另外, watch 计数器以 1/10
16、0 秒为计数单位, 每达到 100 则秒数加 1。 籟丛妈羥为贍偾蛏练淨。u 按照下列步骤增加时钟控制代码: 修改 Onstart 和 OnStop 函数,设置时钟运动消息。按比正常时钟快 20 倍的假定, 50ms产生一个消息。 其代码为: 預頌圣鉉儐歲龈讶骅籴。void CClockView:OnStart()/ TODO: Add your command handler code hereSetTimer(1,50,NULL);void CClockView:OnStop()/ TODO: Add your command handler code hereKillTimer(1);
17、修改 OnTimer 函数,正确计算并处理年、月、日、时、分、秒等 变量的联动变化 ,其代码为:void CClockView:OnTimer(UINT nlDEvent) if(nlDEvent=1) second+;/ 秒增加 if(second59) second=0;minute+;/ 分增加if(minute9) minute=0;hour+;/ 小时增加if(hour23) hour=0;day+;/天增加switch(month) case 1:/大月case 3: case 5: case 7: case 8: case 10:case 12:if(day31) day=1;m
18、onth+;/ 月增加break;case 4casepcase 9case 2if(dayv30)宀 day-|710旱+/口囈口breakif(yea4HH0QOQOdayv29)/ _M(dayuli monfh+iQear% 仝 HoQOQOdayv28)1(day-monfh+breaKif(monfhv12)yea+monfhHI-)SefC - ock( h o um n upseco ns -nva=daCD(fa-sex/秒表定时器消息处理 if(nlDEvent=2)watch+; Invalidate (false); CView:OnTimer(nlDEvent); 添
19、加时间设置对话框代码。首先在 ClockView. cpp 文件头部添加下列语句:#include “ SetTimeDlg. H ” 在时间设定对话框类的构造函数中, 做如下修改, 将初始日期设为 2010-11-26:CSetTimeDtg:CSetTimeDtg(CWnd*pParent/*=NULL*/):CDialog(CSetTimeDtg:IDD,pParent)/|AFX_DATA_INIT(CSetTimeDlg)m_Day=26;m_Hour=0;m_Minute=0;m_Mouth=11;m_Second=0;m_Year=2010;/|AFX_DATA_INIT最后,在
20、 OnSettime 函数中添加代码如下:void CClockView:OnSettime()CSetTimeDtg SetDlg;if(SetDlg.DoModal()=IDOK)year=SetDlg.m_Year; month=SetDlg.m_Mouth; day=SetDlg.m_Day;hour=SetDlg.m_Hour;minute=SetDlg.m_Minute; second=SetDlg.m_Second; / 计算各指针位置SetClock(hour,minute,second);Invalidate(true);至此,除秒表外,时钟部分程序设计完成。u 按以下步骤设计秒表控制程序:在 OnLButtonDown 函数中增加下列内容, 以便响应单击秒表启动、停止框所发出的消息:void CClockView:OnLButtonDown(UINT nFlags,CPoint point) 渗釤呛俨 匀谔鱉调硯錦。if(m_Watch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学一年级口算题大全(含答案)
- 新野县2024-2025学年五下数学期末统考试题含答案
- 四川省德阳中学江县重点达标名校2024-2025学年初三3月月考语文试题(文理)试题含解析
- 四川旅游学院《动画原理》2023-2024学年第二学期期末试卷
- 天水市清水县2024-2025学年数学五下期末教学质量检测模拟试题含答案
- 天门职业学院《马克思主义伦理学》2023-2024学年第二学期期末试卷
- 山东省冠县2025届初三毕业生复习统一检测试题数学试题含解析
- 山东省枣庄市台儿庄区2024-2025学年三下数学期末检测试题含解析
- 罗定职业技术学院《分子医学实验技术与方法》2023-2024学年第二学期期末试卷
- 江西省重点名校2024-2025学年初三下学期期末英语试题理试题含答案
- (完整)人力资源六大模块ppt
- 老旧小区房屋改造工程监理大纲
- 小学四年级下学期英语阅读理解
- 房地产广告围挡施工投标文件范本
- 食品添加剂、食品污染物的本底与转化来源
- DB43∕T 498-2009 博落回叶-行业标准
- 大庆油田第五采油厂杏四聚联合站工程转油放水站二期工程施工组织设计
- 心力衰竭病人的护理查房pptppt(ppt)课件
- 大年初一没下雪 短文小说
- 中小学生守则ppt课件(18页PPT)
- 应急物资领用(返还)登记表
评论
0/150
提交评论