圖形時鐘-課程設(shè)計論文-V1.1_第1頁
圖形時鐘-課程設(shè)計論文-V1.1_第2頁
圖形時鐘-課程設(shè)計論文-V1.1_第3頁
圖形時鐘-課程設(shè)計論文-V1.1_第4頁
圖形時鐘-課程設(shè)計論文-V1.1_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+課程設(shè)計課程設(shè)計 基于 C+的圖形時鐘設(shè)計 The Design of graphics clock based on C + + 姓 名: 林斌 學(xué) 號: 2013011637 系 別: 電子工程學(xué)院 專 業(yè): 電子科學(xué)與技術(shù) 年 級: 2013 級 指導(dǎo)教師: 閉 金 杰 2014 年 2 月 14 日 摘要 時鐘是現(xiàn)代人們生活中的必備用品,本次設(shè)計利用 Microsoft 公司推出的 Visual C+ 6.0 編程環(huán)境,深入學(xué)習(xí) C+語言的基礎(chǔ)上,結(jié)合實際設(shè)計出了圖 形時鐘。設(shè)計中采用標準的 C+語言,時鐘界面為圓形界面,并且?guī)в袛?shù)字顯 示,與計算機的時間同步,真正實現(xiàn)了方便生活的

2、目的。當然可以對設(shè)計進行 升級,做到更簡更優(yōu)。 關(guān)鍵詞:圖形時鐘,C+,界面設(shè)計; Abstract Clock is a modern peoples lives essential supplies, this design uses Microsoft has introduced Visual C + + 6.0 programming environment, C + +-based depth study of language, combined with the actual design of the graphics clock. Design using standard

3、 C + + language, round the clock interface interface, and with a digital display, synchronized with a computer, the real purpose of easy life. Of course, the design can be upgraded to do more simple is better. Key words:Graphics Clock,C+,Interface Design; 目錄 摘要摘要.I ABSTRACT.I 1 1 MFCMFC 基礎(chǔ)基礎(chǔ).2 1.1 M

4、FC 概述.2 1.2 MFC 與繪圖.4 2 2 設(shè)計要求設(shè)計要求.7 3 3 問題分析問題分析.7 4 4 程序設(shè)計主要流程圖程序設(shè)計主要流程圖.8 4.1 系統(tǒng)運行流程圖.8 4.2 界面設(shè)計.8 5 5 程序窗口設(shè)計步驟程序窗口設(shè)計步驟.9 6 6 程序主要源代碼程序主要源代碼.10 7 7 運行結(jié)果演示運行結(jié)果演示.16 8 8 心得體會心得體會.16 致謝致謝.16 參考文獻參考文獻.17 1 MFC 基礎(chǔ) 1.1 MFC 概述 MFC(Micosoft Foundation Class Libay,微基礎(chǔ)類庫)是微基于 Windows 平臺下 的 C+類庫集合,MFC 包含了所有

5、與系統(tǒng)相關(guān)的類,其中封裝了大多數(shù)的 API(Application Pogam Inteface)函數(shù),提供了應(yīng)用程序框架和開發(fā)應(yīng)用程序的工 具,應(yīng)用程序向?qū)?、類向?qū)?、可視化資源設(shè)計等高效工具,用消息映射處理消息響應(yīng), 大大簡化了 Windows 應(yīng)用程序的開發(fā)工作,使程序員可以從繁重的編輯工作中解脫出 來,提高了工作效率。 1、MFC 與 Windows 編程 Windows 操作系統(tǒng)采用了圖形用戶界面,借助它提供的 API 函數(shù),用戶可以編出具 有圖形用戶界面的程序。Windows 操作系統(tǒng)下的應(yīng)用程序和控制臺方式(MS-DOS)下的 應(yīng)用程序相比,具有下特點: (1)用戶界面統(tǒng)一、友好。

6、Windows 應(yīng)用程序擁有相似的基本外觀,包括窗口、菜 單欄、工具、狀態(tài)欄、滾動條等標準元素。 (2)獨立于設(shè)備的圖形操作。Windows 下的應(yīng)用程序使用圖形設(shè)備接口(Gaphic D evice Inteface)屏蔽了不同設(shè)備的差異,提供了設(shè)備無關(guān)的圖形輸出能力。 (3)支持多務(wù)。Windows 是一個多務(wù)的操作環(huán)境,允許用戶同時運行多個應(yīng)用程序。 (4)事件驅(qū)動程序的程序設(shè)計。Windows 程序不是由事件的順序來控制,而是由事 件的發(fā)生與否來控制程序執(zhí)行邏輯。而事件是與消息關(guān)聯(lián)的,Windows 應(yīng)用程序的消息 來源有以下 4 種: 輸入消息:包括鍵盤和鼠標的輸入。 控制消息:用來

7、與 Windows 的控制對象,如列表框、按鈕、復(fù)選框等進行雙向通 信。 系統(tǒng)消息:對程序化的事件或系統(tǒng)時鐘中斷做出反應(yīng)。 用戶消息:這是程序員自己定義并在應(yīng)用程序中主動發(fā)出的。 在 VC+中編寫 Windows 應(yīng)用程序有以下兩種方法。 (1)直接調(diào)用 Windows 操作系統(tǒng)提供的 Windows API 函數(shù)來編寫 Windows 應(yīng)用程序。 通過 Windows API 創(chuàng)建的 Windows 應(yīng)用程序有兩個基本部分:應(yīng)用程序主函數(shù) WinMain 和窗口函數(shù)。WinMain 函數(shù)是應(yīng)用程序的入口點,相當于 C+控制臺應(yīng)用程序的主函數(shù) main。與 main 函數(shù)一樣,WinMain

8、函數(shù)名也是固定的。窗口函數(shù)的名字是用戶自定義 的,由系統(tǒng)調(diào)用,主要用來處理窗口消息,以完成特定的任務(wù)。使用 Windows API 編 寫 Windows 應(yīng)用程序時,大量的程序代碼必須由程序員自己編寫,工作量大。 (2)使用 MFC 類庫編寫 Windows 應(yīng)用程序。MFC 提供了大量預(yù)先編寫好的類及支持代 碼,用于處理多項標準的 Windows 編程任務(wù),如創(chuàng)建窗口、處理消息、添加工具欄和 對話框等。因此,使用 MFC 類庫可以簡化 Windows 應(yīng)用程序的編寫工作。 2.MFC 應(yīng)用程序框架 MFC 封裝了大部分 Windows API 函數(shù)、數(shù)據(jù)結(jié)構(gòu)和宏,以面向?qū)ο蟮念愄峁┙o程序

9、員,并提供了一個應(yīng)用程序框架,簡化和標準化了 Windows 程序設(shè)計。 MFC 中的各種類加起來有幾百個,其中只有 5 個核心類對應(yīng)用程序框架有影響: CWinApp、CDocument、CView、CFrameWnd 和 CDocTemplate。這 5 個類之中只有 CWinApp 是必不可少的類,CWinApp 的對象在應(yīng)用程序中必須有一個,也只有一個,并 且是一個全局對象。全局對象是在 Windows 操作系統(tǒng)調(diào)用 WinMain 之前建立的,它開 通了程序執(zhí)行的路徑。在 MFC 編程中,入口函數(shù) WinMain 被封裝在 MFC 的應(yīng)用程序框 架內(nèi),稱為 AfxWinMain,不需

10、要也不可以再定義另一個 WinMain 函數(shù)。 應(yīng)用程序框架(Application Framework)是一組類構(gòu)造起來的大模型。它的出現(xiàn) 使得開發(fā)人員不需要構(gòu)建程序框架結(jié)構(gòu),其初始代碼可以由應(yīng)用程序向?qū)ё詣油瓿伞?3.MFC 應(yīng)用程序向?qū)?MFC 應(yīng)用程序向?qū)В∕FC AppWizard)可以幫助程序員創(chuàng)建一個 MFC 應(yīng)用程序框架, 并且自動生成這個 MFC 應(yīng)用程序框架所需要的全部文件。然后,程序員利用資源管理 器和類向?qū)В–lassWizard),為應(yīng)用程序添加實現(xiàn)特定功能的代碼,以實現(xiàn)應(yīng)用程序所 要求的功能。 在 Visual C+中,可以創(chuàng)建以下 3 類典型的 Windows 應(yīng)

11、用程序,它們都是通過 MFC 應(yīng)用程序向?qū)ВˋppWizard)創(chuàng)建的: (1)基于對話框的應(yīng)用程序:這類程序適合于文檔較少而交互操作較多的應(yīng)用場 合,如 Windows 自帶的計算器程序。 (2)單文檔界面(SDI)應(yīng)用程序:這類程序一次只能打開一個文檔,如 Windows 自帶的 Notepad 程序。 (3)多文檔界面(MDI)應(yīng)用程序:這類程序可以同時打開多個文檔并進行處理, 處理的過程中很容易進行切換,如 Microsoft Word。 下面通過構(gòu)建應(yīng)用程序 myprogl,簡單介紹如何使用 MFC 應(yīng)用程序向?qū)А?啟動 Microsoft Visual C+ 6.0,進入 Visu

12、al C+集成開發(fā)環(huán)境(IDE),進行如 下操作: (1)選擇“文件(File)”“新建(New)”菜單,彈出“新建”對話框。 (2)在“新建”對話框中,切換到“工程(Projects)”選項卡,從左邊窗口所示 的“項目類型”列表框中選擇要創(chuàng)建的項目類型,這里選擇“MFC AppWizard (exe)”。 在“工程名稱(Projects name)”文本框中鍵入應(yīng)用程序名,這里為 myprogl。在“位 置(Location)”文本框中鍵入用于存放應(yīng)用程序的目錄,這里為 F:MYPROJmyprog 1。從“平臺(Platforms)”列表框中選擇可用的目標平臺,默認平臺為 Win32。最后

13、 單擊“確定”按鈕,彈出 MFC App Wizard-Step1 對話框。 (3) MFC 應(yīng)用程序向?qū)?步驟一(AppWizard-Step1of6)對話框用于確定應(yīng)用程序的 結(jié) 構(gòu):單文檔、多文檔或基本對話框,并為資源選擇一種語言。 這里選擇 Single document (單文檔),其余步驟(步驟二至步驟六)取默認設(shè)置, 單擊“完成”按鈕,顯示應(yīng)用程序所具有的特征。單擊“確定”按鈕,確認前面所做 的選擇都正確,則 MFC AppWizard 根據(jù)這些選擇生成應(yīng)用程序的相應(yīng)源文件。 (4) 完成上述步驟后,應(yīng)用程序的框架即被生成,并在開發(fā)環(huán)境(Developer Studio)的程序工

14、作區(qū)窗口中打開生成的程序。其中 Class View 面板顯示的是所創(chuàng)建 的類和成員函數(shù);Resource View 面板顯示的是所創(chuàng)建的資源;FileView 面板顯示的 是所創(chuàng)建的初始文件。 (5)選擇“組建(Build)”“組建”命令,編譯、連接、建立運 行程序。 (6)選擇“組建(Build)”“執(zhí)行”命令,運行應(yīng)用程序。 從運行結(jié)果可以看出,盡管還未寫入一句代碼,但 myprogl 程序已經(jīng)是一個完整 的可執(zhí)行程序了,其運行結(jié)果已包含標題欄、工具欄、菜單欄和一個打開的文檔邊框 窗口。 生成應(yīng)用程序框架后,這僅僅是一個程序的最基本的骨架,往往還需往項目中添 加大量的代碼,包括類、資源、

15、消息處理函數(shù)等。 4. MFC 與消息映射 Windows 應(yīng)用程序都是消息(Message)驅(qū)動的,消息處理是 Windows 應(yīng)用程序的核 心部分。消息是用來請求對象執(zhí)行某一處理、某一行為的信息。某對象在執(zhí)行相應(yīng)的 處理時,如果需要,它可以通過傳遞消息請求其他對象完成某些處理工作或回答某些 信息。其他對象在執(zhí)行所要求的處理活動時,同樣可以通過傳遞消息與別的對象聯(lián)系, 即 Windows 應(yīng)用程序的運行是靠對象間傳遞消息來完成的。消息實現(xiàn)了對象與外界, 對象與其他對象之間的聯(lián)系。 消息主要有 3 種類型:標準 Windows 消息、控件通知消息和命令消息。 (1)標準 Windows 消息。

16、 除 WM-COMMAND 外,所有以“WM-”為前綴的消息都是標準 Windows 消息。標準 Windows 消息由窗口和視圖處理,這類消息通常會含有用于確定如何對消息迸行處理的 一些參數(shù)。標準 Windows 消息都有缺省的處理函數(shù),這些函數(shù)在 CWnd 類中進行了預(yù)定 義。MFC 類庫以消息名為基礎(chǔ)形成這些處理函數(shù)的名稱,這些處理函數(shù)的名稱都有前綴 “On”。 (2)控件通知消息。 控件通知消息包含從控件和其他子窗口傳送給父窗口的 WM-COMMAND 通知消息。像 其他標準的 Windows 消息一樣,控件通知消息由窗口和視圖處理,但當用戶單擊按鈕 控件時,發(fā)生的 BN-CLICKE

17、D 控件通知消息將作為命令消息來處理。 (3)命令消息。 命令消息包含來自用戶界面對象(如菜單項、工具欄按鈕和加速鍵等)的 WM- COMMAND 通知消息。命令消息的處理與其他消息的處理不同,命令消息可以被更廣泛 的對象(如文檔、文檔模板、應(yīng)用程序?qū)ο蟆⒋翱诤鸵晥D)處理。如果某條命令直接影 響某個特定的對象,則應(yīng)該讓該對象來處理這條命令。 Windows 程序這種“接收消息-處理消息-再等消息”的往復(fù)過程即稱為“消息循環(huán)” 。 消息循環(huán)是 Windows 應(yīng)用程序與 MS-DOS 應(yīng)用程序的最大差異點。 在 Windows 平臺,程序員不能決定程序執(zhí)行的流程,而只能決定接收到消息時的 程序的

18、動作(編寫完成局部的代碼)。在 Visual C+中編程不是考慮要讓程序按照什 么樣的順序執(zhí)行,而應(yīng)考慮在某一消息下程序應(yīng)該干什么。 1.2 MFC 與繪圖 Windows 應(yīng)用程序的圖形設(shè)備接口(Graphics Device Interface,GDI)被抽象化 為設(shè)備環(huán)境(Device Context,DC)。設(shè)備環(huán)境又可稱為設(shè)備描述表或設(shè)備文本,是 Windows 應(yīng)用程序與設(shè)備驅(qū)動程序和輸出設(shè)備(顯示器和打印機等)之間的連接橋梁。 在 Windows 應(yīng)用程序向窗口用戶區(qū)輸出信息前,必須先獲得一個設(shè)備環(huán)境對象,如果 沒有獲得設(shè)備壞境對象,則應(yīng)用程序和相應(yīng)信息輸出窗口之間就沒有任何通道

19、。 在 MFC 類庫中,CDC 類是定義設(shè)備環(huán)境對象的類,所有的繪圖函數(shù)都在 CDC 類中定 義,因此,CDC 類是所有其他 MFC 設(shè)備環(huán)境的基類,任何類型的設(shè)備環(huán)境對象都可以調(diào) 用這些繪圖函數(shù)。 . 要在 Windows 程序中輸出圖形或文字時,首先要調(diào)用該輸出對象的設(shè)備環(huán)境,然 后才運行與之相對應(yīng)的 CDC 類的成員函數(shù)進行繪圖,屏幕畫面的圖形坐標系在缺省情 況下,設(shè)屏幕左上角的坐標值為(0,0),坐標系的邏輯單位為像素。最后要將設(shè)備環(huán) 境釋放給 Windows,恢復(fù)原來的狀態(tài)以備下次調(diào)用。 1.屏幕繪圖的主要函數(shù) CDC 類的主要繪圖成員函數(shù)有以下 7 種。 (1)CDC:SetPix

20、el 函數(shù)。執(zhí)行該函數(shù)可以在屏幕畫面上顯示一個點。其基本調(diào)用 格式為: pDC-SetPixel(x,y,RGB(0,0,255); SetPixel()函數(shù)中的第 1、2 個參數(shù)為擬畫點在屏幕上的顯示坐標,第 3 個參數(shù)為 擬畫點顏色的 COLORREF 型變量。該例句的執(zhí)行結(jié)果是在屏幕畫面的(x,y)處顯示一個 藍點。 (2)CDC:MoveTo 函數(shù)和 CDC:LineTo 函數(shù)。執(zhí)行這兩個函數(shù)可以在屏幕畫面上顯 示一條直線,其基本調(diào)用格式為: pDC-MoveTo(x1,y2); pDC-LineTo(x2,y2); 由 MoveTo()函數(shù)確定直線的起始位置(xl,yl),再由 Li

21、neTo()函數(shù)指定直線的終 點(x2,y2),最后得到所要繪制的直線段。如果接著執(zhí)行 LineTo()函數(shù)則可繪制出連續(xù) 的折線段。該兩例句的執(zhí)行結(jié)果是在屏幕畫面坐標系中連接點(xl,yl)與點(x2,y2)繪 制出一直線段。繪制直線段的函數(shù)不指定顏色,要改變線段的顏色可通過 GDI 的對象 “筆”來實現(xiàn)。 (3)CDC:Ellipse 函數(shù)。執(zhí)行該函數(shù)可以再屏幕畫面上顯示一個橢圓(或圓,圓是 一種長半軸和短半軸相等的橢圓,所以繪制圓和橢圓只要一個設(shè)備環(huán)境類的成員函數(shù)) 。其基本調(diào)用格式為: pDC-Ellipse(xl,yl,x2,y2); Ellipse()函數(shù)用當前設(shè)備環(huán)境刷子填充橢圓

22、內(nèi)部并用當前設(shè)備環(huán)境筆畫橢圓的邊 線,該函數(shù)中的第 1 個參數(shù)是擬畫橢圓的最左點橫坐標,第 2 個參數(shù)是擬畫橢圓的最 上點縱坐標,第 3 個參數(shù)是擬畫橢圓的最右點橫坐標,第 4 個參數(shù)是擬畫橢圓的最下 點縱坐標。 (4) CDC:FillRect 函數(shù)。執(zhí)行該函數(shù)可以在屏幕畫面上顯示一個矩形。其基本調(diào) 用格式為: pDC-FillRect(CRect(point.xl,point.y1,point.x2,point.y2), /定義一個 CRect 類對象 rect GetClientRect( /得到一個視圖窗口的矩形邊界, /其結(jié)果值保存在 CRect 對象 rect 中 pDC-SetM

23、apMode(MM_LOMETRIC); /設(shè)定映射模式 pDC-SetViewportOrg(int(rect.right/2),int(rect.bottom/2); /把邏輯坐標 系的原點設(shè)在用戶窗口的中心(點) 3.畫筆的使用 Visual C+中的畫筆用來繪制直線、曲線或填充圖形的邊線,是 Windows 圖形設(shè) 備接口(Graphics Device Interface, GDI)對象之一。在使用 Visual C+的畫筆之前 必須先創(chuàng)建或選擇畫筆對象,使用 CPen 類的成員函數(shù) CreatePen()可以創(chuàng)建一只筆, 而調(diào)用 CDC:SelectStockObject()可以選

24、擇一只庫筆。 創(chuàng)建一只筆的典型語句為: CPen Mypen; /定義一個畫筆對象 Mypen CPen* poldPen; /定義一個 CPen 類對象指針 poldPen Mypen.CreatePen(PS_SOLID,1,RGB(255,0,0);/生成對應(yīng)于 Mypen 的筆的 GDI 對 /象 poldPen=pDC-SelectObject( /把設(shè)備環(huán)境的筆調(diào)換成新生成的筆 /Mypen,同時返回指向原設(shè)備環(huán)境的筆的指針 poldPen pDC-SelectObject(poldPen); /恢復(fù)原來的設(shè)備環(huán)境筆 Mypen.DeleteObject(); /把 Mypen 管

25、理的筆的 GDI 對象從系統(tǒng)內(nèi)存中消除 4.刷子的使用 Visual C+中的刷子用來給圖形內(nèi)部著色,它也是 Windows 圖形設(shè)備接口對象之 一。在使用 Visual C+的刷子之前必須先創(chuàng)建或選擇刷子對象。使用 CBrush 類的成員 函數(shù) CreateSolidBrush()或 CreateHatchBrush()可以創(chuàng)建一只刷子,而調(diào)用 CDC:SelectStockObject()可以選擇一只庫刷子。 創(chuàng)建一只刷子的典型語句為: CBrush Mybrush; /定義一個刷子對象 Mybrush CBrush *poldBrush; /定義一個 CBrush 類對象指針 poldB

26、rush Mybrush.CreateSolidBrush(RGB(255,0,0);/生成對應(yīng)于 Mybrush 的刷子的 GDI /對象 poldBrush=pDC-SelectObject(/把設(shè)備環(huán)境刷子調(diào)換成新刷子 /Mybrush,同時返回指向原設(shè)備環(huán)境刷子的指針 poldBrush pDC-SelectObject(poldBrush); /恢復(fù)原來的設(shè)備環(huán)境刷子 Mybrush.DelectObject();/把 Mybrush 管理的刷子的 GDI 對象從系統(tǒng)內(nèi)存中消除 2 設(shè)計要求 本系統(tǒng)設(shè)計的基本指標如下: 在屏幕上顯示一個圖形時鐘(用程序繪制一個與時鐘樣式相似即可) ,

27、時間與系統(tǒng) 時間一致,且要隨著時間的走動準確的走動。 3 問題分析 查閱相關(guān)資料得知本題涉及到的主要知識點有: 時鐘指針運動算法、屏幕重繪方法、定時器消息、鼠標消息、菜單命令、對話框、 畫筆/畫刷、顯示文字等。指針運動算法和屏幕重繪方法是本程序主要難點所在。 時針分針秒針,每次轉(zhuǎn)動均以弧度(一秒的角度)為基本單位,且都以表/30 盤中心為轉(zhuǎn)動圓心。計算指針端點的公式如下:(, )X Y cos sin Xxl Yyl :表示圓心坐標( , )x y :表示指針長度l :表示指針方向角 注意,指針長度是指自圓心至指針一個端點的長度(是整個指針的一部分) ,為 了方便顯示每一個指針都需要計算兩個端

28、點。 三個指針的運動是相關(guān)聯(lián)的,秒針轉(zhuǎn)一圈引起分針運動一格,分針轉(zhuǎn)一圈引起時 針運動一格,因此只需要使用一個定時器消息來處理指針的運動即可。 由于屏幕的重繪速度很快(50 微秒一次) ,如果采用全屏刪除式重繪則閃爍十分 明顯,顯示效果不佳。在參閱多方資料之后,作者本人程序采用網(wǎng)上常用的方法 非刪除式重繪,即假定指針將要移動一格,則先采用背景色(這里是白色)重繪原來 指針以刪除原來位置的指針,再采用指針的顏色在當前位置繪制指針;如果指針沒有 動,則直接繪制指針。 另外,秒表需要采用單獨的定時器消息控制。 4 程序設(shè)計主要流程圖 4.1 系統(tǒng)運行流程圖 圖 1 系統(tǒng)主流程圖 發(fā)出程序處理命 令 發(fā)

29、出處理命令 單擊按鈕獲取事件 進行操作 顯示操作結(jié)果 程序初始化 4.2 界面設(shè)計 圖 2 界面設(shè)計流程圖 5 程序窗口設(shè)計步驟 (1)用 MFC AppWizard (exe)生成一個名為 Clock 的單文檔(SDI)程序框架。為 了簡化應(yīng)用程序,在第四步時去掉 Docking toolbar 和 Initial status bar 選擇項 (不刪除也可) ,其他各選項均可用缺省設(shè)置。 (2)編輯項目的菜單資源。在主框架窗口的主菜單(IDR_MAINFRAME)中添加一個 名為“時鐘控制”的下拉菜單。在“時鐘控制”菜單中添加兩個菜單選項“啟動時鐘” 、 “停止時鐘” 。并在菜單屬性項中設(shè)

30、定“啟動時鐘”菜單的 ID 標號為 ID_START, “停止 時鐘”菜單的 ID 標號為 ID_STOP。為了簡化菜單,可刪除系統(tǒng)原有的“文件” 、 “編輯” 菜單項。如下圖。 設(shè)計視圖類并添加菜單命令處理 函數(shù),添加消息機制 設(shè)計話框類并添加與各控件對應(yīng)的 數(shù)據(jù)成員。 編輯菜單資源 生成程序框架 編輯圖標資源 添加程序代碼 圖 3 下拉菜單設(shè)置效果圖 (3)利用 ClassWizard 為視圖類添加菜單命令處理函數(shù)。進入 ClassWizard 的 Message Maps 選項卡,選擇 Class Name 項為 CClockView 類,在 Object IDs 列表框中 分別選擇新添

31、加的菜單選項的 ID,在 Messages 列表框中選擇 COMMAND,按下 Add Function 按鈕添加成員函數(shù)。ClassWizard 會為“啟動時鐘” 、 “停止時鐘”菜單選項 添加相應(yīng)的消息響應(yīng)函數(shù) OnStart ( )、OnStop ( )。 圖 4 添加消息響應(yīng)函數(shù) (4)利用 ClassWizard 為視圖類添加定時器和鼠標消息處理函數(shù)。進入 ClassWizard 的 Message Maps 選項卡,選擇 Class Name 項為 CClockView 類,在 Messages 列表框中分別選擇定時器消息 WM_TIMER,按下 Add Function 按鈕添加

32、成員 函數(shù)。ClassWizard 會添加相應(yīng)的定時器響應(yīng)函數(shù) OnTimer。 (5)完成以上工作后,即可修改程序框架,添加必要的代碼。 6 程序主要源代碼 按以下步驟向視圖類(CClockView)添加下列數(shù)據(jù)成員及成員函數(shù)。 (1) 添加表示年、月、日、時、分、秒的變量。 int year; int month; int day; int hour; int minute; int second; (2) 添加時鐘的畫筆及畫刷變量。 CPen m_HouPen, m_MinPen, m_SecPen; / 各種指針的畫筆 CBrush m_MarkBrush; / 表盤標記的畫刷 (3)

33、 添加時鐘控制變量。 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; / 秒針當前及前一次位置 (4) 添加兩個函數(shù),計算時鐘各指針位置。 void SetClock (int hour, int minute, int second); CPoint GetPoint (int nLenth, int nValu

34、e); (5) 在視圖類構(gòu)造函數(shù)中增加初始化語句,之前加上頭文件 #include CClockView:CClockView() / 設(shè)定時間 SYSTEMTIME st; GetLocalTime( day = st.wDay; hour = st.wHour; minute = st.wMinute; month = st.wMonth; second = st.wSecond; year = st.wYear; / 設(shè)定畫筆/畫刷 m_HouPen. CreatePen (PS_SOLID, 5, RGB (255, 0, 0) ); / 時針畫筆 m_MinPen. CreatePe

35、n (PS_SOLID, 3, RGB (0, 0, 250) ); / 分針畫筆 m_SecPen. CreatePen (PS_SOLID, 1, RGB (0, 0, 0) ); / 秒針畫筆 m_MarkBrush. CreateSolidBrush (RGB (250, 250, 0) ); / 設(shè)定表心位置 m_Center. x = 200; m_Center. y = 200; / 設(shè)定時鐘半徑 m_Radius = 200; / 計算指針位置 SetClock (hour, minute, second); 編寫指針位置計算函數(shù) SetClock 和 GetPoint。首先在

36、 ClockView. cpp 文件頭部添 加下面兩行代碼,以便進行數(shù)學(xué)計算。 #include math.h #define PI 3.14159265 然后添加下列代碼: /計算各個指針位置的函數(shù) 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)

37、; m_Hour1= GetPoint(7,hour + 30); / 保存分針原位置 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), sec

38、ond); m_Second 1 = GetPoint (30, second + 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; 繪制表盤上的標記、時針、分針和秒針,并顯示數(shù)字時鐘,在 OnD

39、raw 函數(shù)中添 加下面代碼: void CClockView:OnDraw(CDC* pDC) CClockDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / 繪制表盤上的標記 pDC-SelectObject(m_MarkBrush); int k=0; for(int i=0;iTextOut(pt.x-5,pt.y-5,strk); k+; else /顯示數(shù)字之間的圓圈 pDC-Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2); / 畫時針 pDC-SelectObject (m_HouPen); if (m_Ol

40、dHour0!= m_Hour0) / 用白色覆蓋原位置時針 pDC-SetROP2(R2_WHITE); pDC-MoveTo(m_OldHour 0 ); pDC-LineTo(m_OldHour 1 ); pDC-SetROP2(R2_COPYPEN); /時針繪制 pDC-MoveTo(m_Hour0); pDC-LineTo(m_Hour1); else / 時針繪制 pDC-MoveTo(m_Hour0); pDC-LineTo(m_Hour1); / 畫分針 pDC-SelectObject (m_MinPen); if (m_OldMin0!=m_Minute0) / 用白色覆

41、蓋原位置分針 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 / 分針繪制 pDC-MoveTo(m_Minute0); pDC-LineTo(m_Minute1); / 用白色覆蓋原位置秒針 pDC-SelectObject(m_SecPen); pDC-SetROP2(R2_WHITE); pDC-MoveTo(m_OldSec0); p

42、DC-LineTo(m_OldSec1); pDC-SetROP2(R2_COPYPEN); / 秒針繪制 pDC-MoveTo(m_Second0); pDC-LineTo(m_Second1); / 數(shù)字時鐘顯示 pDC-SelectStockObject(WHITE_BRUSH); pDC-Rectangle(450,30,700,180); 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); 請注意將表示時間的整數(shù)轉(zhuǎn)換為 CString 字符串類型的方法。按照下列步驟增加 時鐘控制代碼: 修改 Onstart 和 OnStop 函數(shù),設(shè)置時鐘運動消息。按比正常時鐘快 20 倍的假定, 50ms 產(chǎn)生一個消息。本程序采用和正常時間同步,即 1000ms 產(chǎn)生一個消息, 其代碼 為: void CClockView:OnStart()

溫馨提示

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

評論

0/150

提交評論