面向?qū)ο蟪绦蛟O(shè)計實驗_第1頁
面向?qū)ο蟪绦蛟O(shè)計實驗_第2頁
面向?qū)ο蟪绦蛟O(shè)計實驗_第3頁
面向?qū)ο蟪绦蛟O(shè)計實驗_第4頁
面向?qū)ο蟪绦蛟O(shè)計實驗_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 試驗三面向?qū)ο蟪绦蛟O(shè)計實驗一個簡單的可復(fù)用時鐘控件本實驗的開發(fā)環(huán)境n使用C語言實現(xiàn)n使用VC6.0集成開發(fā)環(huán)境開發(fā)n使用MFC應(yīng)用程序開發(fā)框架MFC版本簡介nMFC全稱Microsoft Foundation Classes.n1989年微軟公司成立Application Framework技術(shù)團隊,開發(fā)C面向?qū)ο蠊ぞ呓oWindows應(yīng)用程序開發(fā)人員使用。這個小組即AFX小組,就是他們,開始了MFC的開發(fā)歷程。n微軟公司于1992年4月推出C/C+7.0產(chǎn)品時,初次向世人介紹了MFC 1.0,其32位版本也在1992年7月隨著Win32 SDK推出。nVisual C1.0(也就是C/C+8

2、.0)搭配MFC 2.0于1993年3月推出。同年8月推出在Windows NT上的Visual C1.1 for Windows NT,搭配的是MFC 2.1。n微軟在微軟在19931993年年1212月又推出了月又推出了1616為的為的Visual C+ 1.5, Visual C+ 1.5, 搭配搭配的是的是MFC 2.5MFC 2.5。n19941994年年9 9月,微軟推出月,微軟推出Visual CVisual C 2.02.0,搭配,搭配MFC 3.0MFC 3.0。n19951995年年1 1月,微軟推在增加了月,微軟推在增加了MAPIMAPI和和WinSockWinSock支

3、持的基礎(chǔ)上,支持的基礎(chǔ)上,推出推出MFC 3.1MFC 3.1。n19951995年年7 7月,月,MFCMFC有了有了3.23.2版,這是一個小的改版。版,這是一個小的改版。n然后就是然后就是19951995年年9 9月的月的3232位版位版MFC 4.0MFC 4.0。這個版本有了相當(dāng)。這個版本有了相當(dāng)大的改進。大的改進。n19961996年上半年又有了年上半年又有了MFC4.1MFC4.1n時至今日時至今日MFCMFC在在Visual CVisual C 7.07.0中已經(jīng)到了中已經(jīng)到了7.07.0版本。版本。n我們常用的我們常用的Visual CVisual C6.06.0使用的是使用

4、的是MFC 4.2MFC 4.2版本。版本。n微軟正不斷地為微軟正不斷地為“為什么要使用為什么要使用MFC”MFC”加上各式各樣地強加上各式各樣地強烈你有,并強烈導(dǎo)引它成為烈你有,并強烈導(dǎo)引它成為WindowsWindows程序設(shè)計的程序設(shè)計的C C標(biāo)準(zhǔn)標(biāo)準(zhǔn)界面。正如我們所看到的,越來越多的界面。正如我們所看到的,越來越多的MFCMFC程序出現(xiàn)了并程序出現(xiàn)了并繼續(xù)在產(chǎn)生。繼續(xù)在產(chǎn)生。試驗設(shè)計目標(biāo)n完成一個可重用的完成一個可重用的C類,可以通過該類實現(xiàn)一個簡類,可以通過該類實現(xiàn)一個簡單的模擬時鐘單的模擬時鐘n編寫一個簡單的編寫一個簡單的MFC程序測試驗證這個時鐘控件類程序測試驗證這個時鐘控件類n

5、關(guān)于這個時鐘控件,如果按照課件繼續(xù)完善下去,請關(guān)于這個時鐘控件,如果按照課件繼續(xù)完善下去,請將他做得更好更強大。比如說:可以考慮為時鐘控件將他做得更好更強大。比如說:可以考慮為時鐘控件的各項設(shè)置(如顏色)提供外部接口,供的各項設(shè)置(如顏色)提供外部接口,供CClockEx的的使用者調(diào)用,可以考慮豐富背景繪制,加入背景圖片使用者調(diào)用,可以考慮豐富背景繪制,加入背景圖片設(shè)置,在刻度上標(biāo)上數(shù)字,為指針加上陰影效果,在設(shè)置,在刻度上標(biāo)上數(shù)字,為指針加上陰影效果,在時鐘上顯示日期等。有興趣的同學(xué)有空不妨試試時鐘上顯示日期等。有興趣的同學(xué)有空不妨試試。應(yīng)用程序框架設(shè)計過程(僅供參考)n打開VC6.0,新建

6、一個MFC工程,輸入工程名,選擇“MFC AppWizard”如圖所示,然后點擊OK。n為簡單起見,這里選擇“Dialog based”程序,然后可以直接選擇finish了。n在類視圖的工程名上右鍵單擊,選擇New Class(如下圖所示)來建立一個新類。n我們可以從CStatic類(靜態(tài)控件類)派生出類CClockEx來實現(xiàn)時鐘控件類,這樣,就可以繼承MFC靜態(tài)控件的很多已經(jīng)具備的功能和特點。在建立新類的對話框中,按下圖輸入。n按按CtrlCtrlW W調(diào)出調(diào)出Class WizardClass Wizard,在,在class nameclass name中選擇剛才建立的中選擇剛才建立的新類

7、新類CClockExCClockEx,然后,然后重載虛函數(shù)重載虛函數(shù)PreSubClassWindowPreSubClassWindow,對時鐘控件的基本初始化工作,對時鐘控件的基本初始化工作將在該函數(shù)中進行。將在該函數(shù)中進行。添加消息響應(yīng)添加消息響應(yīng)WM_PAINTWM_PAINT,我們必須用自己完成時鐘的繪制工作。,我們必須用自己完成時鐘的繪制工作。添加消息響應(yīng)添加消息響應(yīng)WM_SIZEWM_SIZE,重載該消息響應(yīng)以便我們的時鐘控件能,重載該消息響應(yīng)以便我們的時鐘控件能夠自動適應(yīng)其大小的變化。夠自動適應(yīng)其大小的變化。為了時鐘能夠走動,我們得定時刷新時鐘控件讓它走動,還得為了時鐘能夠走動,

8、我們得定時刷新時鐘控件讓它走動,還得添加添加WM_TIMERWM_TIMER的消息響應(yīng)。最終效果如下圖所示。的消息響應(yīng)。最終效果如下圖所示。n到目前為止,時鐘控件的輪廓和已經(jīng)有了,下面考到目前為止,時鐘控件的輪廓和已經(jīng)有了,下面考慮時鐘繪制的具體實現(xiàn)。慮時鐘繪制的具體實現(xiàn)。一個時鐘大致可由時鐘背景、時針、分針、秒針?biāo)囊粋€時鐘大致可由時鐘背景、時針、分針、秒針?biāo)膫€部分構(gòu)成。個部分構(gòu)成。以上的時鐘四個部分可是看作四個不同的對象,可以上的時鐘四個部分可是看作四個不同的對象,可以考慮建立類以考慮建立類CClockBackgroundCClockBackground、CClockHourHandCClo

9、ckHourHand、CClockMinHandCClockMinHand、CClockSecHandCClockSecHand來分別實現(xiàn)。(此來分別實現(xiàn)。(此處為了意義明確,類名都比較長)處為了意義明確,類名都比較長)這四個類有它們的共同點,譬如都有自己的繪圖函這四個類有它們的共同點,譬如都有自己的繪圖函數(shù),如果要具體能夠設(shè)置顏色,它們都應(yīng)該有自己數(shù),如果要具體能夠設(shè)置顏色,它們都應(yīng)該有自己的繪圖顏色,同樣應(yīng)該有顏色設(shè)置函數(shù),此外都有的繪圖顏色,同樣應(yīng)該有顏色設(shè)置函數(shù),此外都有繪圖區(qū)域和區(qū)域設(shè)置函數(shù)等等。因此,可以為它們繪圖區(qū)域和區(qū)域設(shè)置函數(shù)等等。因此,可以為它們的共性建立一個基類,此處命名

10、為的共性建立一個基類,此處命名為CClockElementCClockElement。n下面逐步實現(xiàn)各個類,首先實現(xiàn)各個組成類的基類下面逐步實現(xiàn)各個類,首先實現(xiàn)各個組成類的基類CClockElement。同樣,在。同樣,在ClassView的工程名上面點右的工程名上面點右鍵,選擇鍵,選擇New Class,在,在ClassType里面選擇里面選擇Genenric Class,類,類CClockElement不需要從其它類派生,所以不需要從其它類派生,所以Base Class可以不填,效果如下圖所示。可以不填,效果如下圖所示。n下面對類CClockElement的源代碼進行編寫。因為在后面的繪圖

11、中需要用到因為在后面的繪圖中需要用到sinsin和和coscos這兩個數(shù)這兩個數(shù)學(xué)計算公式,因此需包含頭文件學(xué)計算公式,因此需包含頭文件以便使以便使用數(shù)學(xué)函數(shù)庫。為后面計算使用,還需定義數(shù)學(xué)用數(shù)學(xué)函數(shù)庫。為后面計算使用,還需定義數(shù)學(xué)常量常量PIPI(31415926535)。)。時鐘的每個組成部分都有繪圖區(qū)域區(qū)域,因此,時鐘的每個組成部分都有繪圖區(qū)域區(qū)域,因此,可在基類中定義繪圖區(qū)域變量。同理,可以定義可在基類中定義繪圖區(qū)域變量。同理,可以定義顏色變量,為了是顏色不顯得單調(diào),這里為每個顏色變量,為了是顏色不顯得單調(diào),這里為每個控件設(shè)置兩種顏色(如果想使程序更加絢麗,可

12、控件設(shè)置兩種顏色(如果想使程序更加絢麗,可以設(shè)置更多顏色)。以設(shè)置更多顏色)。對應(yīng)的,這些變量需增加接口函數(shù)來進行訪問。對應(yīng)的,這些變量需增加接口函數(shù)來進行訪問。對于每個組成部分都應(yīng)該有的對于每個組成部分都應(yīng)該有的DrawDraw函數(shù),當(dāng)然也函數(shù),當(dāng)然也需在基類中定義,但是,該函數(shù)對于基類來說是需在基類中定義,但是,該函數(shù)對于基類來說是無需函數(shù)實現(xiàn)的,因此可定義為純虛函數(shù)。無需函數(shù)實現(xiàn)的,因此可定義為純虛函數(shù)。n綜合剛才這幾點,綜合剛才這幾點,CClockElementCClockElement的實現(xiàn)的頭文件代碼如下的實現(xiàn)的頭文件代碼如下:#include #define PI 3.14159

13、26535class CClockElement public:void SetColor(COLORREF crMain, COLORREF crOther);/設(shè)置顏色void SetTime(const CTime &tmCur);/設(shè)置當(dāng)前時間void SetRegion(LPRECT lprcRect);/設(shè)置繪圖區(qū)域virtual void Draw(CDC *pDC) = 0;/繪圖函數(shù)CClockElement();virtual CClockElement();protected:COLORREFm_crMain;/主要顏色COLORREFm_crOther;/輔助的

14、其他顏色CTimem_tmCur;/當(dāng)前時刻CRectm_rcRegion;/繪圖區(qū)域intm_nRadius;/時鐘半徑nCClockElement的實現(xiàn)的源文件關(guān)鍵代碼如下:的實現(xiàn)的源文件關(guān)鍵代碼如下:CClockElement:CClockElement()m_nRadius = 0;m_crMain = RGB(255, 255, 255);m_crOther = RGB(128, 128, 128);CClockElement:CClockElement()void CClockElement:SetRegion(LPRECT lprcRect)m_rcRegion = lprcRe

15、ct;m_nRadius = m_rcRegion.Width() / 2;if (m_rcRegion.Width() m_rcRegion.Height()m_nRadius = m_rcRegion.Height() / 2;n續(xù)上頁:void CClockElement:SetTime(const CTime &tmCur)m_tmCur = tmCur;void CClockElement:SetColor(COLORREF crMain, COLORREF crOther)m_crMain = crMain;m_crOther = crOther;n下面實現(xiàn)時鐘背景類CCl

16、ockBackground。同樣,在ClassView的工程名上面點右鍵,選擇New Class,在ClassType里面選擇Genenric Class,類CClockBackground需要從類CClockElement派生,所以Base Class需選擇類CClockElement,效果如下圖所示。nCClockBackground只需實現(xiàn)基類的虛函數(shù)Draw即可,因此這里重載基類的虛函數(shù)Draw,其頭文件實現(xiàn)代碼如下:#include ClockElement.hclass CClockBackground : public CClockElement public:CClockBac

17、kground();virtual CClockBackground();nCClockBackground源文件代碼如下:CClockBackground:CClockBackground()/為時鐘背景定義默認的顏色設(shè)置m_crMain = RGB(0, 255, 0);m_crOther = RGB(0, 128, 0);CClockBackground:CClockBackground()void CClockBackground:Draw(CDC *pDC)/準(zhǔn)備設(shè)備環(huán)境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1

18、, m_crOther);CBrush brMain(m_crMain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&penOther);CBrush *pOldBrush = pDC-SelectObject(&brMain);nCClockBackgroundCClockBackground源文件代碼如下(續(xù)上頁):源文件代碼如下(續(xù)上頁):n/繪制繪制6060個小圓點,表示分針和秒針的刻度個小圓點,表示分針和秒針的刻度CPoint ptCenter = m_rcRegion.CenterPoint();int

19、 nRadius = m_nRadius - 8;for(int i=0; iEllipse(rcDot);/繪制繪制12個小方框,表示個小方框,表示12個正點個正點pDC-SelectObject(&penMain);pOldBrush = pDC-SelectObject(&brOther);for(i=0; iRectangle(rcDot);/還原設(shè)備環(huán)境還原設(shè)備環(huán)境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);n下面實現(xiàn)時針類CClockHourHand,該類新建的過程與CClockBackground一樣

20、, CClockHourHand同樣只需實現(xiàn)基類的虛函數(shù)Draw即可,其頭文件實現(xiàn)代碼如下:#include ClockElement.hclass CClockHourHand : public CClockElement public:CClockHourHand();virtual CClockHourHand();virtual void Draw(CDC *pDC);nCClockHourHandCClockHourHand源文件代碼如下:源文件代碼如下:CClockHourHand:CClockHourHand()/定義默認顏色定義默認顏色m_crMain = RGB(0, 255

21、, 100);m_crOther = RGB(128, 128, 0);CClockHourHand:CClockHourHand()void CClockHourHand:Draw(CDC *pDC)/初始化設(shè)備環(huán)境初始化設(shè)備環(huán)境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);CBrush brMain(m_crMain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&penOther);CBrush *pOldBrush = pD

22、C-SelectObject(&brMain);/確定當(dāng)前指針的弧度確定當(dāng)前指針的弧度int nTime = (m_tmCur.GetHour() % 12) * 3600;nTime += m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTime / 3600 / 12; nCClockHourHand源文件代碼如下(續(xù)上頁):/確定繪制菱形指針確定繪制菱形指針?biāo)璧乃膫€角的所需的四個角的坐標(biāo)坐標(biāo)CPoint ptDiamond4;for(int i=0; iPolygo

23、n(ptDiamond, 4);/恢復(fù)設(shè)備環(huán)境恢復(fù)設(shè)備環(huán)境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);n下面實現(xiàn)分針類CClockMinHand,該類新建的過程與CClockHourHand一樣,類的實現(xiàn)也基本相似,其頭文件實現(xiàn)代碼如下:#include ClockElement.hclass CClockMinHand : public CClockElement public:CClockMinHand();virtual CClockMinHand();virtual void Draw(CDC *pDC);nCClockM

24、inHandCClockMinHand源文件代碼如下:源文件代碼如下:CClockMinHand:CClockMinHand()/定義默認顏色定義默認顏色m_crMain = RGB(0, 255, 100);m_crOther = RGB(128, 128, 0);CClockMinHand:CClockMinHand()void CClockMinHand:Draw(CDC *pDC)/初始化設(shè)備環(huán)境初始化設(shè)備環(huán)境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);CBrush brMain(m_crM

25、ain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&penOther);CBrush *pOldBrush = pDC-SelectObject(&brMain);/確定分針?biāo)谖恢玫幕《却_定分針?biāo)谖恢玫幕《萯nt nTime = m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTime / 3600;nCClockMinHand源文件代碼如下(續(xù)上頁):源文件代碼如下(續(xù)上頁):/確定繪制菱形指針

26、確定繪制菱形指針?biāo)璧乃膫€角的所需的四個角的坐標(biāo)坐標(biāo)CPoint ptDiamond4;for(int i=0; iPolygon(ptDiamond, 4);/恢復(fù)設(shè)備環(huán)境恢復(fù)設(shè)備環(huán)境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);n下面實現(xiàn)秒針類CClockSecHand,該類新建的過程與CClockHourHand一樣,類的實現(xiàn)也基本相似,其頭文件實現(xiàn)代碼如下:#include ClockElement.hclass CClockSecHand : public CClockElement public:CClockSecHan

27、d();virtual CClockSecHand();virtual void Draw(CDC *pDC);nCClockSecHandCClockSecHand源文件代碼如下:源文件代碼如下:CClockSecHand:CClockSecHand()/設(shè)定秒針的默認顏色設(shè)定秒針的默認顏色m_crMain = RGB(0, 200, 200);m_crOther = RGB(0, 200, 200);CClockSecHand:CClockSecHand()void CClockSecHand:Draw(CDC *pDC)int nTime = m_tmCur.GetSecond();CP

28、oint ptStart = m_rcRegion.CenterPoint();CPoint ptEnd = ptStart;int nRadius = m_nRadius - 10;ptEnd.Offset(int)(nRadius * sin(2 * PI * nTime / 60), (int)(-nRadius * cos(2 * PI * nTime / 60);CPen penMain(PS_SOLID, 1, m_crMain);CPen *pOldPen = pDC-SelectObject(&penMain);pDC-MoveTo(ptStart);pDC-LineT

29、o(ptEnd);pDC-SelectObject(pOldPen);n到目前為止,時鐘的各個部件都已經(jīng)設(shè)計完畢,現(xiàn)在該把它們組裝起來到目前為止,時鐘的各個部件都已經(jīng)設(shè)計完畢,現(xiàn)在該把它們組裝起來了。了。剛才建立的四個類剛才建立的四個類CClockBackground、CClockHourHand、CClockMinHand、CClockSecHand要為要為CClockEx服務(wù),正如服務(wù),正如CClockElement為它們服務(wù)一樣,不過服務(wù)的方式發(fā)生了變化,剛才是為它們服務(wù)一樣,不過服務(wù)的方式發(fā)生了變化,剛才是以繼承的方式使用,現(xiàn)在需要將上面四個類實例化供以繼承的方式使用,現(xiàn)在需要將上面四

30、個類實例化供CClockEx使用。使用。因此,首先應(yīng)該在類因此,首先應(yīng)該在類CClockEx為上四個類分別建立對象。在為上四個類分別建立對象。在CClockEx的頭文件中恰當(dāng)位置加入以下代碼:的頭文件中恰當(dāng)位置加入以下代碼:#include ClockBackground.h#include ClockHourHand.h#include ClockMinHand.h#include ClockSecHand.hclass CClockEx : public CStaticprivate:CClockBackgroundm_clockBK;/時鐘背景時鐘背景CClockHourHandm_cl

31、ockHour; /時指針時指針CClockMinHandm_clockMin;/分指針分指針CClockSecHandm_clockSec;/秒指針秒指針為了存儲繪圖區(qū)域的大小,需要在為了存儲繪圖區(qū)域的大小,需要在CClockExCClockEx中加入一個變量中加入一個變量m_rcClientm_rcClient: CRectCRect m_rcClient m_rcClient; ;/客戶區(qū)域客戶區(qū)域在在PreSubclassWindowPreSubclassWindow函數(shù)中進行時鐘的初始化工作。首先函數(shù)中進行時鐘的初始化工作。首先得為各個部件設(shè)定區(qū)域大小,然后啟動定時刷新的定時器得為各

32、個部件設(shè)定區(qū)域大小,然后啟動定時刷新的定時器(100100毫秒的定時器已經(jīng)足夠)。由于每個部件都有自己的毫秒的定時器已經(jīng)足夠)。由于每個部件都有自己的默認顏色配置,因此這里暫且先使用默認配置,當(dāng)然也可以默認顏色配置,因此這里暫且先使用默認配置,當(dāng)然也可以自定義顏色:自定義顏色:GetClientRect(m_rcClientGetClientRect(m_rcClient); /); /獲取當(dāng)前客戶區(qū)域獲取當(dāng)前客戶區(qū)域m_clockBK.SetRegion(m_rcClientm_clockBK.SetRegion(m_rcClient););m_clockHour.SetRegion(m_r

33、cClientm_clockHour.SetRegion(m_rcClient););m_clockMin.SetRegion(m_rcClientm_clockMin.SetRegion(m_rcClient););m_clockSec.SetRegion(m_rcClientm_clockSec.SetRegion(m_rcClient););SetTimer(1, 100, NULL);SetTimer(1, 100, NULL); / /每每100100毫秒刷新一次毫秒刷新一次當(dāng)控件大小發(fā)生變化時,控件狀態(tài)要能夠自動更新:當(dāng)控件大小發(fā)生變化時,控件狀態(tài)要能夠自動更新:void CClo

34、ckEx:OnSize(UINT nType, int cx, int cy) CStatic:OnSize(nType, cx, cy);GetClientRect(m_rcClient);m_clockBK.SetRegion(m_rcClient);m_clockHour.SetRegion(m_rcClient);m_clockMin.SetRegion(m_rcClient);m_clockSec.SetRegion(m_rcClient);每個定時器時間觸發(fā)時,需要刷新控件以保證時鐘的走動:每個定時器時間觸發(fā)時,需要刷新控件以保證時鐘的走動:void CClockEx:OnTime

35、r(UINT nIDEvent) Invalidate(FALSE);CStatic:OnTimer(nIDEvent);下面實現(xiàn)時鐘的繪制,由于控件在不斷刷新,按一般方式繪圖,屏幕會下面實現(xiàn)時鐘的繪制,由于控件在不斷刷新,按一般方式繪圖,屏幕會不斷閃爍,因此此處使用雙緩沖繪圖不斷閃爍,因此此處使用雙緩沖繪圖就是在內(nèi)存中繪圖,繪制完畢就是在內(nèi)存中繪圖,繪制完畢時在時在CopyCopy到屏幕上,這樣可以有效的防止屏幕閃爍:到屏幕上,這樣可以有效的防止屏幕閃爍:void CClockEx:OnPaint() CPaintDC dc(this); / device context for paint

36、ing/實現(xiàn)雙緩沖繪圖實現(xiàn)雙緩沖繪圖防止屏幕閃爍防止屏幕閃爍CDCdcMem;dcMem.CreateCompatibleDC(&dc);CBitmapbmp;bmp.CreateCompatibleBitmap(&dc, m_rcClient.Width(), m_rcClient.Height();dcMem.SelectObject(&bmp);DrawClock(&dcMem);/繪制時鐘繪制時鐘dc.BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), &dcMem, 0, 0, SRCCO

37、PY);為了程序結(jié)構(gòu)更清晰,我們將繪圖函數(shù)放在一個單獨的函數(shù)為了程序結(jié)構(gòu)更清晰,我們將繪圖函數(shù)放在一個單獨的函數(shù)DrawClock中,下面室中,下面室DrawClock的函數(shù)實現(xiàn):的函數(shù)實現(xiàn):void CClockEx:DrawClock(CDC *pDC)CTime tmCur = CTime:GetCurrentTime();m_clockBK.SetTime(tmCur);m_clockHour.SetTime(tmCur);m_clockMin.SetTime(tmCur);m_clockSec.SetTime(tmCur);m_clockBK.Draw(pDC);m_clockMin

38、.Draw(pDC);m_clockHour.Draw(pDC);m_clockSec.Draw(pDC);下面是完整的下面是完整的CClockExCClockEx源碼:源碼:#if !defined(AFX_CLOCKEX_H_EB35C434_A727_43BE_B10E_121F6307EA73_INCLUDED_)#define AFX_CLOCKEX_H_EB35C434_A727_43BE_B10E_121F6307EA73_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ ClockEx.h : heade

39、r file/ CClockEx window#include ClockBackground.h#include ClockHourHand.h#include ClockMinHand.h#include ClockSecHand.hclass CClockEx : public CStaticprivate:CRectm_rcClient;/客戶區(qū)域客戶區(qū)域CClockBackground m_clockBK;/時鐘背景時鐘背景CClockHourHandm_clockHour;/時指針時指針CClockMinHandm_clockMin;/分指針分指針CClockSecHandm_cl

40、ockSec;/秒指針秒指針void DrawClock(CDC *pDC);/ Constructionpublic:CClockEx();下面是完整的下面是完整的CClockExCClockEx源碼(續(xù)上頁):源碼(續(xù)上頁):/ Attributespublic:/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CClockEx)protected:virtual void PreSubclassWindow();/AFX_VIRTUAL/ Impleme

41、ntationpublic:virtual CClockEx();/ Generated message map functionsprotected:/AFX_MSG(CClockEx)afx_msg void OnPaint();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnTimer(UINT nIDEvent);/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional decl

42、arations immediately before the previous line.#endif / !defined(AFX_CLOCKEX_H_EB35C434_A727_43BE_B10E_121F6307EA73_INCLUDED_)下面是完整的下面是完整的CClockExCClockEx源碼(續(xù)上頁):源碼(續(xù)上頁):/ ClockEx.cpp : implementation file#include stdafx.h#include ClockProject.h#include ClockEx.h#ifdef _DEBUG#define new DEBUG_NEW#und

43、ef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CClockExCClockEx:CClockEx()CClockEx:CClockEx()BEGIN_MESSAGE_MAP(CClockEx, CStatic)/AFX_MSG_MAP(CClockEx)ON_WM_SIZE()ON_WM_PAINT()ON_WM_TIMER()/AFX_MSG_MAPEND_MESSAGE_MAP()下面是完整的下面是完整的CClockExCClockEx源碼(續(xù)上頁):源碼(續(xù)上頁):/ CClockEx/ CClockEx message handl

44、ers message handlersvoid CClockEx:PreSubclassWindowvoid CClockEx:PreSubclassWindow() () /獲取當(dāng)前客戶區(qū)域獲取當(dāng)前客戶區(qū)域GetClientRect(m_rcClientGetClientRect(m_rcClient););m_clockBK.SetRegion(m_rcClientm_clockBK.SetRegion(m_rcClient););m_clockHour.SetRegion(m_rcClientm_clockHour.SetRegion(m_rcClient););m_clockMin.

45、SetRegion(m_rcClientm_clockMin.SetRegion(m_rcClient););m_clockSec.SetRegion(m_rcClientm_clockSec.SetRegion(m_rcClient););SetTimer(1, 100, NULL);SetTimer(1, 100, NULL);CStatic:PreSubclassWindowCStatic:PreSubclassWindow();(); void CClockEx:OnSize(UINT nType, int cx, intvoid CClockEx:OnSize(UINT nType,

46、 int cx, int cy) cy) CStatic:OnSize(nType, cxCStatic:OnSize(nType, cx, cy);, cy);GetClientRect(m_rcClientGetClientRect(m_rcClient););m_clockBK.SetRegion(m_rcClientm_clockBK.SetRegion(m_rcClient););m_clockHour.SetRegion(m_rcClientm_clockHour.SetRegion(m_rcClient););m_clockMin.SetRegion(m_rcClientm_cl

47、ockMin.SetRegion(m_rcClient););m_clockSec.SetRegion(m_rcClientm_clockSec.SetRegion(m_rcClient);); 下面是完整的下面是完整的CClockExCClockEx源碼(續(xù)上頁):源碼(續(xù)上頁):void CClockEx:OnPaintvoid CClockEx:OnPaint() () CPaintDCCPaintDC dc(this); / device context for painting dc(this); / device context for painting/實現(xiàn)雙緩沖繪圖實現(xiàn)雙緩沖繪圖防止屏幕閃爍防止屏幕閃爍CDCCDCdcMemdcMem; ;dcMem.Crea

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論