用VC++制作 模拟时钟应用程序
- 格式:doc
- 大小:605.00 KB
- 文档页数:22
多时区时钟软件的设计与实现摘要进入21世纪以来,电脑用户数迅速增长,网上的跨国交流也越见频繁,由于时差的关系,不同国家的作息不同,因此需要经常进行时间的切换。
本系统主要论述如何利用VC++6.0应用程序开发环境和微软基础类库(MFC),设计与实现一个基于对话框的多时区时钟软件。
该软件主要包括时钟显示,闹钟报时以及计时器功能。
其中,时钟显示包含单时区时钟显示和多时区时钟显示,计时器可实现倒计时与正常计时。
利用MFC中与定时器相关的函数,实现计时和时钟的定时刷新;运用模运算实现不同时区的时间转换;采用多线程技术使三个时钟同时运行。
关键词:VC++;MFC;时钟;多线程目录论文总页数:27页1 引言......................................................................................................... 错误!未定义书签。
1.1课题背景及意义................................................................................... 错误!未定义书签。
1.2 课题的研究方法.................................................................................. 错误!未定义书签。
2 程序功能描述........................................................................................... 错误!未定义书签。
2.1 时钟显示.............................................................................................. 错误!未定义书签。
vc编写一个模拟时钟的程序(VC write an analog clock program)I'm sorry, my program is too big, 4M, because there are other functionsNo way. Towel section proceduresVoid CFill_areaView:: myShowColok (CDC, *pDC){M_time=CTime:: GetCurrentTime ();PDC->FillRect (&CRect (0,0, rect.Width (), rect.Height ()), &CBrush (RGB (100100100));CBrush brush (RGB (150150150));CBrush *oldbrush=pDC->SelectObject (&brush);CPen pen (PS_SOLID, 3, RGB (0,0,0));CPen *oldpen=pDC->SelectObject (&pen);PDC->Ellipse (rect.Width (), /2- (rect.Height ()), /2, rect.Height () (/2-10 ()), /2- (rect.Height ()), /2, rect.Width (), /2+ (rect.Height ()), /2, rect.Height () (&CRect (), /2+ (rect.Height ()), /2-10 (/2-10) /2) /2-10 ());PDC->Ellipse (&CRect (rect.Width ()), /2-3, rect.Height (), /2-3, rect.Width (), /2+3, rect.Height () /2+3);CPen PEN2 (PS_SOLID, 7, RGB (0,0,0));PDC->SelectObject (&pen2);PDC->MoveTo (rect.Width (), /2, rect.Height (), /2-16* (rect.Height (), /2-10) /20);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20, rect.Height (), /2-6* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20, rect.Height (), /2-6* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2, rect.Height (), /2-16* (rect.Height (), /2-10) /20);PDC->MoveTo (rect.Width (), /2-15* (rect.Height ()), /20+25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25+40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25+40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->MoveTo (rect.Width (), /2+15* (rect.Height ()), /20-25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25-40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25-40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);CPen pen1 (PS_SOLID, 1, RGB (0,0,0));PDC->SelectObject (&pen1);Double alpha=0;MyPoint, P1, P2, p3;P1=m_pointColok[0], p2=m_pointColok[4], p3=m_pointColok[5];For (int i=0; i<=60; i++){Alpha=i*6*pi/180;P1.x=m_pointColok[0].x*cos (alpha) -m_pointColok[0].y*sin (alpha);P1.y=m_pointColok[0].x*sin (alpha) +m_pointColok[0].y*cos (alpha);PDC->MoveTo (ChangePoint (P1).X, ChangePoint (P1).Y);P2.x=m_pointColok[4].x*cos (alpha) -m_pointColok[4].y*sin (alpha);P2.y=m_pointColok[4].x*sin (alpha) +m_pointColok[4].y*cos (alpha);P3.x=m_pointColok[5].x*cos (alpha) -m_pointColok[5].y*sin (alpha);P3.y=m_pointColok[5].x*sin (alpha) +m_pointColok[5].y*cos (alpha);If (i%5==0)PDC->LineTo (ChangePoint (P2).X, ChangePoint (P2).Y);ElsePDC->LineTo (ChangePoint (P3).X, ChangePoint (P3).Y);PDC->SetBkMode (TRANSPARENT);CFont font;Font.CreateFont (16,12,0,0, FW_NORMAL),假,假,假,ansi_charset,out_default_precis,clip_default_precis,default_quality,default_pitch | ff_swiss,“Arial”);CFont * oldfont = PDC -> SelectObject(与字体);/ /改变字体PDC -> SetTextColor(RGB(255205100));PDC -> TextOut(矩形。
面向对象Windows程序设计选题:计算器、小闹钟、通讯录学号:姓名:院(系):信息工程学院专业:信息完成日期:指导老师:老师题目一:利用MFC框架编写简易计算器一.需求分析即要实现简单计算器的功能,包括加、减、乘、除等运算功能,还要实现数据的输入、输出、计算、显示及程序退出等功能。
二.总体设计1.程序的创建.使用软件Visual C++ 6.0.,首先,新建一个MFC 基于对话框的工程。
点击文件-新建,在工程选项卡里选择MFC AppWizard[exe],给工程命名Jisuan。
点击确定。
创建一个基于对话框的应用程序。
2.界面的设计按如图所示向对话框添加控件,且按如图所示一样排版。
4.为控件添加成员变量和消息处理函数为IDC_FIRNUM 增加一个变量,点Add Variable…,我们为它增加一个 float 型的变量,命名为m_Firnum。
给第二个编辑框增加float变量m_Secnum。
第三个编辑框增加float变量m_Result。
按ctrl+w选择第一个选项卡 Message Maps,从IDs 中选择IDC_JIA,即加这个按钮,从 Messages 中选择 BN_CLICKED,即当被单击的时候,然后点 AddFunction…为其添加函数然后弹出对话框,为函数命名,选择默认即可,点击OK。
同样为-,*,/添加一样的响应函数。
结果如图:三、编程说明与实现添加如下代码:void CJisuanDlg::OnJia(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum+m_Secnum;UpdateData(false);}void CJisuanDlg::OnJian(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum-m_Secnum;UpdateData(false);}void CJisuanDlg::OnCheng(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum*m_Secnum;UpdateData(false);}void CJisuanDlg::OnChu(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum/m_Secnum;UpdateData(false);}这里有一个UpdateData(Bool)函数。
MFC之模拟时钟最近在学习MFC,程序设计⽼师布置”画板“和”模拟时钟“作为实验来实践,由于没去上课,⽹上搜索的很多教程⼏乎都是以VC6.0为基础的,⽽⾝边⼏乎都是VS2008以上,对于初学者来说,有时仿照VC6.0的教程在VS2008或更⾼的环境上难免会出现⼀些困难,特此将模拟时钟程序在VS2008环境下的开发过程总结如下:1.新建项⽬项⽬类型选择“MFC”,模板选择“MFC应⽤程序”,名称⾃拟,这⾥命名为”Clock"。
选择好以后效果如下:2.MFC应⽤程序向导设置选择“下⼀步"这⾥有两个更改,⼀是”应⽤程序类型”选择“基于对话框”,同时取消选中“使⽤Unicode库”。
完成以上两步之后,直接单击“完成”即可。
三、核⼼部分1.⾸先打开“类视图”,选择"CClockDlg"在该类的头⽂件中,找到如下代码:紧接着后⾯添加三个变量⽤于临时保存时间的秒、分、时。
int m_Sec, m_Min, m_Hour;插⼊后的效果如下:2.⼿动添加⼀个消息映射函数,完成时间的获取和指针的绘制。
在CClockDlg类的头⽂件中找到如下代码:在其中增加⼀⾏如下:afx_msg void OnTimer(UINT nIDEvent);增加后显⽰效果如下:接着在资源管理器中找到CClockDlg类的cpp⽂件来实现刚才的函数声明需要添加的代码如下:1void CClockDlg::OnTimer(UINT nIDEvent)2 {3// TODO: Add your message handler code here and/or call default4 CTime time = CTime::GetCurrentTime(); //获得系统时间5 m_Sec = time.GetSecond();6 m_Min = time.GetMinute();7 m_Hour = time.GetHour();89 CDC* pDC = GetDC();10 CRect rect;11 GetClientRect(&rect); //获取客户区域12 CBitmap bitmap; //定义图⽚类13 bitmap.LoadBitmap(IDB_BITMAP1); //加载位图14 CDC memdc; //定义临时画布15 memdc.CreateCompatibleDC(pDC); //创建画布16 memdc.SelectObject(&bitmap); //关联图⽚1718int x = rect.Width()/2;19int y = rect.Height()/2;2021 CPen MinutePen(PS_SOLID,2,RGB(0,0,0)); //设置分针画笔22 memdc.SelectObject(&MinutePen);23 memdc.MoveTo(x,y);24//绘制分针25 memdc.LineTo(x+(long)40*cos(PI/2-2*PI*m_Min/60.0),y-(long)40*sin(PI/2-2*PI*m_Min/60.0));26 CPen HourPen(PS_SOLID,3,RGB(0,0,0)); //设置时针画笔27 memdc.SelectObject(&HourPen);28 memdc.MoveTo(x,y);29//绘制时针30 memdc.LineTo(x+(long)30*cos(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0))31 ,y-(long)30*sin(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0)));32 CPen SecondPen(PS_SOLID,1,RGB(255,0,0)); //设置秒针画笔33 memdc.SelectObject(&SecondPen);34 memdc.MoveTo(x,y);35 memdc.LineTo(x+(long)50*cos(PI/2-2*PI*m_Sec/60.0),y-(long)50*sin(PI/2-2*PI*m_Sec/60.0));//绘制秒针36 memdc.MoveTo(x,y);37 memdc.LineTo(x+(long)10*cos(PI/2-2*PI*(m_Sec+30)/60.0),y-(long)10*sin(PI/2-2*PI*(m_Sec+30)/60.0));//绘制秒针38 SecondPen.DeleteObject();39 MinutePen.DeleteObject();40 HourPen.DeleteObject();41 pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY); //复制图⽚42 memdc.DeleteDC(); //复制临时画布到预览窗⼝43 bitmap.DeleteObject(); //删除图⽚44 ReleaseDC(pDC);45 CDialog::OnTimer(nIDEvent);46 }3.设置时钟位图打开“资源视图”在“资源视图”中添加资源资源类型选择“Bitmap",然后选择”导⼊”,把实现准备好的BMP⽂件导⼊。
【图形时钟c语言vc6.0】c语言,,,,,图形模拟时钟c语言图形模拟时钟20XX-20XX学年第二学期《高级语言程序设计》课程设计报告题目:图形模拟时钟专业:计算机科学与技术班级:14级(2)班姓名:王欣指导教师:陈广宏成绩:计算机学院20XX年5月20日目录1设计内容及要求 (2)1.1设计要求 (2)1.2程序结构流程图 (2)2概要设计 (4)2.1概要分析 (4)2.2数据结构设计.............................(). (6)2.3用法说明 (6)2.4实验结果要求 (7)3设计结果与分析 (7)3.1实验结果 (7)3.2实验结果与分析 (7)4小结 (8)致谢 (8)参考文献 (8)源代码 (9)1设计内容及要求1.1设计要求模拟机械钟表行走;要准确地利用数字显示日期和时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致;按任意键时程序退出。
在屏幕上显示一个图形时钟(用程序绘制一个班于时钟样式相似即可),时间与系统时间一致,且要随着时间的走到准确的走动。
1.2程序结构流程图图1:总程序流程图2:指针转动流程图2概要设计2.1概要分析(1)voiddrawclock函数voiddrawclock(intx,inty,intcolor){intr=150;floatth;setcolor(color);circle(x,y,r);circle(x,y,2);}作用:画表盘(r为表盘的半径,x,y为圆心的坐标。
)(2)voiddrawHand函数voiddrawHand(intx,inty,floatth,intl,intcolor){intx1,y1;x1=x+l*sin(th);y1=y-l*cos(th);setcolor(color);line(x,y,x1,y1);}作用:画指针x:直线起点的横坐标y:直线起点的纵坐标x1:直线终点的横坐标y1:直线终点的纵坐标(3)voidmain()函数Part①:intgdriver=dETEcT,gmode;structtimecurtime;..............类型和最高分辨率floatth_hour,th_min,th_sec; initgraph(&gdriver,&gmode,”“);下页c语言图形模拟时钟Graphdriver---配适器graphmode---显示模式Part②:setbkcolor(0); ....................背景色Part③:while(!kbhit()){drawclock(x0,y0,14); ..................函数()gettime(&curtime);.........得到当前系统时间gotoxy(35,20);...............定位输出位置Part④:if((float)curtime.ti_hourif((float)curtime.ti_hourprintf(“%.0f:”,(float)curti me.ti_hour);}...........输出小时else............下午的时间处理{printf(“Pm”);if((float)curtime.ti_hour-12printf(“%.0f:”,(float)curtime.ti_hour-12); }..........输出小时Part⑤:if((fl oat)curtime.ti_minprintf(“%.0f:”,(float)curtime.ti_min); .......输出分钟(同part④)if((float)curtime.ti_secprintf(“%.0f”,(float)curtime.ti_sec);Part⑥:以下三行计算表针转动角度,以竖直向上为起点,顺时针为正th_sec=(float)curtime.ti_sec*0.1047197551;-------------*(2π/60=0.1047197551)th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0;th_hour=(float)curtime.ti_hour*0.523598775+th_min/12.0;----*(2π/12=0.5235987755)Part⑦:drawHand(x0,y0,th_hour,70,2); ...................画时针drawHand(x0,y0,th_min,110,3); ...................画秒针Part⑧:settextstyle(2,0,3);..............设置字体2:文字的字体;0:文字的方向;3:文字的大小outtextxy(270,160,”madEBY:Sdw”);.............输出字体(270,160)为字体的坐标Part⑨:sleep(1);...........延时一秒后刷新cleardevice();.............清除图形屏幕closegraph().......关闭图形系统,退出图形方式2.2数据结构设计1)是对时钟程序做全面的分析,即对程序要使用的编写方法功能,运行方式进行分析,并做出正确的解决方案。
案例五模拟时钟应用程序以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。
用菜单选项或按钮设置时间和秒表。
时间不必与机器系统时间相同,可任意设置。
模拟时钟示意图1 编程要求(1)为该程序设计一个美观大方的图标。
(2)程序界面设计合理,色彩得体大方,显示正确。
(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。
(4)各指针运动规律正确。
为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。
(5)数字式时钟的时间显示与指针式时钟显示一致。
(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。
(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。
再次按下秒表控制按钮后计时停止,该窗口显示累计时间。
2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。
若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。
采用一个定时器消息可以很容易实现指针联动算法。
由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
目录1 前言 (1)2 需求分析 (1)2.1 要求 (1)2.2 任务 (1)2.3 运行环境 (1)2.4 开发工具 (1)3 分析和设计 (1)3.1 系统分析及设计思路 (1)3.2 主要类图 (3)3.3 函数流程图 (3)4 具体代码实现 (4)5 课程设计总结 (26)5.1 程序运行结果或预期运行结果 (26)5.2 设计结论 (27)参考文献 (27)致谢 (27)1 前言时钟在人们日常生活中必不可少,时钟的原理是怎么样的呢,本程序将模拟一个电子时钟。
为了使程序更加美观,本程序是使用Visual C++编写一个可视化的模拟电子时钟程序。
电子时钟的关键在于延时,为了达到延时的准确性,不受程序执行时间的影响,采用了系统两秒之间的间隔进行延时。
该程序还加入了显示星期功能,在知道1901年每月1号是星期几的情况下,再根据年、月、日即可算出星期几。
2需求分析2.1 要求设计类结构,模拟电子时钟的行走,在屏幕上显示一个活动时钟。
2.2任务(1)显示日期的格式:XXXX年XX月XX日(2)显示时间的格式:XX:XX:XX。
(3)添加显示星期的格式:星期X2.3 运行环境(1)WINDOWS2000/XP系统(2)Visual C++ 6.0编译环境或DEV C++ 5.0编译环境2.4 开发工具C++语言3分析和设计+3.1 系统分析及设计思路为了使程序的显示更加美观,该程序使用了C++可视化程序设计方法进行设计。
在可视化程序设计中,建立了一个MFC单文档应用程序工程,该工程包括了视图类、文档类对话框类和主框架类。
在主框架类中修改窗口等属性,使整个时间的显示更加协调。
模拟电子时钟是一个显示和计时的小程序,因此只要在视图类和文档类添加相关的属性和方法即可完成模拟电子时钟的功能。
文档类定义时钟的相关属性,包括int类型的year、month、day、hour、minute、second,和包括CString类型的str_year、str_month、str_day、str_hour、str_minute、str_second等信息。
VC++课程设计--基于MFC的模拟时钟计科2011级VC++课程设计实验报告题目:基于MFC的模拟时钟班级:计科1104班学号:1108030429姓名:张宝龙日期:2014/1/7课程设计实验报告1、题目:基于MFC的模拟时钟2、编程要点:制作时钟的过程中,首先给时钟创建一个基类CClockElement,还需要派生类CClockBackground,CClockHourHand,CClockMin Hand,CClockSecHand分别控制时钟的背景,时钟的时针,分针,秒针。
3、实现过程:(1)工程、风格、控件与变量表本时钟是基本对话框的时钟,界面简约,便于使用。
控件控件名控件类型Clock 静态文本变量表变量名类型m_crMain COLORREF m_crOther COLORREFm_tmCur CTimem_rcRegion CRectm_nRadius intm_clockBK CClockBackground m_clockHour CClockHourHandm_clockMin CClockMinHandm_clockSec CClockSecHandm_rcClient CRectm_Clock CClockEX(2)主要功能程序代码CClockBackground::CClockBackground() {//为时钟背景定义默认的颜色设置m_crMain=RGB(0,0,255);m_crOther=RGB(0,255,0);}void CClockBackground::Draw(CDC *pDC) {//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS _SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther);CBrush*pOldBrush=pDC->SelectObject(&brMain);CPointptCenter=m_rcRegion.CenterPoint();int nRadius=m_nRadius-8;for(int i=0;i<60;i++){CPoint ptEnd=ptCenter;ptEnd.Offset((int)(nRadius*sin(2*PI*(i% 60)/60)),(int)(-nRadius*cos(2*PI*(i%60)/60)));CRect rcDot(-2,-2,2,2);rcDot.OffsetRect(ptEnd);pDC->Ellipse(rcDot);}//绘制12个小方框,表示12个正点pDC->SelectObject(&penMain);pOldBrush=pDC->SelectObject(&brOth er);for(i=0;i<12;i++){CPoint ptEnd=ptCenter;double fRadian=2*PI*(i%12)/12;ptEnd.Offset((int)(nRadius*sin(fRadian) ),(int)(-nRadius*cos(fRadian)));CRect rcDot(-3,-3,3,3);rcDot.OffsetRect(ptEnd);pDC->Rectangle(rcDot);}//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockHourHand::CClockHourHand(){//定义默认颜色m_crMain=RGB(0,0,128);m_crOther=RGB(128,128,0);}void CClockHourHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain);//确定当前指针的弧度intnTime=(m_tmCur.GetHour()%12)*3600;nTime+=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();doublefRadian=2*PI*nTime/3600/12;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/2;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockMinHand::CClockMinHand(){//定义默认颜色m_crMain=RGB(0,255,100);m_crOther=RGB(128,128,0);}void CClockMinHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain );//确定分针所在位置的弧度intnTime=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();double fRadian=2*PI*nTime/3600;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/4;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockSecHand::CClockSecHand(){//设定秒针的默认颜色m_crMain=RGB(0,200,200);m_crOther=RGB(0,200,200);}void CClockSecHand::Draw(CDC *pDC){int nTime=m_tmCur.GetSecond();CPointptStart=m_rcRegion.CenterPoint();CPoint ptEnd=ptStart;int nRadius=m_nRadius-10;ptEnd.Offset((int)(nRadius*sin (2*PI*nTime/60)),(int)(-nRadius*cos( 2*PI*nTime/60)));CPenpenMain(PS_SOLID,1,m_crMain);CPen*pOldPen=pDC->SelectObject (&penMain);pDC->MoveTo(ptStart);pDC->LineTo(ptEnd);pDC->SelectObject(pOldPen);}void CClockEX::OnTimer(UINT nIDEvent){Invalidate(FALSE);CStatic::OnTimer(nIDEvent);}void CClockEX::OnSize(UINT nType, int cx, int cy){CStatic::OnSize(nType, cx, cy);GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);}void CClockEX::OnPaint(){CPaintDC dc(this); // device context for painting//实现双缓冲绘图---防止屏幕闪烁CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmp;bmp.CreateCompatibleBitmap(&dc ,m_rcClient.Width(),m_rcClient.Heigh t());dcMem.SelectObject(&bmp);DrawClock(&dcMem); //绘制时钟dc.BitBlt(0,0,m_rcClient.Width (),m_rcClient.Height(),&dcMem,0,0,SR CCOPY);}voidCClockEX::PreSubclassWindow(){GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);SetTimer(1,100,NULL);CStatic::PreSubclassWindow();}void CClockEX::DrawClock(CDC *pDC){CTimetmCur=CTime::GetCurrentTime();m_clockBK.SetTime(tmCur);m_clockHour.SetTime(tmCur);m_clockMin.SetTime(tmCur);m_clockSec.SetTime(tmCur);m_clockBK.Draw(pDC);m_clockHour.Draw(pDC);m_clockMin.Draw(pDC);m_clockSec.Draw(pDC);}CClockElement::CClockElement(){m_nRadius=0;m_crMain=RGB(255,0,0);m_crOther=RGB(128,128,0);}voidCClockElement::SetRegion(LPRECT lprcRect){m_rcRegion=lprcRect;m_nRadius=m_rcRegion.Width()/2;if(m_rcRegion.Width()>m_rcRegion.Hei ght()){m_nRadius=m_rcRegion.Height()/2;}}void CClockElement::SetTime(const CTime &tmCur){m_tmCur=tmCur;}voidCClockElement::SetColor(COLORREF crMain,COLORREF crOther){m_crMain=crMain;m_crOther=crOther;}4、运行效果展示:5、自我总结:该小程序是基于MFC中的对话框的,主要针对画笔和画刷的用法,没有涉及连接数据库和算法,完全是为了本学期所学知识的运用,由于时间紧,所以没能深入的探索MFC的奥妙,不过通过本次设计,我对老师课堂上所讲述的关于该类型的知识,有了进一步的了解和掌握,初步的熟悉了画笔和画刷的简单用法,还巩固了MFC类中的基本操作,例如,添加新类,新变量,创建新的对话框,添加控件等方面的知识。
模拟时钟行走课程设计总体要求采用模块儿化程序设计;鼓励可视化编程;源程序中有足够的注释;学生可自行增加新功能模块儿;必须上机调试通过;注重算法运用,优化存储效率与运算效率;需提交源程序及相关文件;目录1 课程任务书2 系统设计3 模块设计3.1 总体结构3.2 流程图3.3 使用的主要函数4 调试及测试1、调试过程中的问题2、调试结果5 设计总结6 心得体会及致7 答辩记录8 教师意见一、课程设计任务书在屏幕上显示一个活动时钟;能模拟机械钟表行走;准确地利用数字显示日期和时间;按任意键时程序退出。
二、系统设计总体结构:在绘图窗口中先画出表盘后获取系统的时间,利用得到的系统时间计算表针的位置,并将时间在屏幕上输出。
每隔一秒读取一次时间,直到键盘有输入为止。
流程图开始初始化绘画窗口画表盘否获取系统时间结束使用的主要函数:setlinestyle 设置画线setcolor 设置颜色line(int x1,int y1,int x2,int y2)画直线circle(int x,int y,int r)画圆outtextxy(int x,int y,char *textstring)在指定位置输出字符initgraph(int x, int y); 初始化绘图窗口setwritemode( ); 设置绘图模式kbhit() 检查是否有键盘输入GetLocalTime(&ti); 获取当前时间sleep() 程序暂停若干时间三、模块设计主要模块功能、源代码及注释:1.计算表针的位置并画出表针void Drawzhizhen(int hour, int minute, int second){double a_hour, a_min, a_sec; // 时、分、秒针的弧度值int x_hour, y_hour, x_min, y_min, x_sec, y_sec; // 时、分、秒针的位置a_sec = second * 2 * PI / 60; // 计算时、分、秒针的弧度值a_min = minute * 2 * PI / 60 + a_sec / 60;a_hour= hour * 2 * PI / 12 + a_min / 12;x_sec = int(120 * sin(a_sec)); y_sec = int(120 * cos(a_sec)); ///计算时、分、秒针的位置x_min = int(100 * sin(a_min)); y_min = int(100 * cos(a_min));x_hour= int(70 * sin(a_hour)); y_hour= int(70 * cos(a_hour));setlinestyle(PS_SOLID, NULL, 10); // 画时针setcolor(BLUE);line(300 + x_hour, 240 - y_hour, 300, 240 );setlinestyle(PS_SOLID, NULL, 5);// 画分针setcolor(GREEN);line(300 + x_min, 240 - y_min, 300, 240 );setlinestyle(PS_SOLID, NULL, 2); // 画秒针setcolor(WHITE);line(300 + x_sec, 240 - y_sec, 300, 240 );}2.画表盘void Drawbiaopan(){int i,l,x1,x2,y1,y2;setbkcolor(1);circle(300,240,180);circle(300,240,185);for(i=0;i<60;i++) /*划钟点上的短线*/ {if(i%5==0)l=15;elsel=5;x1=180*sin(i*6*PI/180)+300;y1=180*cos(i*6*PI/180)+240;x2=(180-l)*sin(i*6*PI/180)+300;y2=(180-l)*cos(i*6*PI/180)+240;line(x1,y1,x2,y2);}outtextxy(300,80,"12") ;outtextxy(300,390,"6");outtextxy(140,230,"9");outtextxy(460,230,"3");outtextxy(380,100,"1");outtextxy(220,100,"11");outtextxy(430,160,"2");outtextxy(430,310,"4");outtextxy(380,370,"5");outtextxy(220,370,"7");outtextxy(160,160,"10");outtextxy(160,310,"8");}3.将获取的整数型时间变量转换成字符型void ch1(int a,int x) //将年转换成字符型并输出{char b,c,d,e;b=(char)(a/1000+48);c=(char)((a%1000)/100+48);d=(char)((a%100)/10+48);e=(char)(a%10+48);outtextxy(x,10,b);outtextxy(x+10,10,c);outtextxy(x+20,10,d);outtextxy(x+30,10,e);}void ch2(int a,int x) //其他时间转换成字符型并输出{char b,c;b=(char)(a/10+48);c=(char)(a%10+48);outtextxy(x,10,b);outtextxy(x+10,10,c);}主函数:void main(){initgraph(640, 480); // 初始化绘图窗口Drawbiaopan(); // 绘制表盘setwritemode(R2_XORPEN); // 设置绘图模式SYSTEMTIME ti; // 定义ti保存当前时间while(!kbhit()) // 按任意键退出钟表程序{GetLocalTime(&ti); // 获取当前时间ch1(ti.wYear,10);outtextxy(50,10,"年"); //输出时间ch2(ti.wMonth,65);outtextxy(85,10,"月");ch2(ti.wDay,100);outtextxy(120,10,"日");ch2(ti.wHour,135);outtextxy(155,10,":");ch2(ti.wMinute,165);outtextxy(185,10,":");ch2(ti.wSecond,195);Drawzhizhen(ti.wHour, ti.wMinute, ti.wSecond); // 画表针Sleep(1000); // 延时 1 秒Drawzhizhen(ti.wHour, ti.wMinute, ti.wSecond); // 画表针}closegraph(); // 关闭绘图窗口}四调试及测试使用vc企业版进行反复调试五设计总结调试过程出现的问题:1.Vc++6.0中没有“graphics.h”,安装turboc.2.0中的函数库EasyX后出现权限问题。
要用C 语言编写一个闹钟程序,你需要按照以下步骤进行:
包含必要的头文件:首先,你需要包含<time.h> 和<unistd.h> 两个头文件。
这两个头文件将为你提供时间和睡眠函数,这些函数是实现闹钟功能所必需的。
输入闹钟时间:接下来,你需要让用户输入闹钟的触发时间。
你可以使用scanf() 函数来获取用户输入。
计算睡眠时间:接下来,你需要计算出当前时间和闹钟触发时间之间的时间差,并使用睡眠函数等待该时间差。
你可以使用time() 函数获取当前时间,并使用difftime() 函数计算时间差。
你还可以使用sleep() 函数来等待相应的时间。
播放提醒声音:最后,你需要在闹钟触发时向用户播放一个提醒声音。
你可以使用system() 函数来执行一个系统命令,播放提醒声音。
示例代码如下:
#include <time.h>
#include <unistd.h>
#include <stdio.h>
int main() {
// 输入闹钟时间
int hour, minute;
printf("请输入闹钟时间(小时。
VC++程序设计课程论文论文题目:电子时钟院系:建筑工程与管理专业:11工程造价班级:3 班姓名:连胜鹏学号:052411333一.程序基本功能编写一个带有“时间”菜单项的单文档应用程序。
“时间”菜单项中分别包含“时”“分”和“秒”3 个选项,选择这些选项,可以在视图窗口中分别显示当前系统时间的小时、分钟及秒。
并创建一个新的工具栏,添加分别与“时”“分”和“秒”3 个菜单相对应的按钮,在工具栏里创建一个“时间”按钮,使得能在状态栏上显示当前的系统时间。
要求:工具栏上的按钮和菜单项的命令要求统一,视图窗口显示的时间为动态显示。
提示:主要涉及菜单栏、工具栏和状态栏资源,使用定时器控制时间。
二.程序设计步骤(1)根据MFC 应用程序的方法,利用MFC App Wizard 创建一个单文档应用程序,命名为7Time;(2)添加菜单项”时间”,并在”时间”下有”时”,”分”,”秒”三个菜单,如图:并修改其ID 值:标识号(ID ) 标题(Caption )消息响应函数时间(&T)ID_VIEW_HOU R时(&H)OnViewHour()ID_VIEW_MINU分(&M)OnViewMinute()TEID_VIEW_SECO ND秒(&S)OnViewSecond()并添加相应函数. 新建新的工具栏:并设置各按钮的ID 标识号(ID ) 消息响应函数 ID_TIME OnToolTime() ID _HOUR OnToolHour() ID _MINUTE OnToolMinute() ID _SECONDOnToolSecond()由于需要新建一个新的工具栏所以到MainFrm.h 中添加:CToolBar m_wndToolBar1;并到MainFrm.cpp 中添加: if (!m_wndToolBar1.Create(this) || !m_wndToolBar1.LoadToolBar(IDR_TimeBAR)){ TRACE0("Failed to create toolbar\n"); return -1; // fail to create}m_wndToolBar1.ModifyStyle(0, TBSTYLE_FLAT);…….m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY); DockControlBarLeftOf(&m_wndToolBar1,&m_wndToolBar);为了实现新的工具栏可以出现在老工具栏的右侧,所以才头文件中添加 void CMainFrame::DockControlBarLeftOf(CToolBar* Bar, CToolBar* LeftOf){CRect rect;DWORD dw;UINT n;RecalcLayout(TRUE);LeftOf->GetWindowRect(&rect);rect.OffsetRect(1,0);dw=LeftOf->GetBarStyle();n = 0;n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;DockControlBar(Bar,n,&rect);}为了实现动态显示时间的效果,所以建立计时器添加计时器实现函数:CDC* pDC=GetDC();CMainFrame *pFrame=(CMainFrame*)AfxGetMainWnd();CString str;CTime tm;if(nIDEvent==1){tm = CTime::GetCurrentTime();str = (CString)tm.Format("时=%H");pDC->TextOut(100,200,str);};if(nIDEvent==2){tm = CTime::GetCurrentTime();str = (CString)tm.Format("分=%M");pDC->TextOut(100,200,str);};if(nIDEvent==3){tm = CTime::GetCurrentTime();str = (CString)tm.Format("秒=%S");pDC->TextOut(100,200,str);};if(nIDEvent==4){tm=CTime::GetCurrentTime();//得到当前时间str=(CString)tm.Format("%H:%M:%S");//转换时间格式pFrame->m_wndStatusBar.SetPaneText(0,str); //显示时钟};接下来添加个按钮的实现函数:KillTimer(1);KillTimer(2);KillTimer(3);//KillTimer(4);CDC* pDC=GetDC();CString str;CTime tm;tm = CTime::GetCurrentTime();str = (CString)tm.Format("时=%H");pDC->TextOut(100,200," ");pDC->TextOut(100,200,str);SetTimer(1,3600000,NULL);//安装定时器,设定为1000毫秒=1秒//KillTimer(1);以相同的方法添加void CMainFrame::OnViewMinute(){KillTimer(1);KillTimer(2);KillTimer(3);//KillTimer(4);CDC* pDC=GetDC();CString str;CTime tm;tm = CTime::GetCurrentTime();str = (CString)tm.Format("分=%M");pDC->TextOut(100,200," ");pDC->TextOut(100,200,str);SetTimer(2,60000,NULL);//安装定时器,设定为1000毫秒=1秒//KillTimer(2);}void CMainFrame::OnViewSecond(){KillTimer(1);KillTimer(2);KillTimer(3);//KillTimer(4);CDC* pDC=GetDC();CString str;CTime tm;tm = CTime::GetCurrentTime();str = (CString)tm.Format("秒=%S");pDC->TextOut(100,200," ");pDC->TextOut(100,200,str);SetTimer(3,1000,NULL);//安装定时器,设定为1000毫秒=1秒}添加工具栏按钮的实现功能:void CMainFrame::OnToolHour(){// TODO: Add your command handler code hereOnViewHour();}void CMainFrame::OnToolMinute(){OnViewMinute();}void CMainFrame::OnToolSecond(){OnViewSecond();}void CMainFrame::OnToolTime(){CMainFrame *pFrame=(CMainFrame*)AfxGetMainWnd();CString str;CTime time;time=CTime::GetCurrentTime();//得到当前时间str=time.Format("%H:%M:%S");//转换时间格式pFrame->m_wndStatusBar.SetPaneText(0,str);//pFrame->m_wndStatusBar.SetPaneText(pFrame->m_mandToIndex,str) //pDC->TextOut(100,200,str);SetTimer(4,1000,NULL);}最后在程序结束时终止计时器4: void CMainFrame::OnClose() {KillTimer(4);CFrameWnd::OnClose();}三.程序运行结果四.实验小结:回顾起此次VC++课程设计,我仍感慨颇多,学到了很多的东西。
用vc时钟课课程设计一、教学目标本节课的教学目标是让 students to understand the basic concept ofvc时钟, learn how to read and writevc时钟 code, and master the use of basic data types, control structures, and input/output functions. In addition, the students should be able to usevc时钟 to create a simple clock program that can display the current time.二、教学内容本节课的教学内容主要包括以下几个部分:1.vc时钟的基本概念和环境搭建2.基本数据类型的使用和运算符3.控制结构:条件语句和循环语句4.输入/输出函数的使用5.创建一个简单的时钟程序三、教学方法为了达到本节课的教学目标,我将采用以下几种教学方法:1.讲授法:通过讲解vc时钟的基本概念和使用方法,让学生了解和掌握vc时钟的基本知识。
2.案例分析法:通过分析一个简单的时钟程序案例,让学生了解如何使用vc时钟创建一个时钟程序。
3.实验法:让学生动手实践,通过编写代码和调试程序来巩固所学的知识。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我将准备以下教学资源:1.教材:vc时钟编程入门2.参考书:vc时钟编程进阶3.多媒体资料:讲解vc时钟的视频教程4.实验设备:计算机和vc时钟编程环境五、教学评估本节课的评估方式将包括以下几个方面:1.平时表现:通过学生在课堂上的参与程度、提问回答、团队合作等表现来评估学生的学习情况。
2.作业:布置相关的编程练习题,要求学生在规定时间内完成,通过作业的完成情况来评估学生的掌握程度。
3.考试:在课程结束后,安排一次考试来评估学生对vc时钟知识的掌握情况。
案例五模拟时钟应用程序以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。
用菜单选项或按钮设置时间和秒表。
时间不必与机器系统时间相同,可任意设置。
模拟时钟示意图1 编程要求(1)为该程序设计一个美观大方的图标。
(2)程序界面设计合理,色彩得体大方,显示正确。
(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。
(4)各指针运动规律正确。
为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。
(5)数字式时钟的时间显示与指针式时钟显示一致。
(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。
(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。
再次按下秒表控制按钮后计时停止,该窗口显示累计时间。
2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。
若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。
采用一个定时器消息可以很容易实现指针联动算法。
由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
案例五模拟时钟应用程序以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。
用菜单选项或按钮设置时间和秒表。
时间不必与机器系统时间相同,可任意设置。
模拟时钟示意图1 编程要求(1)为该程序设计一个美观大方的图标。
(2)程序界面设计合理,色彩得体大方,显示正确。
(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。
(4)各指针运动规律正确。
为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。
(5)数字式时钟的时间显示与指针式时钟显示一致。
(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。
(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。
再次按下秒表控制按钮后计时停止,该窗口显示累计时间。
2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。
若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。
采用一个定时器消息可以很容易实现指针联动算法。
由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接绘制指针。
另外,秒表需要采用单独的定时器消息控制。
3 实现步骤(1)用AppWizard生成一个名为Clock的单文档(SDI)程序框架。
为了简化应用程序,在第四步时去掉Docking toolbar和Initial status bar选择项,其他各选项均可用缺省设置。
(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。
在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。
并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。
为了简化菜单,可删除系统原有的“文件”、“编辑”菜单项。
(3)利用ClassWizard为视图类添加菜单命令处理函数。
进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView 类,在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下Add Function按钮添加成员函数。
ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart ( )、OnStop ( )和OnSettime ( )。
(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。
进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER 和鼠标消息WM_LBUTIONDOWN,按下Add Function按钮添加成员函数。
ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。
(5)使用Developer Studio菜单的Insert / Resource…选项调出Insert Source对话框,为项目添加新的对话框资源。
在对话框属性中,修改对话框名为“时间设定”。
在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件,如下图所示。
对话框通过控件属性,将年、月、日、时、分、秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE 和IDC_SECOND。
(6)设计好这个对话框模板后,利用ClassWizard自动建立对话框类。
进入ClassWizard后,它会发现已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。
按下“OK”按钮,会弹出New Class对话框,在Name栏填写对话框类的名称CSetTimeDlg 后按“OK”按钮,即可为对话框创建一个对应的类。
(7)利用ClassWizard为对话框类添加与各控件对应的数据成员。
选择MemberVariables选项卡,确保Class Name项为对话框CSetTimeDlg 类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable…”按钮,为其添加对应成员变量,如表11.4所示。
表11.4 编辑控件属性最后一列为变量取值范围。
(8)编辑工程的图标资源,在Resource View选项窗口中修改Icon 结点所包含的主框架图标(IDR_MAINFRAME),修改标准图标(32像素×32像素)及小图标(16像素×16像素),从而为该程序设计一个美观大方的图标。
(9)完成以上工作后,即可修改程序框架,添加必要的代码。
4 程序清单按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。
(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_OldHour [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) 在视图类构造函数中增加初始化语句:然后添加下列代码:绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表:在OnDraw函数中添加下面代码:// 用白色覆盖原位置时针请注意将表示时间的整数转换为CString字符串类型的方法以及秒表的显示方法。
另外,watch计数器以1/100秒为计数单位,每达到100则秒数加1。
u 按照下列步骤增加时钟控制代码:①修改Onstart和OnStop函数,设置时钟运动消息。
按比正常时钟快20倍的假定,50ms产生一个消息。
其代码为:②修改OnTimer函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化,其代码为:③添加时间设置对话框代码。
首先在ClockView. cpp文件头部添加下列语句:#include “SetTimeDlg. H”在时间设定对话框类的构造函数中,做如下修改,将初始日期设为2010-7-10:最后,在OnSettime函数中添加代码如下:至此,除秒表外,时钟部分程序设计完成。
u 按以下步骤设计秒表控制程序:在OnLButtonDown函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:程序运行:下图显示了模拟时钟运行的情况。
“启动”和“停止”框控制秒表,时钟用菜单控制。
本题采用标准的SDI程序结构,完全利用视图类实现了这一程序。
利用定时器消息控制时钟运动是本程序的出发点。
利用一个定时器控制时钟,易于实现指针联动规律。
计算指针位置利用了坐标变换和三角函数的知识。
本程序一个较难处理的地方是屏幕重绘,由于完全在OnDraw 函数中实现,因此限制较多。
本程序采取了先覆盖,再重绘的方法。
模拟时钟示意图本程序由于完全在OnDraw函数中实现,因此屏幕重绘较为麻烦。
如果在OnDarw函数中采用“异或”屏幕重绘方式,在程序窗口最大、最小化及移出屏幕时,会显示异常。
解决这一问题较理想的方式是在定时器处理函数OnTimer中采用“异或”方式直接重绘屏幕,而不采用调用Invalidate ( )函数的方式;同时在OnDraw函数中显示指针的最后状态,以便处理程序窗口最大、最小化及移出屏幕的情况。
在OnTimer 函数中直接重绘屏幕需要使用OClientDC类,具体用法与OnDraw函数中的pDC对象基本一致。
另外,本程序的数字时钟没有显示星期和农历,读者可尝试添加进去。