1、网络程序设计报告班级:计算机网络1班学号:200902220110姓名:廖维海所作课题:模拟时钟指导老师:胡庆辉二零一一年六月二十五日(另外:想要该MFC工程文件,在Q:450016913上面留言,到时候发给你!)MFC模拟时钟程序报告一、实验目的:基于学习了MFC的WINDOWS应用程序设计,特别鉴于此,所以用MFC工程编写一个模拟时钟程序,用来巩固自己的知识。该程序初始界面为在屏幕左方有一个指针式钟面,右方有一个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,用菜单选项或按钮设置时间和秒表。二、问题分析:本程序所涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消
2、息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。指针运动算法和屏幕重绘方法是本程序主要难点所在。三、程序基本要求:(1)为该程序设计一个美观大方的图标。(2)程序界面设计合理,色彩得体大方,显示正确。(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。(4)各指针运动规律正确。由于时间有限,所以设计之初,时钟速度应比实际时间快20倍,即1小时相当于3分钟。(5)数字式时钟的时间显示与指针式时钟显示一致。(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。四、运行环境与参考文献:环境:Windows XP操作系统下的Microsoft Visual C+ 6.0参
3、考文献:Visual C+编程技巧精选500例五、软件图结构:否启动时钟时钟初始化获取当前时间绘制秒针、分针、时针退出按下功能键是六、运行后的界面:1、启动时界面:2、停止时的界面:3、时钟设置:主要源代码:/ ClockView.cpp : implementation of the CClockView class/#include stdafx.h#include Clock.h#include ClockDoc.h#include ClockView.h#include math.h#define PI 3.14159265#include SetTimeDlg.h#ifdef _DE
4、BUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CClockViewIMPLEMENT_DYNCREATE(CClockView, CView)BEGIN_MESSAGE_MAP(CClockView, CView)/AFX_MSG_MAP(CClockView)ON_COMMAND(ID_START, OnStart)ON_COMMAND(ID_STOP, OnStop)ON_WM_LBUTTONDOWN()ON_WM_TIMER()ON_COMMAND(ID_SETTIME, On
5、Settime)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CClockView construction/destructionCClockView:CClockView()/ TODO: add construct
6、ion code here / 设定时间year = 2004;month = 1;day = 1;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
7、 (250, 250, 0) ); / 设定表心位置m_Center. x = 200;m_Center. y = 200; / 设定时钟半径m_Radius = 200; / 计算指针位置 SetClock (hour, minute, second); / 设定秒表计数器及按钮位置watch = 0;m_WatchStart = CRect (480, 310, 560, 340); / 启动钮m_WatchStop = CRect (590, 310, 670, 340); / 停止钮CClockView:CClockView()BOOL CClockView:PreCreateWind
8、ow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CClockView drawingvoid CClockView:OnDraw(CDC* pDC)CClockDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/ 绘制表盘上的标记pDC-SelectOb
9、ject(m_MarkBrush);for(int i=0;iRectangle(pt.x-5,pt.y-5,pt.x+5,pt.y+5);elsepDC-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_OldHour 0 );pDC-LineTo(m_OldHour 1 );pDC-SetROP2(R2_COPYPEN); /时针绘制pDC-MoveTo(
10、m_Hour0);pDC-LineTo(m_Hour1);else / 时针绘制pDC-MoveTo(m_Hour0);pDC-LineTo(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);else/ 分针
11、绘制pDC-MoveTo(m_Minute0);pDC-LineTo(m_Minute1); / 用白色覆盖原位置秒针pDC-SelectObject(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)
12、;pDC-TextOut(535,20,当前时间);CString m_Date,m_Time;m_Date.Format (% 4d年%4d月%4d日,year,month,day);pDC-TextOut(510,70,m_Date);m_Time.Format(%4d点%4d分%4d秒,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)%
13、60;int Min=(watch/100)/60;m_Time.Format(% 02d: % 02d: % 02d,Min,Sec,minSec);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,停止);/ CClockView printing
14、BOOL CClockView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CClockView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CClockView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add c
15、leanup after printing/ CClockView diagnostics#ifdef _DEBUGvoid CClockView:AssertValid() constCView:AssertValid();void CClockView:Dump(CDumpContext& dc) constCView:Dump(dc);CClockDoc* CClockView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CClockDoc);return (CC
16、lockDoc*)m_pDocument;#endif /_DEBUG/ CClockView message handlers/计算各个指针位置的函数void CClockView:SetClock(int hour, int minute, int second)hour=hour*5;hour=hour+minute/12; / 保存时针原位置m_OldHour 0 = m_Hour0;m_OldHour 1 = m_Hour1; / 计算时针当前位置m_Hour0= GetPoint(int(m_Radius/2),hour);m_Hour1= GetPoint(7,hour + 30
17、); / 保存分针原位置m_OldMin0= m_Minute0;m_OldMin1= m_Minute1; / 计算分针当前位置m_Minute0=GetPoint(int(m_Radius*7/10), minute);m_Minute1=GetPoint(10, minute+30); / 保存秒针原位置m_OldSec 0 = m_Second 0;m_OldSec 1 = m_Second 1; / 计算秒针当前位置m_Second 0= GetPoint (int(m_Radius * 8/10), second);m_Second 1 = GetPoint (30, second
18、 + 30); / 计算以表心为原点的指针的端点位置CPoint CClockView :GetPoint (int nLenth, int nValue)CPoint p;double angle = nValue* PI /30-PI/2;p.x = m_Center.x + (int) (nLenth * cos(angle);p.y = m_Center.y + (int) (nLenth * sin(angle);return p;void CClockView:OnStart() / TODO: Add your command handler code hereSetTimer
19、(1, 50, NULL);void CClockView:OnStop() / TODO: Add your command handler code hereKillTimer (1);void CClockView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCView:OnLButtonDown(nFlags, point);void CClockView:OnTimer(UINT nIDEvent) / TODO: Add
20、your message handler code here and/or call defaultif (nIDEvent = 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;month+; / 月增加break;case 4: / 小月ca
21、se 6:case 9:case 11:if (day30)day=1;month+; / 月增加break;case 2:if (year%4 =0 & day29) / 润二月day=1;month+; / 月增加if (year%4!=0 & day28) / 二月day=1;month+;break;if (month 12) / 年增加year+;month=1;SetClock (hour, minute, second);Invalidate (false); / 秒表定时器消息处理if (nIDEvent = 2)watch+;Invalidate (false);CView:
22、OnTimer(nIDEvent);void CClockView:OnSettime() / TODO: Add your command handler code hereCSetTimeDlg SetDlg;if (SetDlg.DoModal ()=IDOK)year=SetDlg.m_Year;month= SetDlg.m_Month;day= SetDlg.m_Day;hour=SetDlg.m_Hour;minute=SetDlg.m_Minute;second=SetDlg.m_Second; / 计算各指针位置SetClock (hour,minute,second);Invalidate (true);