




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C+課程設(shè)計(jì)課程設(shè)計(jì) 基于 C+的圖形時(shí)鐘設(shè)計(jì) The Design of graphics clock based on C + + 姓 名: 林斌 學(xué) 號(hào): 2013011637 系 別: 電子工程學(xué)院 專 業(yè): 電子科學(xué)與技術(shù) 年 級(jí): 2013 級(jí) 指導(dǎo)教師: 閉 金 杰 2014 年 2 月 14 日 摘要 時(shí)鐘是現(xiàn)代人們生活中的必備用品,本次設(shè)計(jì)利用 Microsoft 公司推出的 Visual C+ 6.0 編程環(huán)境,深入學(xué)習(xí) C+語(yǔ)言的基礎(chǔ)上,結(jié)合實(shí)際設(shè)計(jì)出了圖 形時(shí)鐘。設(shè)計(jì)中采用標(biāo)準(zhǔn)的 C+語(yǔ)言,時(shí)鐘界面為圓形界面,并且?guī)в袛?shù)字顯 示,與計(jì)算機(jī)的時(shí)間同步,真正實(shí)現(xiàn)了方便生活的
2、目的。當(dāng)然可以對(duì)設(shè)計(jì)進(jìn)行 升級(jí),做到更簡(jiǎn)更優(yōu)。 關(guān)鍵詞:圖形時(shí)鐘,C+,界面設(shè)計(jì); 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è)計(jì)要求設(shè)計(jì)要求.7 3 3 問(wèn)題分析問(wèn)題分析.7 4 4 程序設(shè)計(jì)主要流程圖程序設(shè)計(jì)主要流程圖.8 4.1 系統(tǒng)運(yùn)行流程圖.8 4.2 界面設(shè)計(jì).8 5 5 程序窗口設(shè)計(jì)步驟程序窗口設(shè)計(jì)步驟.9 6 6 程序主要源代碼程序主要源代碼.10 7 7 運(yùn)行結(jié)果演示運(yùn)行結(jié)果演示.16 8 8 心得體會(huì)心得體會(huì).16 致謝致謝.16 參考文獻(xiàn)參考文獻(xiàn).17 1 MFC 基礎(chǔ) 1.1 MFC 概述 MFC(Micosoft Foundation Class Libay,微基礎(chǔ)類庫(kù))是微基于 Windows 平臺(tái)下 的 C+類庫(kù)集合,MFC 包含了所有
5、與系統(tǒng)相關(guān)的類,其中封裝了大多數(shù)的 API(Application Pogam Inteface)函數(shù),提供了應(yīng)用程序框架和開(kāi)發(fā)應(yīng)用程序的工 具,應(yīng)用程序向?qū)А㈩愊驅(qū)?、可視化資源設(shè)計(jì)等高效工具,用消息映射處理消息響應(yīng), 大大簡(jiǎn)化了 Windows 應(yīng)用程序的開(kāi)發(fā)工作,使程序員可以從繁重的編輯工作中解脫出 來(lái),提高了工作效率。 1、MFC 與 Windows 編程 Windows 操作系統(tǒng)采用了圖形用戶界面,借助它提供的 API 函數(shù),用戶可以編出具 有圖形用戶界面的程序。Windows 操作系統(tǒng)下的應(yīng)用程序和控制臺(tái)方式(MS-DOS)下的 應(yīng)用程序相比,具有下特點(diǎn): (1)用戶界面統(tǒng)一、友好。
6、Windows 應(yīng)用程序擁有相似的基本外觀,包括窗口、菜 單欄、工具、狀態(tài)欄、滾動(dòng)條等標(biāo)準(zhǔn)元素。 (2)獨(dú)立于設(shè)備的圖形操作。Windows 下的應(yīng)用程序使用圖形設(shè)備接口(Gaphic D evice Inteface)屏蔽了不同設(shè)備的差異,提供了設(shè)備無(wú)關(guān)的圖形輸出能力。 (3)支持多務(wù)。Windows 是一個(gè)多務(wù)的操作環(huán)境,允許用戶同時(shí)運(yùn)行多個(gè)應(yīng)用程序。 (4)事件驅(qū)動(dòng)程序的程序設(shè)計(jì)。Windows 程序不是由事件的順序來(lái)控制,而是由事 件的發(fā)生與否來(lái)控制程序執(zhí)行邏輯。而事件是與消息關(guān)聯(lián)的,Windows 應(yīng)用程序的消息 來(lái)源有以下 4 種: 輸入消息:包括鍵盤(pán)和鼠標(biāo)的輸入。 控制消息:用來(lái)
7、與 Windows 的控制對(duì)象,如列表框、按鈕、復(fù)選框等進(jìn)行雙向通 信。 系統(tǒng)消息:對(duì)程序化的事件或系統(tǒng)時(shí)鐘中斷做出反應(yīng)。 用戶消息:這是程序員自己定義并在應(yīng)用程序中主動(dòng)發(fā)出的。 在 VC+中編寫(xiě) Windows 應(yīng)用程序有以下兩種方法。 (1)直接調(diào)用 Windows 操作系統(tǒng)提供的 Windows API 函數(shù)來(lái)編寫(xiě) Windows 應(yīng)用程序。 通過(guò) Windows API 創(chuàng)建的 Windows 應(yīng)用程序有兩個(gè)基本部分:應(yīng)用程序主函數(shù) WinMain 和窗口函數(shù)。WinMain 函數(shù)是應(yīng)用程序的入口點(diǎn),相當(dāng)于 C+控制臺(tái)應(yīng)用程序的主函數(shù) main。與 main 函數(shù)一樣,WinMain
8、函數(shù)名也是固定的。窗口函數(shù)的名字是用戶自定義 的,由系統(tǒng)調(diào)用,主要用來(lái)處理窗口消息,以完成特定的任務(wù)。使用 Windows API 編 寫(xiě) Windows 應(yīng)用程序時(shí),大量的程序代碼必須由程序員自己編寫(xiě),工作量大。 (2)使用 MFC 類庫(kù)編寫(xiě) Windows 應(yīng)用程序。MFC 提供了大量預(yù)先編寫(xiě)好的類及支持代 碼,用于處理多項(xiàng)標(biāo)準(zhǔn)的 Windows 編程任務(wù),如創(chuàng)建窗口、處理消息、添加工具欄和 對(duì)話框等。因此,使用 MFC 類庫(kù)可以簡(jiǎn)化 Windows 應(yīng)用程序的編寫(xiě)工作。 2.MFC 應(yīng)用程序框架 MFC 封裝了大部分 Windows API 函數(shù)、數(shù)據(jù)結(jié)構(gòu)和宏,以面向?qū)ο蟮念愄峁┙o程序
9、員,并提供了一個(gè)應(yīng)用程序框架,簡(jiǎn)化和標(biāo)準(zhǔn)化了 Windows 程序設(shè)計(jì)。 MFC 中的各種類加起來(lái)有幾百個(gè),其中只有 5 個(gè)核心類對(duì)應(yīng)用程序框架有影響: CWinApp、CDocument、CView、CFrameWnd 和 CDocTemplate。這 5 個(gè)類之中只有 CWinApp 是必不可少的類,CWinApp 的對(duì)象在應(yīng)用程序中必須有一個(gè),也只有一個(gè),并 且是一個(gè)全局對(duì)象。全局對(duì)象是在 Windows 操作系統(tǒng)調(diào)用 WinMain 之前建立的,它開(kāi) 通了程序執(zhí)行的路徑。在 MFC 編程中,入口函數(shù) WinMain 被封裝在 MFC 的應(yīng)用程序框 架內(nèi),稱為 AfxWinMain,不需
10、要也不可以再定義另一個(gè) WinMain 函數(shù)。 應(yīng)用程序框架(Application Framework)是一組類構(gòu)造起來(lái)的大模型。它的出現(xiàn) 使得開(kāi)發(fā)人員不需要構(gòu)建程序框架結(jié)構(gòu),其初始代碼可以由應(yīng)用程序向?qū)ё詣?dòng)完成。 3.MFC 應(yīng)用程序向?qū)?MFC 應(yīng)用程序向?qū)В∕FC AppWizard)可以幫助程序員創(chuàng)建一個(gè) MFC 應(yīng)用程序框架, 并且自動(dòng)生成這個(gè) MFC 應(yīng)用程序框架所需要的全部文件。然后,程序員利用資源管理 器和類向?qū)В–lassWizard),為應(yīng)用程序添加實(shí)現(xiàn)特定功能的代碼,以實(shí)現(xiàn)應(yīng)用程序所 要求的功能。 在 Visual C+中,可以創(chuàng)建以下 3 類典型的 Windows 應(yīng)
11、用程序,它們都是通過(guò) MFC 應(yīng)用程序向?qū)ВˋppWizard)創(chuàng)建的: (1)基于對(duì)話框的應(yīng)用程序:這類程序適合于文檔較少而交互操作較多的應(yīng)用場(chǎng) 合,如 Windows 自帶的計(jì)算器程序。 (2)單文檔界面(SDI)應(yīng)用程序:這類程序一次只能打開(kāi)一個(gè)文檔,如 Windows 自帶的 Notepad 程序。 (3)多文檔界面(MDI)應(yīng)用程序:這類程序可以同時(shí)打開(kāi)多個(gè)文檔并進(jìn)行處理, 處理的過(guò)程中很容易進(jìn)行切換,如 Microsoft Word。 下面通過(guò)構(gòu)建應(yīng)用程序 myprogl,簡(jiǎn)單介紹如何使用 MFC 應(yīng)用程序向?qū)А?啟動(dòng) Microsoft Visual C+ 6.0,進(jìn)入 Visu
12、al C+集成開(kāi)發(fā)環(huán)境(IDE),進(jìn)行如 下操作: (1)選擇“文件(File)”“新建(New)”菜單,彈出“新建”對(duì)話框。 (2)在“新建”對(duì)話框中,切換到“工程(Projects)”選項(xiàng)卡,從左邊窗口所示 的“項(xiàng)目類型”列表框中選擇要?jiǎng)?chuàng)建的項(xiàng)目類型,這里選擇“MFC AppWizard (exe)”。 在“工程名稱(Projects name)”文本框中鍵入應(yīng)用程序名,這里為 myprogl。在“位 置(Location)”文本框中鍵入用于存放應(yīng)用程序的目錄,這里為 F:MYPROJmyprog 1。從“平臺(tái)(Platforms)”列表框中選擇可用的目標(biāo)平臺(tái),默認(rèn)平臺(tái)為 Win32。最后
13、 單擊“確定”按鈕,彈出 MFC App Wizard-Step1 對(duì)話框。 (3) MFC 應(yīng)用程序向?qū)?步驟一(AppWizard-Step1of6)對(duì)話框用于確定應(yīng)用程序的 結(jié) 構(gòu):?jiǎn)挝臋n、多文檔或基本對(duì)話框,并為資源選擇一種語(yǔ)言。 這里選擇 Single document (單文檔),其余步驟(步驟二至步驟六)取默認(rèn)設(shè)置, 單擊“完成”按鈕,顯示應(yīng)用程序所具有的特征。單擊“確定”按鈕,確認(rèn)前面所做 的選擇都正確,則 MFC AppWizard 根據(jù)這些選擇生成應(yīng)用程序的相應(yīng)源文件。 (4) 完成上述步驟后,應(yīng)用程序的框架即被生成,并在開(kāi)發(fā)環(huán)境(Developer Studio)的程序工
14、作區(qū)窗口中打開(kāi)生成的程序。其中 Class View 面板顯示的是所創(chuàng)建 的類和成員函數(shù);Resource View 面板顯示的是所創(chuàng)建的資源;FileView 面板顯示的 是所創(chuàng)建的初始文件。 (5)選擇“組建(Build)”“組建”命令,編譯、連接、建立運(yùn) 行程序。 (6)選擇“組建(Build)”“執(zhí)行”命令,運(yùn)行應(yīng)用程序。 從運(yùn)行結(jié)果可以看出,盡管還未寫(xiě)入一句代碼,但 myprogl 程序已經(jīng)是一個(gè)完整 的可執(zhí)行程序了,其運(yùn)行結(jié)果已包含標(biāo)題欄、工具欄、菜單欄和一個(gè)打開(kāi)的文檔邊框 窗口。 生成應(yīng)用程序框架后,這僅僅是一個(gè)程序的最基本的骨架,往往還需往項(xiàng)目中添 加大量的代碼,包括類、資源、
15、消息處理函數(shù)等。 4. MFC 與消息映射 Windows 應(yīng)用程序都是消息(Message)驅(qū)動(dòng)的,消息處理是 Windows 應(yīng)用程序的核 心部分。消息是用來(lái)請(qǐng)求對(duì)象執(zhí)行某一處理、某一行為的信息。某對(duì)象在執(zhí)行相應(yīng)的 處理時(shí),如果需要,它可以通過(guò)傳遞消息請(qǐng)求其他對(duì)象完成某些處理工作或回答某些 信息。其他對(duì)象在執(zhí)行所要求的處理活動(dòng)時(shí),同樣可以通過(guò)傳遞消息與別的對(duì)象聯(lián)系, 即 Windows 應(yīng)用程序的運(yùn)行是靠對(duì)象間傳遞消息來(lái)完成的。消息實(shí)現(xiàn)了對(duì)象與外界, 對(duì)象與其他對(duì)象之間的聯(lián)系。 消息主要有 3 種類型:標(biāo)準(zhǔn) Windows 消息、控件通知消息和命令消息。 (1)標(biāo)準(zhǔn) Windows 消息。
16、 除 WM-COMMAND 外,所有以“WM-”為前綴的消息都是標(biāo)準(zhǔn) Windows 消息。標(biāo)準(zhǔn) Windows 消息由窗口和視圖處理,這類消息通常會(huì)含有用于確定如何對(duì)消息迸行處理的 一些參數(shù)。標(biāo)準(zhǔn) Windows 消息都有缺省的處理函數(shù),這些函數(shù)在 CWnd 類中進(jìn)行了預(yù)定 義。MFC 類庫(kù)以消息名為基礎(chǔ)形成這些處理函數(shù)的名稱,這些處理函數(shù)的名稱都有前綴 “On”。 (2)控件通知消息。 控件通知消息包含從控件和其他子窗口傳送給父窗口的 WM-COMMAND 通知消息。像 其他標(biāo)準(zhǔn)的 Windows 消息一樣,控件通知消息由窗口和視圖處理,但當(dāng)用戶單擊按鈕 控件時(shí),發(fā)生的 BN-CLICKE
17、D 控件通知消息將作為命令消息來(lái)處理。 (3)命令消息。 命令消息包含來(lái)自用戶界面對(duì)象(如菜單項(xiàng)、工具欄按鈕和加速鍵等)的 WM- COMMAND 通知消息。命令消息的處理與其他消息的處理不同,命令消息可以被更廣泛 的對(duì)象(如文檔、文檔模板、應(yīng)用程序?qū)ο?、窗口和視圖)處理。如果某條命令直接影 響某個(gè)特定的對(duì)象,則應(yīng)該讓該對(duì)象來(lái)處理這條命令。 Windows 程序這種“接收消息-處理消息-再等消息”的往復(fù)過(guò)程即稱為“消息循環(huán)” 。 消息循環(huán)是 Windows 應(yīng)用程序與 MS-DOS 應(yīng)用程序的最大差異點(diǎn)。 在 Windows 平臺(tái),程序員不能決定程序執(zhí)行的流程,而只能決定接收到消息時(shí)的 程序的
18、動(dòng)作(編寫(xiě)完成局部的代碼)。在 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ū)動(dòng)程序和輸出設(shè)備(顯示器和打印機(jī)等)之間的連接橋梁。 在 Windows 應(yīng)用程序向窗口用戶區(qū)輸出信息前,必須先獲得一個(gè)設(shè)備環(huán)境對(duì)象,如果 沒(méi)有獲得設(shè)備壞境對(duì)象,則應(yīng)用程序和相應(yīng)信息輸出窗口之間就沒(méi)有任何通道
19、。 在 MFC 類庫(kù)中,CDC 類是定義設(shè)備環(huán)境對(duì)象的類,所有的繪圖函數(shù)都在 CDC 類中定 義,因此,CDC 類是所有其他 MFC 設(shè)備環(huán)境的基類,任何類型的設(shè)備環(huán)境對(duì)象都可以調(diào) 用這些繪圖函數(shù)。 . 要在 Windows 程序中輸出圖形或文字時(shí),首先要調(diào)用該輸出對(duì)象的設(shè)備環(huán)境,然 后才運(yùn)行與之相對(duì)應(yīng)的 CDC 類的成員函數(shù)進(jìn)行繪圖,屏幕畫(huà)面的圖形坐標(biāo)系在缺省情 況下,設(shè)屏幕左上角的坐標(biāo)值為(0,0),坐標(biāo)系的邏輯單位為像素。最后要將設(shè)備環(huán) 境釋放給 Windows,恢復(fù)原來(lái)的狀態(tài)以備下次調(diào)用。 1.屏幕繪圖的主要函數(shù) CDC 類的主要繪圖成員函數(shù)有以下 7 種。 (1)CDC:SetPix
20、el 函數(shù)。執(zhí)行該函數(shù)可以在屏幕畫(huà)面上顯示一個(gè)點(diǎn)。其基本調(diào)用 格式為: pDC-SetPixel(x,y,RGB(0,0,255); SetPixel()函數(shù)中的第 1、2 個(gè)參數(shù)為擬畫(huà)點(diǎn)在屏幕上的顯示坐標(biāo),第 3 個(gè)參數(shù)為 擬畫(huà)點(diǎn)顏色的 COLORREF 型變量。該例句的執(zhí)行結(jié)果是在屏幕畫(huà)面的(x,y)處顯示一個(gè) 藍(lán)點(diǎn)。 (2)CDC:MoveTo 函數(shù)和 CDC:LineTo 函數(shù)。執(zhí)行這兩個(gè)函數(shù)可以在屏幕畫(huà)面上顯 示一條直線,其基本調(diào)用格式為: pDC-MoveTo(x1,y2); pDC-LineTo(x2,y2); 由 MoveTo()函數(shù)確定直線的起始位置(xl,yl),再由 Li
21、neTo()函數(shù)指定直線的終 點(diǎn)(x2,y2),最后得到所要繪制的直線段。如果接著執(zhí)行 LineTo()函數(shù)則可繪制出連續(xù) 的折線段。該兩例句的執(zhí)行結(jié)果是在屏幕畫(huà)面坐標(biāo)系中連接點(diǎn)(xl,yl)與點(diǎn)(x2,y2)繪 制出一直線段。繪制直線段的函數(shù)不指定顏色,要改變線段的顏色可通過(guò) GDI 的對(duì)象 “筆”來(lái)實(shí)現(xiàn)。 (3)CDC:Ellipse 函數(shù)。執(zhí)行該函數(shù)可以再屏幕畫(huà)面上顯示一個(gè)橢圓(或圓,圓是 一種長(zhǎng)半軸和短半軸相等的橢圓,所以繪制圓和橢圓只要一個(gè)設(shè)備環(huán)境類的成員函數(shù)) 。其基本調(diào)用格式為: pDC-Ellipse(xl,yl,x2,y2); Ellipse()函數(shù)用當(dāng)前設(shè)備環(huán)境刷子填充橢圓
22、內(nèi)部并用當(dāng)前設(shè)備環(huán)境筆畫(huà)橢圓的邊 線,該函數(shù)中的第 1 個(gè)參數(shù)是擬畫(huà)橢圓的最左點(diǎn)橫坐標(biāo),第 2 個(gè)參數(shù)是擬畫(huà)橢圓的最 上點(diǎn)縱坐標(biāo),第 3 個(gè)參數(shù)是擬畫(huà)橢圓的最右點(diǎn)橫坐標(biāo),第 4 個(gè)參數(shù)是擬畫(huà)橢圓的最下 點(diǎn)縱坐標(biāo)。 (4) CDC:FillRect 函數(shù)。執(zhí)行該函數(shù)可以在屏幕畫(huà)面上顯示一個(gè)矩形。其基本調(diào) 用格式為: pDC-FillRect(CRect(point.xl,point.y1,point.x2,point.y2), /定義一個(gè) CRect 類對(duì)象 rect GetClientRect( /得到一個(gè)視圖窗口的矩形邊界, /其結(jié)果值保存在 CRect 對(duì)象 rect 中 pDC-SetM
23、apMode(MM_LOMETRIC); /設(shè)定映射模式 pDC-SetViewportOrg(int(rect.right/2),int(rect.bottom/2); /把邏輯坐標(biāo) 系的原點(diǎn)設(shè)在用戶窗口的中心(點(diǎn)) 3.畫(huà)筆的使用 Visual C+中的畫(huà)筆用來(lái)繪制直線、曲線或填充圖形的邊線,是 Windows 圖形設(shè) 備接口(Graphics Device Interface, GDI)對(duì)象之一。在使用 Visual C+的畫(huà)筆之前 必須先創(chuàng)建或選擇畫(huà)筆對(duì)象,使用 CPen 類的成員函數(shù) CreatePen()可以創(chuàng)建一只筆, 而調(diào)用 CDC:SelectStockObject()可以選
24、擇一只庫(kù)筆。 創(chuàng)建一只筆的典型語(yǔ)句為: CPen Mypen; /定義一個(gè)畫(huà)筆對(duì)象 Mypen CPen* poldPen; /定義一個(gè) CPen 類對(duì)象指針 poldPen Mypen.CreatePen(PS_SOLID,1,RGB(255,0,0);/生成對(duì)應(yīng)于 Mypen 的筆的 GDI 對(duì) /象 poldPen=pDC-SelectObject( /把設(shè)備環(huán)境的筆調(diào)換成新生成的筆 /Mypen,同時(shí)返回指向原設(shè)備環(huán)境的筆的指針 poldPen pDC-SelectObject(poldPen); /恢復(fù)原來(lái)的設(shè)備環(huán)境筆 Mypen.DeleteObject(); /把 Mypen 管
25、理的筆的 GDI 對(duì)象從系統(tǒng)內(nèi)存中消除 4.刷子的使用 Visual C+中的刷子用來(lái)給圖形內(nèi)部著色,它也是 Windows 圖形設(shè)備接口對(duì)象之 一。在使用 Visual C+的刷子之前必須先創(chuàng)建或選擇刷子對(duì)象。使用 CBrush 類的成員 函數(shù) CreateSolidBrush()或 CreateHatchBrush()可以創(chuàng)建一只刷子,而調(diào)用 CDC:SelectStockObject()可以選擇一只庫(kù)刷子。 創(chuàng)建一只刷子的典型語(yǔ)句為: CBrush Mybrush; /定義一個(gè)刷子對(duì)象 Mybrush CBrush *poldBrush; /定義一個(gè) CBrush 類對(duì)象指針 poldB
26、rush Mybrush.CreateSolidBrush(RGB(255,0,0);/生成對(duì)應(yīng)于 Mybrush 的刷子的 GDI /對(duì)象 poldBrush=pDC-SelectObject(/把設(shè)備環(huán)境刷子調(diào)換成新刷子 /Mybrush,同時(shí)返回指向原設(shè)備環(huán)境刷子的指針 poldBrush pDC-SelectObject(poldBrush); /恢復(fù)原來(lái)的設(shè)備環(huán)境刷子 Mybrush.DelectObject();/把 Mybrush 管理的刷子的 GDI 對(duì)象從系統(tǒng)內(nèi)存中消除 2 設(shè)計(jì)要求 本系統(tǒng)設(shè)計(jì)的基本指標(biāo)如下: 在屏幕上顯示一個(gè)圖形時(shí)鐘(用程序繪制一個(gè)與時(shí)鐘樣式相似即可) ,
27、時(shí)間與系統(tǒng) 時(shí)間一致,且要隨著時(shí)間的走動(dòng)準(zhǔn)確的走動(dòng)。 3 問(wèn)題分析 查閱相關(guān)資料得知本題涉及到的主要知識(shí)點(diǎn)有: 時(shí)鐘指針運(yùn)動(dòng)算法、屏幕重繪方法、定時(shí)器消息、鼠標(biāo)消息、菜單命令、對(duì)話框、 畫(huà)筆/畫(huà)刷、顯示文字等。指針運(yùn)動(dòng)算法和屏幕重繪方法是本程序主要難點(diǎn)所在。 時(shí)針?lè)轴樏脶?,每次轉(zhuǎn)動(dòng)均以弧度(一秒的角度)為基本單位,且都以表/30 盤(pán)中心為轉(zhuǎn)動(dòng)圓心。計(jì)算指針端點(diǎn)的公式如下:(, )X Y cos sin Xxl Yyl :表示圓心坐標(biāo)( , )x y :表示指針長(zhǎng)度l :表示指針?lè)较蚪?注意,指針長(zhǎng)度是指自圓心至指針一個(gè)端點(diǎn)的長(zhǎng)度(是整個(gè)指針的一部分) ,為 了方便顯示每一個(gè)指針都需要計(jì)算兩個(gè)端
28、點(diǎn)。 三個(gè)指針的運(yùn)動(dòng)是相關(guān)聯(lián)的,秒針轉(zhuǎn)一圈引起分針運(yùn)動(dòng)一格,分針轉(zhuǎn)一圈引起時(shí) 針運(yùn)動(dòng)一格,因此只需要使用一個(gè)定時(shí)器消息來(lái)處理指針的運(yùn)動(dòng)即可。 由于屏幕的重繪速度很快(50 微秒一次) ,如果采用全屏刪除式重繪則閃爍十分 明顯,顯示效果不佳。在參閱多方資料之后,作者本人程序采用網(wǎng)上常用的方法 非刪除式重繪,即假定指針將要移動(dòng)一格,則先采用背景色(這里是白色)重繪原來(lái) 指針以刪除原來(lái)位置的指針,再采用指針的顏色在當(dāng)前位置繪制指針;如果指針沒(méi)有 動(dòng),則直接繪制指針。 另外,秒表需要采用單獨(dú)的定時(shí)器消息控制。 4 程序設(shè)計(jì)主要流程圖 4.1 系統(tǒng)運(yùn)行流程圖 圖 1 系統(tǒng)主流程圖 發(fā)出程序處理命 令 發(fā)
29、出處理命令 單擊按鈕獲取事件 進(jìn)行操作 顯示操作結(jié)果 程序初始化 4.2 界面設(shè)計(jì) 圖 2 界面設(shè)計(jì)流程圖 5 程序窗口設(shè)計(jì)步驟 (1)用 MFC AppWizard (exe)生成一個(gè)名為 Clock 的單文檔(SDI)程序框架。為 了簡(jiǎn)化應(yīng)用程序,在第四步時(shí)去掉 Docking toolbar 和 Initial status bar 選擇項(xiàng) (不刪除也可) ,其他各選項(xiàng)均可用缺省設(shè)置。 (2)編輯項(xiàng)目的菜單資源。在主框架窗口的主菜單(IDR_MAINFRAME)中添加一個(gè) 名為“時(shí)鐘控制”的下拉菜單。在“時(shí)鐘控制”菜單中添加兩個(gè)菜單選項(xiàng)“啟動(dòng)時(shí)鐘” 、 “停止時(shí)鐘” 。并在菜單屬性項(xiàng)中設(shè)
30、定“啟動(dòng)時(shí)鐘”菜單的 ID 標(biāo)號(hào)為 ID_START, “停止 時(shí)鐘”菜單的 ID 標(biāo)號(hào)為 ID_STOP。為了簡(jiǎn)化菜單,可刪除系統(tǒng)原有的“文件” 、 “編輯” 菜單項(xiàng)。如下圖。 設(shè)計(jì)視圖類并添加菜單命令處理 函數(shù),添加消息機(jī)制 設(shè)計(jì)話框類并添加與各控件對(duì)應(yīng)的 數(shù)據(jù)成員。 編輯菜單資源 生成程序框架 編輯圖標(biāo)資源 添加程序代碼 圖 3 下拉菜單設(shè)置效果圖 (3)利用 ClassWizard 為視圖類添加菜單命令處理函數(shù)。進(jìn)入 ClassWizard 的 Message Maps 選項(xiàng)卡,選擇 Class Name 項(xiàng)為 CClockView 類,在 Object IDs 列表框中 分別選擇新添
31、加的菜單選項(xiàng)的 ID,在 Messages 列表框中選擇 COMMAND,按下 Add Function 按鈕添加成員函數(shù)。ClassWizard 會(huì)為“啟動(dòng)時(shí)鐘” 、 “停止時(shí)鐘”菜單選項(xiàng) 添加相應(yīng)的消息響應(yīng)函數(shù) OnStart ( )、OnStop ( )。 圖 4 添加消息響應(yīng)函數(shù) (4)利用 ClassWizard 為視圖類添加定時(shí)器和鼠標(biāo)消息處理函數(shù)。進(jìn)入 ClassWizard 的 Message Maps 選項(xiàng)卡,選擇 Class Name 項(xiàng)為 CClockView 類,在 Messages 列表框中分別選擇定時(shí)器消息 WM_TIMER,按下 Add Function 按鈕添加
32、成員 函數(shù)。ClassWizard 會(huì)添加相應(yīng)的定時(shí)器響應(yīng)函數(shù) OnTimer。 (5)完成以上工作后,即可修改程序框架,添加必要的代碼。 6 程序主要源代碼 按以下步驟向視圖類(CClockView)添加下列數(shù)據(jù)成員及成員函數(shù)。 (1) 添加表示年、月、日、時(shí)、分、秒的變量。 int year; int month; int day; int hour; int minute; int second; (2) 添加時(shí)鐘的畫(huà)筆及畫(huà)刷變量。 CPen m_HouPen, m_MinPen, m_SecPen; / 各種指針的畫(huà)筆 CBrush m_MarkBrush; / 表盤(pán)標(biāo)記的畫(huà)刷 (3)
33、 添加時(shí)鐘控制變量。 CPoint m_Center; / 表的中心 double m_Radius; / 表的半徑 CPoint m_Hour 2, m_OldHour 2; / 時(shí)針當(dāng)前及前一次位置 CPoint m_Minute 2, m_OldMin 2; / 分針當(dāng)前及前一次位置 CPoint m_Second 2, m_OldSec 2; / 秒針當(dāng)前及前一次位置 (4) 添加兩個(gè)函數(shù),計(jì)算時(shí)鐘各指針位置。 void SetClock (int hour, int minute, int second); CPoint GetPoint (int nLenth, int nValu
34、e); (5) 在視圖類構(gòu)造函數(shù)中增加初始化語(yǔ)句,之前加上頭文件 #include CClockView:CClockView() / 設(shè)定時(shí)間 SYSTEMTIME st; GetLocalTime( day = st.wDay; hour = st.wHour; minute = st.wMinute; month = st.wMonth; second = st.wSecond; year = st.wYear; / 設(shè)定畫(huà)筆/畫(huà)刷 m_HouPen. CreatePen (PS_SOLID, 5, RGB (255, 0, 0) ); / 時(shí)針畫(huà)筆 m_MinPen. CreatePe
35、n (PS_SOLID, 3, RGB (0, 0, 250) ); / 分針畫(huà)筆 m_SecPen. CreatePen (PS_SOLID, 1, RGB (0, 0, 0) ); / 秒針畫(huà)筆 m_MarkBrush. CreateSolidBrush (RGB (250, 250, 0) ); / 設(shè)定表心位置 m_Center. x = 200; m_Center. y = 200; / 設(shè)定時(shí)鐘半徑 m_Radius = 200; / 計(jì)算指針位置 SetClock (hour, minute, second); 編寫(xiě)指針位置計(jì)算函數(shù) SetClock 和 GetPoint。首先在
36、 ClockView. cpp 文件頭部添 加下面兩行代碼,以便進(jìn)行數(shù)學(xué)計(jì)算。 #include math.h #define PI 3.14159265 然后添加下列代碼: /計(jì)算各個(gè)指針位置的函數(shù) void CClockView:SetClock(int hour, int minute, int second) hour=hour*5; hour=hour+minute/12; / 保存時(shí)針原位置 m_OldHour 0 = m_Hour0; m_OldHour 1 = m_Hour1; / 計(jì)算時(shí)針當(dāng)前位置 m_Hour0= GetPoint(int(m_Radius/2),hour)
37、; m_Hour1= GetPoint(7,hour + 30); / 保存分針原位置 m_OldMin0= m_Minute0; m_OldMin1= m_Minute1; / 計(jì)算分針當(dāng)前位置 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; / 計(jì)算秒針當(dāng)前位置 m_Second 0= GetPoint (int(m_Radius * 8/10), sec
38、ond); m_Second 1 = GetPoint (30, second + 30); / 計(jì)算以表心為原點(diǎn)的指針的端點(diǎn)位置 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; 繪制表盤(pán)上的標(biāo)記、時(shí)針、分針和秒針,并顯示數(shù)字時(shí)鐘,在 OnD
39、raw 函數(shù)中添 加下面代碼: void CClockView:OnDraw(CDC* pDC) CClockDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / 繪制表盤(pán)上的標(biāo)記 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); / 畫(huà)時(shí)針 pDC-SelectObject (m_HouPen); if (m_Ol
40、dHour0!= m_Hour0) / 用白色覆蓋原位置時(shí)針 pDC-SetROP2(R2_WHITE); pDC-MoveTo(m_OldHour 0 ); pDC-LineTo(m_OldHour 1 ); pDC-SetROP2(R2_COPYPEN); /時(shí)針繪制 pDC-MoveTo(m_Hour0); pDC-LineTo(m_Hour1); else / 時(shí)針繪制 pDC-MoveTo(m_Hour0); pDC-LineTo(m_Hour1); / 畫(huà)分針 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ù)字時(shí)鐘顯示 pDC-SelectStockObject(WHITE_BRUSH); pDC-Rectangle(450,30,700,180); pDC-TextOut(535,20,當(dāng)前時(shí)間); CString m_Date,m_Time; m_Date.Format (% 4d 年%4d 月%4d 日,year,month,day); pDC-TextOut(510,70,m_Date); m_Time.Format(%4d 點(diǎn)%4d 分%4d 秒,hour,minute,second); pDC-TextOut(510,100,m_Time); 請(qǐng)注意將表示時(shí)間的整數(shù)轉(zhuǎn)換為 CString 字符串類型的方法。按照下列步驟增加 時(shí)鐘控制代碼: 修改 Onstart 和 OnStop 函數(shù),設(shè)置時(shí)鐘運(yùn)動(dòng)消息。按比正常時(shí)鐘快 20 倍的假定, 50ms 產(chǎn)生一個(gè)消息。本程序采用和正常時(shí)間同步,即 1000ms 產(chǎn)生一個(gè)消息, 其代碼 為: void CClockView:OnStart()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國(guó)玻璃鋼玻璃鋼管行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 2025-2030中國(guó)現(xiàn)成的自動(dòng)化系統(tǒng)行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 2024年動(dòng)車組檢修技術(shù)牽引
- 地理國(guó)情認(rèn)知深度解析:2025年初中學(xué)業(yè)水平考試模擬試卷匯編
- 2025年執(zhí)業(yè)藥師藥學(xué)專業(yè)知識(shí)試卷:臨床藥學(xué)實(shí)踐案例分析題庫(kù)
- 2025年注冊(cè)稅務(wù)師稅法一歷年真題解析試卷
- 2025年消防安全培訓(xùn)考試題庫(kù)實(shí)操篇:火災(zāi)報(bào)警系統(tǒng)操作試題
- 2025年高爾夫球教練職業(yè)能力測(cè)試卷:高爾夫球市場(chǎng)分析與營(yíng)銷策略試題
- 2025年鋼琴演奏級(jí)考試模擬試卷:鋼琴演奏級(jí)音樂(lè)演奏技巧與情感表達(dá)試題
- 2025年網(wǎng)絡(luò)工程師職業(yè)技能測(cè)試卷:網(wǎng)絡(luò)工程項(xiàng)目進(jìn)度控制試題
- (廣東二模)2025年廣東省高三高考模擬測(cè)試(二)語(yǔ)文試卷(含答案解析)
- 2025-2030中國(guó)類腦計(jì)算行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及建設(shè)案例與發(fā)展趨勢(shì)研究報(bào)告
- 2025-2030中國(guó)磁懸浮發(fā)電機(jī)行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭(zhēng)格局與投資發(fā)展研究報(bào)告
- 2024年四川宜賓環(huán)球集團(tuán)有限公司招聘考試真題
- 腦出血病人護(hù)理新進(jìn)展
- SL631水利水電工程單元工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)第3部分:地基處理與基礎(chǔ)工程
- 2025時(shí)政試題及答案(100題)
- 2024-2025學(xué)年統(tǒng)編版七年級(jí)語(yǔ)文下冊(cè)第四單元檢測(cè)A卷(原卷+答案)
- 醫(yī)療器械操作規(guī)范與安全知識(shí)培訓(xùn)試題庫(kù)
- 安全閥培訓(xùn)課件
- 市場(chǎng)集中度與消費(fèi)者行為-全面剖析
評(píng)論
0/150
提交評(píng)論