c++模擬時(shí)鐘實(shí)驗(yàn)報(bào)告_第1頁
c++模擬時(shí)鐘實(shí)驗(yàn)報(bào)告_第2頁
c++模擬時(shí)鐘實(shí)驗(yàn)報(bào)告_第3頁
c++模擬時(shí)鐘實(shí)驗(yàn)報(bào)告_第4頁
c++模擬時(shí)鐘實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、集中上機(jī)實(shí)習(xí)報(bào)告指導(dǎo)教師:王利姓 名:趙蕊學(xué) 號:2010211864班 級:0411003時(shí) 間:2012.5模擬時(shí)鐘程序需求分析題目內(nèi)容:編寫一個(gè)模擬時(shí)鐘程序,此程序在屏幕左方有一指針式鐘面,右方 有兩個(gè)矩形框,上面以數(shù)字方式顯示日期和時(shí)間,該時(shí)間應(yīng)與指針顯示 的時(shí)間一致,下方的矩形框作為秒表。用菜單選項(xiàng)或按鈕設(shè)置時(shí)間和秒 表。時(shí)間不必與機(jī)器系統(tǒng)時(shí)間相同,只要可任意設(shè)置即可。題目分析:(1)模擬時(shí)鐘是一種集計(jì)時(shí)器和時(shí)鐘顯示于一體的程序。編寫一 個(gè)指針式時(shí)鐘程序,此程序在屏幕左方有一個(gè)指針式鐘面,右方有兩個(gè) 矩形框,上面以數(shù)字方式顯示日期、星期和時(shí)間。指針式的時(shí)鐘表盤為 圓形,并且圓周上有分

2、布均勻的60個(gè)刻度,刻度要求顯示清楚,鐘面 上有長度不相同的指針,即時(shí)針、分針、秒針,指針的運(yùn)動(dòng)要求具有規(guī) 律性,且為順時(shí)針。數(shù)字鐘顯示時(shí)間的格式是年月日星期時(shí)分秒,小時(shí) 為24進(jìn)制,分鐘和秒是60進(jìn)制,指針式的時(shí)鐘和數(shù)字式的時(shí)鐘顯示的 時(shí)間同步。按下時(shí)鐘控制設(shè)置時(shí)間菜單項(xiàng)可彈出一對話框,用于設(shè)置當(dāng) 前的時(shí)間、日期和星期;按下秒表控制按鈕后,秒表顯示窗中顯示從0 開始的時(shí)間,單位為百分之一秒。再次按下秒表控制按鈕后計(jì)時(shí)停止, 該窗口顯示累計(jì)時(shí)間。(2)本實(shí)驗(yàn)主要涉及到的知識(shí)點(diǎn)有:時(shí)鐘指針運(yùn)動(dòng)算法、屏幕重繪方 法、定時(shí)器消息、鼠標(biāo)消息、菜單命令、對話框、畫筆/畫刷、顯示文 字等。指針運(yùn)動(dòng)算法和屏

3、幕重繪方法是本程序主要難點(diǎn)所在。最終效果如下圖:二概要設(shè)計(jì)1.程序系統(tǒng)模塊劃分模擬時(shí)鐘轉(zhuǎn)動(dòng)程序100指針式時(shí)鐘數(shù)字式時(shí)鐘秒表圖1功能模塊圖東部北部20第一季度第三季度2.程序算法分析本程序不論何種指針,每次轉(zhuǎn)動(dòng)均以n/30弧度(一秒的角度)為基 本單位,且都以表盤中心為轉(zhuǎn)動(dòng)圓心。計(jì)算指針端點(diǎn)(x, y)的公式如 下:x =圓心x坐標(biāo)+指針長度* cos (指針方向角)y =圓心y坐標(biāo)+指針長度* sin (指針方向角)指針長度是指自圓心至指針一個(gè)端點(diǎn)的長度,由于指針要跨越圓心, 因此一個(gè)指針需要計(jì)算兩個(gè)端點(diǎn)。三個(gè)指針的運(yùn)動(dòng)是相關(guān)聯(lián)的,秒針轉(zhuǎn)一圈引起分針運(yùn)動(dòng)一格,分針 每轉(zhuǎn)12格引起時(shí)針運(yùn)動(dòng)一格

4、,而因此應(yīng)該使用一個(gè)定時(shí)器消息來處理 指針的運(yùn)動(dòng)。若用三個(gè)定時(shí)器消息分別處理時(shí)針、分針和秒針的運(yùn)動(dòng), 就會(huì)使問題復(fù)雜化且不易實(shí)現(xiàn)三個(gè)指針聯(lián)動(dòng)的正確規(guī)律。采用一個(gè)定時(shí) 器消息可以很容易實(shí)現(xiàn)指針聯(lián)動(dòng)算法。由于屏幕的重繪速度快,如果采用全屏刪除式重繪則閃爍十分明顯, 顯示效果不佳。本程序采用非刪除式重繪,假定指針將要移動(dòng)一格,則 先采用表盤背景色(這里為淺綠色)重繪原來指針以刪除原來位置的指 針,再采用指針的顏色在當(dāng)前位置繪制指針;如果指針沒有動(dòng),則直接 繪制指針。另外,秒表需要采用單獨(dú)的定時(shí)器消息控制,秒表重繪速度很快,屏幕閃爍明顯,故本程序采用了雙緩沖繪圖。3.系統(tǒng)流程圖詳細(xì)設(shè)計(jì)1 .模塊描述指

5、針式時(shí)鐘指針式的時(shí)鐘表盤為圓形,并且圓周上有分布均勻的12個(gè)數(shù)字刻 度和48個(gè)較小的原點(diǎn)刻度,刻度顯示清楚,用來表示小時(shí)、分鐘和秒 數(shù)。鐘面上有長度不相同的指針,即時(shí)針、分針、秒針,指針的運(yùn)動(dòng) 具有規(guī)律性,為順時(shí)針。數(shù)字式時(shí)鐘數(shù)字鐘顯示時(shí)間的格式是時(shí)分秒,小時(shí)為24進(jìn)制,分鐘和秒是60 進(jìn)制,指針式的時(shí)鐘和數(shù)字式的時(shí)鐘顯示的時(shí)間同步,且倆時(shí)鐘可以 同時(shí)設(shè)置。秒表按下秒表控制按鈕后,秒表顯示窗中顯示從0開始的時(shí)間,單位為 百分之一秒。再次按下秒表控制按鈕后計(jì)時(shí)停止,該窗口顯示累計(jì)時(shí)間。2.函數(shù)描述CPoint p;double angle = nvalue *PI/30 ;p.x = m_Cen

6、ter.x + (int)(nlenth*sin(angle);p.y = m_Center.y - (int)(nlenth*cos(angle);return p;用來得到時(shí)鐘刻度點(diǎn)和時(shí)針、分針、秒針的端點(diǎn)hour = hour*5;hour = hour + minute/12;m_OldHour0 = m_Hour0;m_OldHour1 = m_Hour1;m_Hour0 = GetPoint(int(m_Radious/2),hour);m_Hour1 = GetPoint(7,hour + 30);m_OldMin0 = m_Minute0;m_OldMin1 = m_Minut

7、e1;m_Minute0 = GetPoint(int(m_Radious*7/10),minute);m_Minute1 = GetPoint(10,minute + 30);m_OldSec0 = m_Second0;m_OldSec1 = m_Second1;m_Second0 = GetPoint(int(m_Radious*8/10),second);m_Second1 = GetPoint(30, second + 30);用來得到時(shí)針、分針、秒針的當(dāng)前位置和上一時(shí)刻位置并將其保存CRect rc;CDC dcMem;GetClientRect(&rc);CBitmap bmp;d

8、cMem.CreateCompatibleDC(pDC);bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height();CBitmap *pOldBit二dcMem.SelectObject(&bmp);dcMem.FillSolidRect(rc,RGB(255,255,255);./畫圖代碼pDC-BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY) ;dcMem.DeleteDC();bmp.DeleteObject();利用雙緩沖防止屏幕畫面閃爍實(shí)現(xiàn)環(huán)境及工具Win7環(huán)境下VC+ 6.0

9、 MFC程序測試1.對時(shí)間設(shè)置測試按下確定后測試其設(shè)置為需要設(shè)置的時(shí)間,并正常運(yùn)行。2.對秒表測試點(diǎn)下啟動(dòng)后它正常運(yùn)行;點(diǎn)下停止后它停止運(yùn)行并記錄當(dāng)前累積時(shí)間。再次按下啟動(dòng)按鈕時(shí)它計(jì)時(shí)清零并重新開始計(jì)時(shí)。3.整體3部分測試同時(shí)運(yùn)行時(shí)三部分均正常運(yùn)行,并且屏幕也不閃爍。六心得體會(huì)通過本次實(shí)驗(yàn),對C+編程有了進(jìn)一步的了解和能夠更加熟練的 編程,還學(xué)習(xí)了 MFC的一些畫圖處理函數(shù),以及一些運(yùn)行機(jī)理,能夠基 本掌握用MFC畫圖,且能夠?qū)崿F(xiàn)一些基本的功能。在本次設(shè)計(jì)的初期,只實(shí)現(xiàn)了小部分功能,對畫圖及其不了解,且 對窗口設(shè)置的不合理倒是畫面相當(dāng)丑陋,后來通過請教同學(xué)、老師、上 網(wǎng)查資料,最終設(shè)計(jì)出比較滿

10、意的畫面。還有,本次設(shè)計(jì)的秒表設(shè)計(jì),由于它的刷新頻率太高,導(dǎo)致屏幕閃 爍嚴(yán)重,畫面看起來很不舒暢,后面經(jīng)查資料發(fā)現(xiàn)雙緩沖技術(shù)能夠解決 這一問題,也將這個(gè)問題成功解決。覺得本次設(shè)計(jì)中的采用不同的計(jì)時(shí)器來控制不同的模塊效果比較 好,對每一模塊進(jìn)行獨(dú)立的控制很短單,而且思路清晰。總之在本次實(shí)驗(yàn)中我學(xué)到了很多知識(shí),而且培養(yǎng)了自己的自學(xué)能力, 逼著自己進(jìn)行查閱大量的資料。在本次實(shí)驗(yàn)中自己對程序一直修改,一 直增加功能和改善畫面,大大的提高了自己的動(dòng)手能力。附:源代碼及詳細(xì)注釋(由于使用的MFC向?qū)纬晒こ讨桓?部分核心代碼)在 匐ClockView.h 中加int year;int month;int

11、day;int hour;int second;int minute;int watch;int wday;CPenm_HouPen,m_NoHouPen,m_MinPen,m_NoMinPen,m_SecPen,m_NoSecPen,m_circle,m_RectPen;HBRUSHm_HurkBrush,m_CircleBrush,m_RecBrush,m_RectBrush,m_RectBrush1 ,m_RectBrush2;CPoint m_Center;double m_Radious;CPoint m_Hour2,m_OldHour2;CPoint m_Minute2,m_Old

12、Min2;CPoint m_Second2,m_OldSec2;CRect m_WatchStart;CRect m_WatchStop;void SetClock(int hour,int minute,int second);CPoint GetPoint(int nlenth,int nvalue);#include stdafx.h#include Clock.h#define PI 3.14159265#include#includeSetTimeDlg.h#include ClockDoc.h#include ClockView.h#include#ifdef _DEBUG#def

13、ine new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif固 SetTimeDIg.cpp | 中初始化設(shè)置變量/ CSetTimeDlg dialogCSetTimeDlg:CSetTimeDlg(CWnd* pParent /*二NULL*/):CDialog(CSetTimeDlg:IDD, pParent)(/AFX_DATA_INIT(CSetTimeDlg) long now = time(NULL);tm local = *localtime(&now);m_Day = local.tm_mday;

14、m_Hour = local.tm_hour;m_Minute = local.tm_min;m_Month = local.tm_mon + 1;m_Second = local.tm_sec;m_Year = local.tm_year+1900;m_Wday = local.tm_wday;/AFX_DATA_INITvoid CSetTimeDlg:DoDataExchange(CDataExchange* pDX)(CDialog:DoDataExchange(pDX);/(AFX_DATA_MAP(CSetTimeDlg)DDX_Text(pDX, ID_DAY, m_Day);D

15、DV_MinMaxInt(pDX, m_Day, 1, 31);DDX_Text(pDX, ID_HOUR, m_Hour);DDV_MinMaxInt(pDX, m_Hour, 0, 23);DDX_Text(pDX, ID_MINUTE, m_Minute);DDV_MinMaxInt(pDX, m_Minute, 0, 59);DDX_Text(pDX, ID_MONTH, m_Month);DDV_MinMaxInt(pDX, m_Month, 1, 12);DDX_Text(pDX, ID_SECOND, m_Second);DDV_MinMaxInt(pDX, m_Second,

16、0, 59);DDX_Text(pDX, ID_YEAR, m_Year);DDV_MinMaxInt(pDX, m_Year, 0, 3000);DDX_Text(pDX, ID_WDAY, m_Wday);DDV_MinMaxInt(pDX, m_Wday, 0, 6);/AFX_DATA_MAP/ CClockViewIMPLEMENT_DYNCREATE(CClockView, CView)BEGIN_MESSAGE_MAP(CClockView, CView)/(AFX_MSG_MAP(CClockView)ON_COMMAND(ID_START, OnStart)ON_COMMAN

17、D(ID_STOP, OnStop)ON_COMMAND(ID_STETIME, OnStetime)ON_WM_TIMER()ON_WM_LBUTTONDOWN()/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()/ CCloc

18、kView construction/destructionCClockView:CClockView()/初始化時(shí)間為系統(tǒng)時(shí)間long now = time(NULL);tm local = *localtime(&now);year = local.tm_year+1900;month = local.tm_mon + 1;day = local.tm_mday;minute = local.tm_min;hour = local.tm_hour;second = local.tm_sec;wday = local.tm_wday;創(chuàng)建畫筆、畫刷m_HouPen.CreatePen(PS_

19、SOLID,5 ,RGB(255,50,0);m_NoHouPen.CreatePen(PS_SOLID,5 ,RGB( 204,255, 102 );m_MinPen.CreatePen(PS_SOLID,3 ,RGB(0,0,255);m_NoMinPen.CreatePen(PS_SOLID,3 ,RGB( 204,255, 102 );m_SecPen.CreatePen(PS_SOLID,1 ,RGB(0,0,0);m_NoSecPen.CreatePen(PS_SOLID,1 ,RGB( 204,255, 102 );m_circle.CreatePen(PS_SOLID,2 ,R

20、GB(0,0,0);m_RectPen.CreatePen(PS_SOLID,3 ,RGB(204,102,0);m_HurkBrush = CreateSolidBrush( RGB( 255,0, 0 );m_CircleBrush = CreateSolidBrush( RGB( 204,255, 102 );m_RecBrush = CreateSolidBrush( RGB( 255,255, 51 );m_RectBrush = CreateSolidBrush( RGB( 102,51, 0 );m_RectBrush1 = CreateSolidBrush( RGB( 255,

21、51, 0);m_RectBrush2 = CreateSolidBrush( RGB( 0,102, 204);m_Center.x = 200;m_Center.y = 200;m_Radious = 185;SetClock(hour,minute,second);watch = 0;m_WatchStart 二CRect(480,310,560,340);m_WatchStop= CRect(590,310,670,340);/ TODO: add construction code hereCClockView:CClockView()(void CClockView:SetCloc

22、k(int hour,int minute,int second)(hour = hour*5;/時(shí)針每過1小時(shí)轉(zhuǎn)5*PI/3hour = hour + minute/12; /時(shí)針每過 12 分鐘轉(zhuǎn) PI/3保存時(shí)鐘原位置m_OldHour0 = m_Hour0;m_OldHour1 = m_Hour1;計(jì)算時(shí)針當(dāng)前位置m_Hour0 = GetPoint(int(m_Radious/2),hour);m_Hour1 = GetPoint(7,hour + 30);/保存分針位置m_OldMin0 = m_Minute0;m_OldMin1 = m_Minute1;/計(jì)算分針位置m_Minu

23、te0 = GetPoint(int(m_Radious*7/10),minute);m_Minute1 = GetPoint(10,minute + 30);/保存秒針位置m_OldSec0 = m_Second0;m_OldSec1 = m_Second1;/計(jì)算秒針位置m_Second0 = GetPoint(int(m_Radious*8/10),second);m_Second1 = GetPoint(30, second + 30);CPoint CClockView:GetPoint(int nlenth,int nvalue)/用來計(jì)算指針的倆端點(diǎn)的位置和表盤上刻度的位置CPo

24、int p;double angle = nvalue *PI/30 ;p.x = m_Center.x + (int)(nlenth*sin(angle);p.y = m_Center.y - (int)(nlenth*cos(angle);return p;BOOL CClockView:PreCreateWindow(CREATESTRUCT& cs)(/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CClo

25、ckView drawing/* 畫表 */void CClockView:OnDraw(CDC* pDC)(SetTimer(1,1000,NULL);CClockDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect rc;CDC dcMem;GetClientRect(&rc);CBitmap bmp; /內(nèi)存中承載臨時(shí)圖象的位圖dcMem.CreateCompatibleDC(pDC); /依附窗口 DC 創(chuàng)建兼容內(nèi)存DC/創(chuàng)建兼容位圖(必須用pDC創(chuàng)建,否

26、則畫出的圖形變成黑色)bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height();CBitmap *pOldBit二dcMem.SelectObject(&bmp);/按原來背景填充客戶區(qū),不然會(huì)是黑色dcMem.FillSolidRect(rc,RGB(255,255,255);/畫圖,添加你要畫圖的代碼,不過用dcMem畫,而不是pDc/畫表盤最外面的大圓并填充顏色dcMem.SelectObject(m_circle);dcMem.Ellipse(m_Center.x-195,m_Center.y-195,m_Center.x + 195,

27、m_Center.y + 195);dcMem.SelectObject(m_CircleBrush);dcMem.Ellipse(m_Center.x-195,m_Center.y-195,m_Center.x + 195,m_Center.y + 195);/畫60個(gè)刻度for(int i = 0; i BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);/將內(nèi)存DC上的圖象拷貝到前臺(tái)繪圖完成后的清理dcMem.DeleteDC();/刪除 DCbmp.DeleteObject(); /刪除位圖/ CClockView printin

28、gBOOL CClockView:OnPreparePrinting(CPrintInfo* pInfo)(/ default preparationreturn DoPreparePrinting(plnfo);void CClockView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)(/ TODO: add extra initialization before printingvoid CClockView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)(/ TODO: a

29、dd cleanup after printing/ / CClockView diagnostics#ifdef _DEBUGvoid CClockView:AssertValid() const(CView:AssertValid();void CClockView:Dump(CDumpContext& dc) const(CView:Dump(dc);CClockDoc* CClockView:GetDocument() / non-debug version is inline(ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CClockDoc) ;

30、return (CClockDoc*)m_pDocument;#endif /_DEBUG/ / CClockView message handlers/菜單系統(tǒng)時(shí)間void CClockView:OnStart()/ TODO: Add your command handler code here long now = time(NULL);tm local = *localtime(&now);year = local.tm_year+1900;month = local.tm_mon + 1;day = local.tm_mday;minute = local.tm_min;hour =

31、 local.tm_hour;second = local.tm_sec;wday = local.tm_wday;SetTimer(1,1000,NULL);/菜單時(shí)間停止void CClockView:OnStop()(/ TODO: Add your command handler code here KillTimer(1);/菜單時(shí)間設(shè)置void CClockView:OnStetime()(/ TODO: Add your command handler code hereCSetTimeDlg SetDlg;if(SetDlg.DoModal()=IDOK)( day = SetDlg.m_Day ;hour = SetDlg.m_Hour ;minute = SetDlg.m_Minute;month = SetDlg.m_Month;second = SetDlg.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論