指針式時鐘課程設計報告.docx_第1頁
指針式時鐘課程設計報告.docx_第2頁
指針式時鐘課程設計報告.docx_第3頁
指針式時鐘課程設計報告.docx_第4頁
指針式時鐘課程設計報告.docx_第5頁
免費預覽已結束,剩余13頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

青島理工大學C+面向對象課程設計報告院(系): 計算機工程學院 專業(yè): 網(wǎng)絡工程 學生姓名: 趙建 班級: 網(wǎng)絡081 學號: 題目: 指針式時鐘 起訖日期: 2011.7.52011.7.14 設計地點: 學院機房101 指導老師: 吳 萬 春 完成日期:2011年7月14日一、 課程設計目的時鐘幾乎是每個人生活中必備的生活用品。時鐘雖小確非常重要。一款良好的時鐘可以給人們帶來極大的便利。當然,現(xiàn)在關于時鐘的各種應用程序層出不求,我的目的是設計一款界面簡單、方便易用、功能相對豐富的指針式時鐘程序。為了達到上述目標,以及課程設計的要求,結合自己自身的情況,選擇了PC平臺、Windows操作系統(tǒng)、Visual C+ 6.0開發(fā)平臺、MFC框架來實現(xiàn)自己的程序。而且希望能通過自己這款小應用程序的設計,來掌握面向對象的程序設計方法,了解C+面向對象的設計方法和技巧,有效地、深刻地理解課程內(nèi)容,體會理論、方法和設計原則;培養(yǎng)分析實際問題和解決問題的能力,具備使用面向對象程序設計開發(fā)工具設計實際系統(tǒng)的能力。二、 課程設計內(nèi)容及要求程序所實現(xiàn)的功能:運行界面是一指針式時鐘,包括時分秒三個指針,有12個鐘點的顯示,并通過指針的轉動來實時更新時間。同時可以顯示相應時間的數(shù)字鐘形式。通過菜單可以實現(xiàn)鬧鈴功能、表盤背景、指針顏色設置、倒計時等功能。同時為程序窗口增加了一張精美圖片作為背景三、 系統(tǒng)分析與設計1、 系統(tǒng)分析為了使程序的顯示更加美觀,該程序使用了C+可視化程序設計方法進行設計。在可視化程序設計中,建立了一個MFC單文檔應用程序工程,該工程包括了視圖類、文檔類對話框類和主框架類。在主框架類中修改窗口等屬性,使整個時間的顯示更加協(xié)調(diào)。模擬電子時鐘是一個顯示和計時的小程序,因此只要在視圖類和文檔類添加相關的屬性和方法即可完成模擬電子時鐘的功能。文檔類定義時鐘的相關屬性,包括int類型的year、month、day、hour、minute、second,和包括CString類型的str_year、str_month、str_day、str_hour、str_minute、str_second等信息。int類型的時間日期屬性用以計算,CSrting類型的時間日期屬性用以顯示,通過CString類中的成員函數(shù)Formart可以把int型的數(shù)據(jù)轉成CString型的。視圖類實現(xiàn)時鐘的主要功能,在該類的OnDraw函數(shù)里面對時間日期進行顯示輸出。向窗口輸出信息時,為了保證高刷新率下繪圖不閃爍,使用內(nèi)存繪圖的方法,在內(nèi)存中創(chuàng)建一個與屏幕繪圖區(qū)域一致的對象,使得重繪視圖時可以大大提高運行速度。為了使計時能夠達到幾乎無誤差,使用了一個獲取系統(tǒng)兩秒間隔作為計時間隔的方法,使得計時間隔和系統(tǒng)時間間隔一致。每次重繪視圖的時候都重新獲取系統(tǒng)時間,當該兩次獲得的秒不一致時,就對時間加一秒。通過一個計時器消息,使視圖50ms刷新一次,以保證時間的準確性。在視圖類中需要添加幾個方法:用于計算時間的方法RunTime()、計算星期的方法Week()、int型轉CString型的方法Change()、獲取系統(tǒng)時間的方法GetDateTime()、重獲系統(tǒng)時間方法OnReset()和計時器消息。在計算時間日期的時候,每達到1秒的時候對second進行加1,然后判斷是否達到60秒,達到的話minute就加1,同樣的方法對hour、day、month和year進行計算,在對day計數(shù)時,考慮到大小月和閏年,對day進行加1時,判斷是哪一月和是否為閏年。在確定年、月、日之后,使用函數(shù)Week()進行對星期幾的計算,根據(jù)1901年每月1號是星期幾可以得出現(xiàn)在是星期幾。在這個程序中,還使用了一個對話框類,使用對話框來對時間日期的設置。在菜單欄里添加一個“設置時間”的選項和一個菜單消息,當點擊這個選項就會彈出設置時間日期的對話框,對話框中編輯控件設定了每個值的取值范圍,從而對輸入錯誤進行排除。2、 系統(tǒng)設計2.1 模塊設計主要類圖 時鐘程序時間查看功能時鐘工作狀態(tài)設置功能個性化顏色設置功能開始工作暫停工作倒計時功能表盤顏色設置功能時針顏色設置分鐘顏色設置鬧鈴功能秒針顏色設置各模塊關系圖畫出主程序及其主要模塊的流程圖:開始用圖片來填充背景窗口和系統(tǒng)時間同步時鐘功能選擇繪制時鐘指針制作數(shù)字時鐘繪制表盤刻度關閉 結束2.2算法流程圖OnDraw函數(shù)流程圖四、 系統(tǒng)測試與調(diào)試分析1、系統(tǒng)測試測試說明測試名稱指針式時鐘測試目的驗證軟件的時間功能測試技術單元測試測試方法黑盒測試法測試用例測試內(nèi)容顯示時間和系統(tǒng)時間對比測試步驟運行程序測試數(shù)據(jù)預期結果顯示時間和系統(tǒng)時間一致測試結果與預期相符測試說明測試名稱指針式時鐘測試目的驗證鬧鐘功能測試技術單元測試測試方法黑盒測試法測試用例測試內(nèi)容鬧鐘功能 時間測試步驟正確輸入鬧鐘時間正確輸入鬧鐘時間測試數(shù)據(jù)當前時間下一分鐘的時間預期結果立即報時時間到后鬧鐘報時測試結果與預期相符與預期相符測試說明測試名稱指針式時鐘測試目的驗證倒計時功能測試技術單元測試測試方法黑盒測試法測試用例測試內(nèi)容倒計時功能測試步驟正確時間測試數(shù)據(jù)隨意輸入時間 預期結果從輸入的時間開始倒計時測試結果與預期相符測試說明測試名稱指針式時鐘測試目的驗證改換顏色測試技術單元測試測試方法黑盒測試法測試用例測試內(nèi)容換指針顏色功能測試步驟選擇換表盤顏色選擇換指針顏色測試數(shù)據(jù)紅色時針藍色 分針黑色 秒針綠色預期結果表盤顏色變?yōu)榧t時針藍色 分針黑色 秒針綠色測試結果與預期相符與預期相符2調(diào)試分析程序的調(diào)試過程會發(fā)現(xiàn)很多設計程序過程中的漏洞,也會有很多bug出現(xiàn),需要仔細的不斷調(diào)試才能盡量的把程序調(diào)試的完美,我的程序調(diào)試的過程中出現(xiàn)的問題較多,現(xiàn)列舉幾個比較有代表性的,希望供其他人參考1、 我最初想到的是設計出一個不依靠讀取系統(tǒng)時間就能獨立運行的時鐘,但是,個人能力實在有限,設計了一段時間還是沒有頭緒,只能投機取巧的讀取系統(tǒng)時間代替了,這樣的話一些個性話的功能就不能夠實現(xiàn)了,像把一分鐘設置成120秒,每小時30分鐘等2、 目前的程序雖然能正常運行,但是,對于一些錯誤是不能反映出來的,像輸入鬧鐘時間,如果輸入的范圍不對的話也不能給出提示3、 鬧鐘的時間輸入因為沒有秒的限制,如果是當前時間的話,目前的程序會直接報時,應該可以改成當前時間不報時的五、用戶手冊1、windows系統(tǒng) vc+6.0設計2、本程序不需要安裝使用,直接運行即可彈出時鐘對話框3、圖1 時鐘主界面圖2 程序功能界面進入程序后會彈出圖1界面顯示系統(tǒng)時間,點擊設置按鈕可以出現(xiàn)圖2功能列表 圖3 鬧鐘時間設置界面 圖4 倒計時時間設置界面打開功能列表可以選擇各個功能,圖3為選擇鬧鐘功能彈出的對話框,圖4為選擇倒計時功能彈出的對話框圖5 表盤及指針顏色設置界面選擇設置表盤或者各指針顏色時都會彈出圖5,選擇喜歡的顏色點擊確定后即可改變顏色六、程序清單(1): /視圖類的構造函數(shù)CShejiView:CShejiView()/ TODO: add construction code hereCBitmap bmp;/定義一個位圖類型的變量。bmp.LoadBitmap(IDB_BITMAP1); /加載位圖 m_brushBackground.CreatePatternBrush(&bmp);/創(chuàng)建位圖畫刷。CTime curtime = CTime:GetCurrentTime();/同步系統(tǒng)時間。m_hour = curtime.GetHour();m_minute = curtime.GetMinute();m_second = curtime.GetSecond();flag=0;/時鐘正常工作狀態(tài)flag2=1;/倒計時無效;hour=-1;minute=-1;set=0;(2)/ondraw()函數(shù)進行繪制void CShejiView:OnDraw(CDC* pDC)CShejiDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect rect;GetClientRect(rect);/取得客戶區(qū)域 pDC-FillRect(rect,&m_brushBackground); /用背景畫刷填充區(qū)域,而我們在mbrushbackground里加載了位圖,所以理所當然就變成了我們設置的圖片/畫表盤,標注刻度CRect client;GetClientRect(&client);int centerX = client.Width()/2;int centerY = client.Height()/2;int clockRadius = centerX centerY ? centerY : centerX;/用較小的一個作為鐘表的半徑,避免半徑太大矩形放不開clockRadius = clockRadius * 0.9;int keduDRadius = clockRadius * 0.85;int keduXRadius = clockRadius * 0.95;int hourRadius = clockRadius * 0.3;/時針半徑int minuteRadius = clockRadius * 0.5;/分針半徑int secondRadius = clockRadius * 0.7;/秒針半徑/CPen clockPen(PS_SOLID, 2, RGB(0,0,255); CPen clockPen(PS_SOLID, 2, bpcolor);/配合下面的執(zhí)行代碼,使用自己定義的畫筆來設置表盤的顏色CPen * oldPen = pDC-SelectObject(&clockPen);/恢復到原來的畫筆/標注刻度for(int i = 0; iMoveTo(centerX + keduDRadius * cos(i * 30 * PI / 180), centerY + keduDRadius * sin(i * 30 * PI / 180);pDC-LineTo(centerX + clockRadius * cos(i * 30 * PI / 180), centerY + clockRadius * sin(i * 30 * PI / 180);for(int j = 0; jMoveTo(centerX + keduXRadius * cos(j * 6 * PI / 180),/keduxradius是0.95,更加接近圓周,所以比起時針當然理所當然的更短 centerY + keduXRadius * sin(j * 6 * PI / 180);pDC-LineTo(centerX + clockRadius * cos(j * 6 * PI / 180), centerY + clockRadius * sin(j * 6 * PI / 180);pDC-SelectObject(oldPen);/調(diào)節(jié)時,分,秒針角度顯示的關系double secondRadians = m_second * 2 * PI / 60;/一個圓周是2pi,共有60秒,所以一秒是左邊這個表達式,用的是弧度值double minuteRadians = m_minute * 2 * PI / 60 + secondRadians / 60;/秒針每動一格,其效果等同于分針動1/60格double hourRadians = m_hour * 2 * PI / 12 + minuteRadians*5 / 60; /依照所計算的角度畫出時,分,秒針/CPen secondPen(PS_SOLID, 2, RGB(0,255,0);CPen secondPen(PS_SOLID,2,secondcolor);oldPen = pDC-SelectObject(&secondPen);pDC-MoveTo(centerX , centerY);/時針的起點在中心pDC-LineTo(centerX + double(secondRadius) * sin(secondRadians), centerY - double(secondRadius) * cos(secondRadians);pDC-SelectObject(oldPen); /CPen minutePen(PS_SOLID, 4, RGB(255,255,0);CPen minutePen(PS_SOLID, 4, minutecolor);oldPen = pDC-SelectObject(&minutePen);pDC-MoveTo(centerX , centerY);pDC-LineTo(centerX + double(minuteRadius) * sin(minuteRadians), centerY - double(minuteRadius) * cos(minuteRadians);pDC-SelectObject(oldPen);/CPen hourPen(PS_SOLID, 8, RGB(255,0,255);CPen hourPen(PS_SOLID,8,hourcolor);oldPen = pDC-SelectObject(&hourPen);pDC-MoveTo(centerX , centerY);pDC-LineTo(centerX + double(hourRadius) * sin(hourRadians), centerY - double(hourRadius) * cos(hourRadians);pDC-SelectObject(oldPen);/畫表盤中心CBrush abrush(RGB(255,0,0);CBrush * oldbrush = pDC-SelectObject(&abrush);pDC-Ellipse(centerX - 8, centerY - 8 , centerX +8, centerY +8);/最左是圓心減8,最右是圓心加8pDC-SelectObject(oldbrush);/定義數(shù)字時鐘的位置,顯示當前時間CRect dianzibiao(centerX-52,centerY*6/15, centerX+52,centerY);CString shijian;char temp13, temp23, temp33;itoa(m_hour, temp1, 10);itoa(m_minute, temp2, 10);/ITOA功能,把一整書轉換為字符串,10進制itoa(m_second, temp3, 10);shijian.Insert(0, temp1);/temp1用來保存小時,temp2用來保存分鐘,temp3用來保存秒 shijian += :;/時和分之間的帽號 if(m_minute 10)shijian += 0;/如果分鐘小于10,則在前面加上字符“0”,以用來顯示 “07”、“08”之類的形式shijian += temp2;shijian += :;if(m_second SetBkMode (TRANSPARENT);pDC-SetTextColor(RGB(255,0,0); pDC-DrawText(shijian,&dianzibiao,DT_CENTER);/dianzibiao是一個矩形,shijian是我們轉換后的cstring類型/設置文本的字體大小,顏色CString b(指針式時鐘-陳慶敬);CFont abc;abc.CreateFont(15, / nHeight 0, / nWidth 0, / nEscapement 0, / nOrientation FW_ULTRABOLD, / nWeight FALSE, / bItalic FALSE, / bUnderline 0, / cStrikeOut ANSI_CHARSET, / nCharSet OUT_DEFAULT_PRECIS, / nOutPrecision CLIP_DEFAULT_PRECIS, / nClipPrecision DEFAULT_QUALITY, / nQuality DEFAULT_PITCH | FF_SWISS, / nPitchAndFamily b); / lpszFacenameCFont * oldFont = pDC-SelectObject(&abc);pDC-SetTextColor(RGB(255,0,0);CRect rectText1(centerX-52,centerY*3/2, centerX+52,centerY*2);pDC-DrawText(b, &rectText1, DT_CENTER); CString c(12);CRect rectText2(centerX-8,centerY-keduDRadius*10/9+10, centerX+8,centerY-(keduDRadius*10/9-14)+10);pDC-SetTextColor(RGB(255,0,0); pDC-DrawText(c, &rectText2, DT_CENTER); CString d(6);CRect rectText3(centerX-5,centerY+(keduDRadius*10/9-14-10), centerX+5,centerY+keduDRadius*10/9-10);pDC-DrawText(d, &rectText3, DT_CENTER); CString e(9);CRect rectText4(centerX-(keduDRadius*10/9-14)+10,centerY-7, centerX-keduDRadius*10/9+10,centerY+7);pDC-DrawText(e, &rectText4, DT_CENTER); CString f(3);CRect rectText5(centerX+(keduDRadius*10/9-14)-10,centerY-7, centerX+keduDRadius*10/9-10,centerY+7);pDC-DrawText(f, &rectText5, DT_CENTER);pDC-SelectObject(oldFont);/若定時時間到則提醒“時間到”if(m_hour=hour)&(m_minute=minute)&(set=0)PlaySound(LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);/播放插入的格式為wav的音樂文件set=1;/這個函數(shù)使你能夠獲得當前應用程序的實例句柄。AfxGetInstanceHandle總是/返回代表你的可執(zhí)行文件(.EXE)的HINSTANCE值,除非它從與MFC的USRDLL/版本連接的DLL內(nèi)調(diào)用的。在這種情況下,它返回的是DLL的HINSTANCE值。/如果要求時鐘暫停,則不調(diào)用OnTimer函數(shù)if(flag&flag2)return;/調(diào)用OnTimer函數(shù)SetTimer(1,1000,NULL);/每1000毫秒產(chǎn)生一個消息,在ontimer函數(shù)里編輯相應的/響應代碼(3): /工作狀態(tài)設定void CShejiView:OnBegin() /開始運行/ TODO: Add your command handler code hereflag=0;/0為正常,表示時鐘正常運行flag2=1;/1為不正常,表示此時倒計時不工作Invalidate();void CShejiView:OnPause() /暫停運行/ TODO: Add your command handler code hereflag=1;flag2=1;KillTimer(1);/KillTimer:移除定時器函數(shù)的聲明:移除先前用SetTimer設置的定時器。在定時器使用完畢后移除定時器時使用Invalidate();void CShejiView:OnSetback() /倒計時功能/ TODO: Add your command handler code hereCsetback dia;if(dia.DoModal()=IDOK)/如果點擊確認“(IDOK)之后,用輸入的時間來代替系統(tǒng)本來的時間m_hour=dia.m_hour;m_minute=dia.m_minute;m_second=dia.m_second;flag2=0;flag=1;Invalidate();/InvalidateRect只是增加重繪區(qū)域,在下次WM_PAINT的時候才生效/InvalidateRect函數(shù)中的參數(shù)TRUE表示系統(tǒng)會在你畫之前用背景色將所選區(qū)域覆蓋一/次,默認背景色為白色,可以通過設置BRUSH來改變背景色。void CShejiView:OnSettimer() /鬧鐘功能/ TODO: Add your command handler code hereCmydialog md;md.m_shour=hour;md.m_sminute=minute;UpdateData(false);if(md.DoModal()=IDOK)/如果Updatedata(TRUE),將控件的值賦值給成員變/量;Updatedata(FALSE),將成員變量的值賦值給控件;UpdateData(true);hour=md.m_shour;minute=md.m_sminute;set=0;(4):/對時鐘消息進行響應void CShejiView:OnTimer(UINT nIDEvent) /OnTimer()函數(shù)是響應用SetTimer()函數(shù)設/定的時鐘發(fā)送的時鐘消息的。/為類添加WM_TIMER消息響應,會看到類中多了個OnTimer(UINT nIDEvent)。 /然后用SetTimer(1,1000,NULL)就行了。第一個參數(shù)是ID,第二個是間隔時間,單位/是毫秒,第3個是響應函數(shù),因為要在OnTimer(UINT nIDEvent)里面做響應操作,所/以此處給個NULL就行了。/ TODO: Add your message handler code here and/or call default/若為時鐘狀態(tài)則獲取系統(tǒng)當前時間if(flag=0)CTime curtime = CTime:GetCurrentTime();m_hour = curtime.GetHour();m_minute = curtime.GetMinute();m_second = curtime.GetSecond();/若為倒計時狀態(tài)則判斷是否倒計時結束if(flag2=0) if(m_second|m_minute|m_hour)/如果時、分、秒不同時為零,則進行倒計時if(m_second=0)/如果在時分秒不同時為零的情況下,秒為零,那么秒向/分借60秒,如果此時分也恰好為零,則同時向時借60分,因為被秒借去60秒,所/以分為59,hour減1m_second=60;if(m_minute=0)m_minute=59;m_hour-;elsem_minute-;m_second-;else AfxMessageBox(倒計時時間到);flag2=1;KillTimer(1);Invalidate();CView:OnTimer(nIDEvent);(5):/設置表盤顏色void CShejiView:OnBpcolor() / TODO: Add your command handler code hereCColorDialog ColorDlg; /創(chuàng)建調(diào)色板對象ColorDlg.m_cc.Flags|=CC_FULLOPEN;if(IDOK = ColorDlg.DoModal() /將調(diào)色板實例化bpcolor= ColorDlg.GetColor(); /獲取選中的顏色void CShejiView:OnHourcolor()/設置時針顏色 / TODO: Add your command handler code hereCColorDialog ColorDlg; /創(chuàng)建調(diào)色板對象ColorDlg.m_cc.Flags|=CC_FULLOPEN;if(IDOK = ColorDlg.DoModal() /將調(diào)色板實例化hourcolor= ColorDlg.GetColor(); /獲取選中的顏色void CShejiView:OnMinutecolor() /設置分針顏色/ TODO: Add your command handler code hereCColorDialog ColorDlg; /創(chuàng)建調(diào)色板對象ColorDlg.m_cc.Flags|=CC_FULLOPEN;if(IDOK = ColorDlg.DoModal() /將調(diào)色板實例化minutecolor= ColorDlg.GetColor(); /獲取選中的顏色void

溫馨提示

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

評論

0/150

提交評論