C++課程設計MFC市公開課獲獎課件_第1頁
C++課程設計MFC市公開課獲獎課件_第2頁
C++課程設計MFC市公開課獲獎課件_第3頁
C++課程設計MFC市公開課獲獎課件_第4頁
C++課程設計MFC市公開課獲獎課件_第5頁
已閱讀5頁,還剩143頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、C+課程設計內容及要求1第1頁第1頁主要內容課程設計基本要求Windows 編程基礎什么是C+MFC什么是MFC編程MFC應用程序開發流程單文檔【ClassView】面板登錄對話框與單文檔視圖聯接單文檔中菜單項與對話框聯接實例簡介2第2頁第2頁一、課程設計基本要求自學MFC(2學時)知識擴充C+:理解并掌握MFC程序結構、消息映射機制、MFC類庫中慣用類(對話框、各種慣用控件)。軟件開發基本知識結合設計任務清楚軟件開發基本流程、各個階段目的和主要工作。上機調試程序(30學時)其它(14學時)程序調試基本辦法和論文撰寫要求(2學時)掌握調試程序辦法與技巧。清楚論文組織結構、格式編排等相關知識學生

2、資料查閱與自主學習(2學時)代碼編寫(10學時)3第3頁第3頁二、Windows 編程基礎Windows 編程就是基于Windows 應用程序。2種主要Windows應用程序基于對話框應用程序基于文檔/視圖結構應用程序主要特點含有原則圖形用戶界面含有與硬件無關特性采用“消息傳遞,事件驅動”運營機制,即依據Windows發送消息來處理用戶輸入編寫Windows應用程序主要辦法(2種)使用Windows提供應用程序接口(API)函數使用Microsoft提供微軟基礎類(MFC)4第4頁第4頁三、什么是C+MFCMFC(Microsoft Foundation Class Library,基礎類庫)

3、 是微軟提供用來編寫Windows應用程序C+類庫;封裝了API(Windows接口函數),是Win API與C+結合。MFC大約有200多個類,封裝了Windows大部分編程對象以及與它們相關操作。即它由幾百個執行文獻和源代碼文獻構成。 注意C+和VC+區別C+是一個程序設計語言,是一個大家都認可軟件編制通用規范,即C+是一套語法規則名字,類似漢語,英語。 VC+是一個軟件IDE(編譯、編輯、調試 )集成開發環境 MFC是一個非外掛式軟件包,類庫, MFC類是微軟為VC+專配。5第5頁第5頁四、什么是MFC編程MFC編程指就是使用VC+進行開發,并且是在使用VC+提供各種向導情況下MFC編程

4、。在VC+中能夠創建3類典型Windows應用程序基于對話框應用程序單文檔界面(SDI)應用程序多文檔界面(MDI)應用程序文檔/視圖文檔對象:用來保留數據。視圖對象:用來顯示和編輯數據。 6第6頁第6頁五、MFC應用程序開發流程應用程序編程基本環節:(1)依據應用程序特性在MFC AppWizardexe應用程序中選擇適當應用程序框架。(2)利用資源編輯器編輯資源,如菜單等。(3)利用類向導(ClassWizard)或手工添加類、組員變量、組員函數申明。(4)編寫詳細組員函數代碼。(5)編譯、鏈接程序檢查程序中是否存在語法錯誤。(6)調試應用程序。7第7頁第7頁六、單文檔【ClassView

5、】面板CAboutDlg(關于對話框類)管理關于對話框。CFrameWnd( 框架窗口類)CWxling_27App(應用程序類)用來處理消息。CWxling_27Doc (文檔類)MFC中數據是存儲在類文檔中。文檔類負責管理和維護數據本身。CWxling_27View(視圖類)結果顯示是在視圖類中。視圖類負責處理用戶鼠標和鍵盤操作。8第8頁第8頁七、登錄對話框與單文檔視圖聯接新建單文檔工程:TEXT(注意此名由設計者自己任取);在ResourceView, 單擊Insert Dialog,插入一對話框IDD_DIALOG1(默認ID號);右鍵選中新建對話框,利用類向導建立一個新類Create

6、 a new class,名稱為:Cdlg_login ;在MainFrm.cpp文獻前面,語句#include “MainFrm.h”后面添加新類頭文獻:#include dlg_login.h 在FileView中點擊source files,雙擊MainFrm.cpp。找到:CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct),這是窗體框架創建函數。在該函數后面(在return 0 ;前面)加入語句(注意大小寫):Cdlg_login dlg; /定義一個登錄對話框對象dlgdlg.DoModal(); /讓對話框對象以有模式形式顯示出來此

7、時對話框與單文檔聯接完畢。下載“格式工廠3.011”將自己照片轉換成BMP格式,通過插入Bitmap命令,將照片引入至資源中,并添加至對話框中。9第9頁第9頁七續、登錄對話框退出按鈕代碼/擬定按鈕void CDlg_login:OnOK() / TODO: Add extra validation herethis-UpdateData(true);if(this-m_name=wxl & this-m_paw=1234)CDialog:OnOK();else MessageBox(登錄有誤);ExitProcess(0); /退出/CDialog:OnOK();/取消按鈕void CDlg_

8、login:OnCancel() / TODO: Add extra cleanup hereExitProcess(0); /退出10第10頁第10頁八、單文檔中菜單項與對話框聯接新建單文檔工程:Ys1(注意此名由設計者自己任取);在ResourceView, 單擊Insert Dialog,插入一對話框IDD_DIALOG1(默認ID號);右鍵選中新建對話框,利用類向導建立一個新類Create a new class,名稱為:Cdlg_jc(自己命名) ,如右圖1所表示;在/ Ys1View.cpp :文獻中語句#include Ys1View.h后面添加新類頭文獻:#include dl

9、g_jc.h 編輯主菜單如圖2所表示:在主菜下通過“建立類向導”命令,從“Class name”組合框中選擇CYs1View,如圖3,4所表示,并在函數OnJc()編寫代碼下列:void CYs1View:OnJc() / TODO: Add your command handler code here Cdlg_jc jc; /定義一個求階層對話框對象jcjc.DoModal(); /讓對話框對象以有模式形式顯示出來此時單文檔菜單項與對話框聯接完畢。11第11頁第11頁1.求階層按鈕代碼使用MFC進行程序設計時,如輸出結果是單值,可用下列代碼作為模板:void Cdlg_jc:OnOK()

10、/ TODO: Add extra validation hereUpdateData(TRUE); /更新控件值 double i,jsz=1.0;for(i=1;i=m_srs;i+)jsz*=i; /求階乘 m_jsz.Format ( %f ,jsz); /將雙精度型轉換為字符,f 相應浮點數/其中m_jsz為輸出編輯框組員變量名UpdateData(FALSE); /控件值更新編輯框顯示/CDialog:OnOK();12第12頁第12頁/續上for(i=a;i=b;i+) for(j=2;jTextOut(x,y,s); /在指定位置輸出文本 else pDC-TextOut(x,

11、y,s); /在指定位置輸出文本x=x+30; 2.求素數按鈕代碼void Cdlg_zss:OnOK() / TODO: Add extra validation hereUpdateData(TRUE); /更新控件值 CDC *pDC=GetDC();/獲取視圖初始客戶區DC/DC表示設備環境int a=m_szqz;int b=m_szzz;int i,j,n=0;int x=70,y=220;CString s;if(bMoveTo(100,100);pDC-LineTo(300,500);15第15頁第15頁4.單文檔菜單項中畫矩形代碼菜單項“畫矩形”按鈕代碼:void CWxli

12、ng_28View:OnHjx() / TODO: Add your command handler code hereCClientDC dc(this);CPen pen; /定義畫筆/創建紅色3號粗細實線畫筆pen.CreatePen(PS_SOLID,3,RGB(255,0,0);CPen *oldpen=dc.SelectObject(&pen);CBrush brush; /定義畫刷/創建綠色畫刷brush.CreateHatchBrush(HS_CROSS,RGB(0,255,0);dc.SelectObject(&brush);dc.Rectangle(300,300,400,

13、500); /畫矩形16第16頁第16頁5.單文檔菜單項中畫橢圓代碼菜單項“畫橢圓”按鈕代碼:void CWxling_28View:OnHty() / TODO: Add your command handler code hereCClientDC dc(this);CPen pen; /設置畫筆pen.CreatePen(PS_SOLID,3,RGB(0,255,0);CPen *oldpen=dc.SelectObject(&pen);dc.Ellipse(300,100,600,300); /畫橢圓/*(int x1,int y1,int x2,int y2)(x1,y1)和(x2,

14、y2)表示所畫橢圓外切矩形左上角和右下角坐標*/17第17頁第17頁6.單文檔菜單項中畫sin曲線代碼在/ Wxl_30View. cpp中加入頭文獻: #include math.h“菜單項“畫sin曲線”按鈕代碼:void CWxl_30View:OnSin() / TODO: Add your command handler code hereCClientDC dc(this);CRect rect; /定義矩形對象GetClientRect(rect);int x0=rect.Width()/2;int y0=rect.Height()/2;dc.MoveTo(20,y0);dc.L

15、ineTo(rect.Width()-20,y0);dc.MoveTo(x0,20);dc.LineTo(x0,rect.Height()-20);double setp=3.14159/100;for(int i=-200;imessage = WM_KEYDOWN) /鍵盤消息 if(pMsg - wParam = VK_ESCAPE) /鍵盤上Esc鍵return TRUE; if(pMsg - wParam = VK_RETURN) /鍵盤上回車鍵return TRUE;return CDialog:PreTranslateMessage(pMsg);22第22頁第22頁8.常見問題處

16、理辦法建好MFC之后(基于對話框),然后點擊Insert-New Class彈出對話框之后,Class Type:MFC Class在Base Class:CRecordset類,點擊Ok時候,會彈出要你添加數據庫對話框你就能夠添加了。 (9)如何為MFC 應用程序添加ODBC 功效? (1)在文獻Stdafx.h 文獻末尾添加下面一行: #include / MFC ODBC database classes (2)在文本模式下編輯RC 文獻(利用File-Open As text 方式) 在下面程序行(共有兩處) #include l.chsafxprint.rc / printing/p

17、rint preview resources 添加下一行: #include l.chsafxdb.rc / Database resources 23第23頁第23頁9.特殊效果(1)如何給MFC單文檔添加背景?為CTestView類添加一個變量CBrush m_brushBackground; /定義畫刷用于畫背景在CTestView結構函數中加入下列代碼CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP1); /加載位圖m_brushBackground.CreatePatternBrush(&bmp); /創建位圖畫刷在OnDraw函數中畫出來代碼下列CRect

18、 rect;GetClientRect(rect); /取得客戶區域pDC-FillRect(rect,&m_brushBackground); /用背景畫刷填充區域為了避免背景閃爍,使顯示更完美,添加WM_ERASEBKGND消息處理函數,并取消調用父類處理函數,代碼下列BOOL CTestView:OnEraseBkgnd(CDC* pDC) return TRUE; 編譯運營該程序!24第24頁第24頁9.特殊效果(2)在工程調用其它可執行文獻(.EXE)在w1View.cpp :中加入頭文獻:#include windows.h 在編輯好菜單項中編寫代碼下列void CW1View:O

19、nWord() / TODO: Add your command handler code hereWinExec(CLOCKYS.exe,NULL); /調用可執行文獻注意:將可執行文獻拷貝至本工程所在文獻夾下,不然要獲取文獻路徑。若要打開其它類型文獻,見本片下面備注。25第25頁第25頁9.特殊效果(3)在工程調用其它任意文獻菜單項按鈕代碼void CW12View:OnYy() / TODO: Add your command handler code hereCString path; /返回文獻所在路徑,含該文獻名GetModuleFileName(NULL, /要獲取文獻名模塊句柄

20、(見備注),null表示當前模塊 path.GetBufferSetLength(MAX_PATH+1), /存儲取得文獻名MAX_PATH /存儲取得文獻名參數長度); path.ReleaseBuffer(); /字符串緩沖區長度鎖定解除 int pos = path.ReverseFind(); /從后向前查找 path = path.Left(pos)path = path.Left(pos); /取左,參數為字符串個數/MessageBox(path); /調試程序時用來顯示查找到當前運營程序所在目錄 ShellExecute(NULL,open,path+年C+課程設計任務書wxl

21、.doc,NULL,NULL, SW_SHOWNORMAL);26第26頁第26頁9.特殊效果(4)僅修改工程中某個對話框圖標對相應對話框添加初始化函數OnInitDialog(),并添加下列代碼:BOOL Cdlg_login:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereHICON m_hIcon;/IDR_ICON1為圖標資源名 m_hIcon = AfxGetApp()-LoadIcon(IDI_ICON1);SetIcon(m_hIcon, TRUE); / Set big ico

22、nSetIcon(m_hIcon, FALSE); / Set small iconreturn TRUE; / return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages should return FALSE27第27頁第27頁9.特殊效果如何去掉單文檔界面中主框架“無標題”?修改IDR_MAINFRAME字符串資源中第2個參數(共有7個參數),分別以n結束,即下列格式:nnnnnnn例,將主框架標題改為”我應用程序”28第28頁第28頁在程序中使用對話框 (4) 用鼠標將新添加菜單項拖到

23、“查看”和“幫助”菜單項 之間,結果如圖所表示。 菜單項“對話框”拖放后位置(5) 選擇“查看”“建立類向導”菜單命令或直接按Ctrl+W快捷鍵,則出現MFC ClassWizard對話框,該對話框會自動切換到Message Maps頁面。(6) 從“Class name”組合框中選擇CMainFrame,在Object Ids列表中選擇ID_TEST_DLG,然后在Messages框中選擇COMMAND消息。 29第29頁第29頁在程序中使用對話框 (7) 單擊Add Function按鈕或雙擊COMMAND消息,出現“Add Member Function”對話框以輸入組員函數名稱。系統默

24、認函數名為OnTestDlg,如圖所表示。該函數是對菜單項ID_TEST_DLG映射,也就是說,當在應用程序運營時,用戶選擇“對話框”,則該函數OnTestDlg被調用,執行函數中代碼。 30第30頁第30頁在程序中使用對話框 單擊OK按鈕,在ClassWizard“Member functions”列表中將列出新增長組員函數。選擇此函數,單擊Edit Code按鈕(或直接在函數名雙擊鼠標),在此組員函數中添加下列代碼:void CMainFrame:OnTestDlg() CFirstDlg dlg;/ 定義對話框類對象 dlg.DoModal();/ 顯示對話框 代碼中,DoModal是C

25、Dialog基類組員函數,它是用來顯示和終止模式對話框。31第31頁第31頁在程序中使用對話框 在OnTestDlg函數實現文獻MainFrm.cpp前面添加CFirstDlg類頭文獻包括,即:#include Ex_SDI.h#include MainFrm.h#include FirstDlg.h“(10) 編譯并運營。在應用程序菜單上,選擇“測試” “對話框”菜單項,將出現如圖對話框,這個對話框就是剛才添加對話框。 32第32頁第32頁幾種常見幾何圖形繪制。利用MFC AppWizard建立一個SDI應用程序,在OnDraw()函數中添加下列程序代碼: void CMyGraphView

26、:OnDraw(CDC* pDC)CTexthtDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here for(int xPos=20;xPosSetPixel(xPos,30,RGB(0,0,0); / 繪制像素點 POINT polylpt5=10,100,50,60,120,80,80,150,30,130; pDC-Polyline(polylpt,5); / 繪制4條折線 POINT polybpt4=150,160,220,60,300,180, 330,20;

27、pDC-PolyBezier(polybpt,4); / 繪制貝塞爾曲線 CBrush *pBrhOld; pBrhOld=(CBrush*)pDC-SelectStockObject( LTGRAY_BRUSH); / 使用淺灰色堆畫刷 pDC-RoundRect(400,30,550,100,20,20); / 繪制圓角矩形 pDC-Arc(20,200,200,300,200,250,20,200); / 繪制橢圓弧 pDC-Pie(220,200,400,380,380,270,240,220); / 繪制扇形 pDC-Chord(420,120,540,240,520,160,420

28、,180); / 繪制弦形 POINT polygpt5=450,200,530,220,560,300,480,320,430,280; pDC-Polygon(polygpt,5); / 繪制五邊形 pDC-SelectObject(pBrhOld); / 恢復系統默認畫刷33第33頁第33頁繪制效果34第34頁第34頁九、實例簡介實例1靜態控件使用實例2編輯框應用實例3單選鈕應用程序實例4簡易時鐘應用程序實例5計算器應用程序實例6調用自定義對話框實例7數據庫編程實例返回目錄35第35頁第35頁實例1靜態控件使用創建環節:建立基于對話框MFC應用程序框架;設置對話放置控件;在菜單或工具欄空

29、白處,單擊右鍵,彈出控件工具欄,再選擇所需控件;設置控件屬性;調試程序36第36頁第36頁環節1:建立基于對話框應用程序框架(1)創建工程:TEST137第37頁第37頁環節2、3:放置控件;調試程序(1)刪除既有控件(2)設置對話框標題利用“屬性”設置(3)添加組框設置屬性(4)添加靜態文本框設置屬性(5)添加圖片單擊“插入/資源”命令,通過菜單引入:(位圖(BMP或DIB)、圖標(Icon)、圖元文獻(wMF )圖片控件屬性對對話框中類型、圖像進行設置控件屬性控件ID號標題作用對話框默認靜態控件使用用戶視圖組框默認示例將一組相關控件框起來圖片默認點綴靜態文本默認同窗們好!顯示文本信息返回實

30、例38第38頁第38頁特殊效果對話框中設置靜態文本框字體及顏色操作環節:1. 添加對話框類申明中字體和顏色變量 class CDHKDlg : public CDialog/ Constructionpublic:CFont m_myFont; / 字體對象 COLORREF m_myColor; / 顏色對象.2. 在對話框初始化函數OnInitDialog()中對字體和顏色進行初始化m_myFont.CreatePointFont(150, _T(“華文彩云”); /150是字體大小m_myColor = RGB(255, 0, 255);39第39頁第39頁續上:3. 為對話框類添加WM

31、_CTLCOLOR消息響應函數,并在其消息響應函數OnCtlColor()中添加代碼/ 消息響應函數實現 HBRUSH CDHKDlg:OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor )HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor); / TODO: Change any attributes of the DC here (在此更改 DC 任何屬性) if(pWnd-GetDlgCtrlID()=IDC_STATIC_1) pDC-SelectObject(&m_myFont); /

32、 設置字體 pDC-SetTextColor(m_myColor); / 設置顏色 / TODO: Return a different brush if the default is not desired(假如默認不是所需畫筆,則返回另一個畫筆 )return hbr; 40第40頁第40頁實例2編輯框應用創建環節:建立基于對話框MFC應用程序框架;設置對話放置控件;設置控件屬性;為控件連接變量,即為控件命名;添加并且編寫消息處理函數;調試程序。41第41頁第41頁環節1,2:建立框架、添加控件控件屬性控件ID號標題變量類型連接變量范圍 尤其屬性對話框默認編輯框應用組框默認成績計算靜態文本

33、框默認數學靜態文本框默認語文靜態文本框默認英語靜態文本框默認平均分 擴展樣式靜態文本框IDC_AVERAGECstringm_avg編輯框IDC_SXintm_sx0100編輯框IDC_YWintm_yw0100編輯框IDC_YYintm_yy0100按鈕IDC_JS計算平均分按鈕IDC_OK退出(1)創建工程:TEST2(2)添加控件,并設置控件相關屬性42第42頁第42頁環節3:連接變量(1)單擊“建立類向導”命令,啟動類向導;(2)選擇“組員變量”選取項卡,連接變量;(3)結果如右圖所表示43第43頁第43頁BOOL CTEST2Dlg:OnInitDialog() CDialog:On

34、InitDialog(); / Add About. menu item to system menu.m_avg=0.0;UpdateData(FALSE);/省略環節4:進行消息映射(1)初始化對話框(是程序運營時開始狀態設定)進入ClassWiZard(類向導),Message Maps,在Object IDs里選擇要添加OnInitDialog()函數對話框類,在Messages里選擇WM_INITDIALOG,單擊Add Function(增長函數),此時對話框類就新增了一個函數是OnInitDialog()。(2)編輯初始化代碼:44第44頁第44頁void CTEST2Dlg:O

35、nJs() / TODO: Add your control notification handler code hereUpdateData(TRUE); /更新控件值 double avg=double(m_sx+m_yw+m_yy)/3.0;m_avg.Format (%6.2f,avg);UpdateData(FALSE); /控件值更新編輯框顯示環節5:編寫代碼_對“計算平均分”按鈕(1)雙擊“計算平均分”按鈕,為IDC_JS添加BN_CLICKED消息映射:(2)編寫代碼。45第45頁第45頁環節6:編寫代碼_對“退出”按鈕(1)雙擊“退出”按鈕,為IDC_OK添加BN_CLICK

36、ED消息映射:(2)編寫代碼。void CTEST2Dlg:OnOk() / TODO: Add your control notification handler code hereOnOK();46第46頁第46頁環節7:調試程序_運營注意:對話框中平均分顯示部分是在設置屬性時,選擇了“擴展樣式”選項卡中“客戶邊沿”選項效果。返回實例47第47頁第47頁實例3單選鈕應用程序設計如右圖所表示程序。基本環節:創建工程TESTp246,并進行界面設計;為編輯框連接到CString類型添加組員變量m_xm,其余控件不需連接;為控件編輯ID4. 對單選鈕編寫初始化函數代碼5. 對對話框“擬定”按鈕編

37、寫代碼48第48頁第48頁環節13:建立框架,連接變量,編輯ID注意對組框1中2個單選按鈕,在設置第一個按鈕(男)屬性時,需選定“組”選項,表示此組默認第1個按鈕;同理對組框2中3個單選按鈕,在設置第一個按鈕(專家)屬性時,需選定“組”選項,表示此組默認第1個按鈕;組框本身屬性不要選中“組”選項。49第49頁第49頁環節4:單選鈕初始化函數代碼BOOL CTESTp246Dlg:OnInitDialog()CDialog:OnInitDialog();CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);CheckRadioButton(IDC_

38、RADIO3,IDC_RADIO5,IDC_RADIO3);/ Add About. menu item to system menu.表示為默認按鈕50第50頁第50頁環節5:對話框“擬定”按鈕代碼void CTESTp246Dlg:OnButton1() / TODO: Add your control notification handler code hereUpdateData(TRUE);CString s;s=s+m_xm;if(IsDlgButtonChecked(IDC_RADIO1)s=s+男;elses=s+女;if(IsDlgButtonChecked(IDC_RADI

39、O3)s=s+專家;else if(IsDlgButtonChecked(IDC_RADIO4)s=s+副專家;elses=s+講師;AfxMessageBox(s);返回實例51第51頁第51頁實例4簡易時鐘程序基于對話框基本環節:創建工程(基于基本對話框)CLOCKYS(時鐘演示)添加新類CClockEx,實現時鐘控件類。添加消息響應及函數,來建立時鐘控件輪廓。時鐘設計時鐘元素創建時鐘基類CClockElement添加時針類、分針類、秒針類編譯執行。環節1:創建工程CLOCKYS返回實例52第52頁第52頁環節2:創建一個新類CClockEx從CStatic(靜態控件)類派生出類CCloc

40、kEx來實現時鐘控件類,這樣,就能夠繼承MFC靜態控件諸多已經具備功效和特點.53第53頁第53頁環節3:添加消息響應建立時鐘控件輪廓時鐘控件輪廓單擊“查看建立類向導” 調出Class Wizard,在class name中選擇剛建立新類CClockEx,進行下列工作: 重載虛函數PreSubClassWindow對時鐘控件基本初始化工作將在該函數中進行。 添加WM_PAINT消息響應用于完畢時鐘繪制工作。 添加WM_SIZE消息響應以便設計時鐘控件能自動適應其大小改變。 添加WM_TIMER消息響應定期刷新時鐘控件讓它走動。此時,時鐘控件輪廓已建好。效果如圖所表示。54第54頁第54頁環節4

41、:時鐘設計時鐘元素時鐘繪制具體實現。時鐘大致由:時鐘背景、時針、分針、秒針4個部分組成。這4個部分可看作4個不同對象,可以考慮建立類來分別實現。 。CClockBackground (背景)CClockHourHand(時針)CClockMinHand(分針)CClockSecHand(秒針)這4個類有它們共同點:都有自己繪圖函數;都有自己繪圖顏色;都應有顏色設置函數;都有繪圖區域和區域設置函數等等。因此,可認為它們共性建立一個基類,命名為:CClockElement(時鐘元素)。55第55頁第55頁環節4續:創建時鐘基類CClockElement先建各個構成類基類:CClockElement

42、辦法:右鍵單擊ClassView工程選擇New Class;在ClassType里面選擇Genenric Class,類;CClockElement不需要從其它類派生,因此Base Class能夠不填,效果如右圖所表示。56第56頁第56頁環節4續:創建時鐘基類CClockElement代碼對類CClockElement源代碼進行編寫。添加頭文獻 #include 因后面繪圖中需要用到sin和cos這兩個數學計算公式。為后面計算使用,定義數學常量 PI(3.1415926535)。在基類中定義繪圖區域變量時鐘每個構成部分都有繪圖區域區域,可定義顏色變量。為了是顏色不顯得單調,這里為每個控件設置

43、兩種顏色(假如想使程序愈加絢麗,能夠設置更多顏色)。增長接口函數這些變量需增長接口函數來進行訪問。每個構成部分都應當有Draw(繪圖)函數也需在基類中定義,但是,該函數對于基類來說是無需函數實現,因此可定義為純虛函數。57第57頁第57頁環節4續:創建時鐘基類CClockElement代碼/ ClockElement.h: interface for the CClockElement class. CClockElement實現頭文獻代碼下列:#if !defined(AFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUD

44、ED_)#define AFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include #define PI 3.1415926535class CClockElement public:void SetColor(COLORREF crMain, COLORREF crOther);/設置顏色void SetTime(const CTime &tmCur);/設置當前時間void SetRegion(LPRE

45、CT lprcRect);/設置繪圖區域virtual void Draw(CDC *pDC) = 0;/繪圖函數,此函數是一虛函數CClockElement();virtual CClockElement();protected:COLORREF m_crMain; /主要顏色COLORREF m_crOther; /輔助其它顏色CTimem_tmCur; /當前時刻CRectm_rcRegion;/繪圖區域intm_nRadius;/時鐘半徑;58第58頁第58頁CClockElement實現源文獻關鍵代碼下列:/ ClockElement.cpp:CClockElement:CClock

46、Element() /時鐘基類結構函數m_nRadius = 0; /時鐘半徑m_crMain = RGB(255, 255, 255); /主要顏色m_crOther = RGB(128, 128, 128);/輔助其它顏色CClockElement:CClockElement() /時鐘基類析構函數/設置繪圖區域函數void CClockElement:SetRegion(LPRECT lprcRect)m_rcRegion = lprcRect; /區域取值m_nRadius = m_rcRegion.Width() / 2; /半徑取值if (m_rcRegion.Width() m_

47、rcRegion.Height()/半徑寬度和頂點比較m_nRadius = m_rcRegion.Height() / 2;/設置當前時間函數void CClockElement:SetTime(const CTime &tmCur) m_tmCur = tmCur; /設置顏色函數void CClockElement:SetColor(COLORREF crMain, COLORREF crOther)m_crMain = crMain; /獲取主顏色m_crOther = crOther; /獲取其它顏色59第59頁第59頁環節5:創建時鐘背景類CClockBackground時鐘背景類

48、CClockBackground操作辦法:在ClassView工程名上面點右鍵,選擇New Class,在ClassType里面選擇Genenric Class,選擇類Base ClassCClockElement類因CClockBackground需從類CClockElement派生效果如圖所表示。60第60頁第60頁環節5續:創建時鐘背景類CClockBackgroundCClockBackground只需實現基類虛函數Draw即可,因此這里重載基類虛函數Draw,其頭文獻實當代碼下列(不用編寫,由系統生成):#include ClockElement.hclass CClockBackg

49、round : public CClockElement public:CClockBackground();virtual CClockBackground();61第61頁第61頁CClockBackground源文獻代碼下列:/ ClockBackground.cpp:/時鐘背景函數CClockBackground:CClockBackground()/為時鐘背景定義默認顏色設置m_crMain = RGB(0, 255, 0); /主顏色為綠色m_crOther = RGB(0, 128, 0); /其它顏色為深綠色CClockBackground:CClockBackground()

50、 62第62頁第62頁CClockBackground源文獻代碼下列(續1):/Draw 繪圖函數void CClockBackground:Draw(CDC *pDC)/準備設備環境(也稱設備上下文,簡稱DC),是圖形設備主要接口CPen penMain(PS_SOLID, 1, m_crMain), /創建一支主顏色為綠色能畫實線(SOLID)1號粗細畫筆penOther(PS_SOLID, 1, m_crOther); /創建一支其它顏色為深綠色能畫實線1號粗細畫筆CBrush brMain(m_crMain), brOther(m_crOther); /創建主畫刷和其它畫刷/將其它畫筆

51、選入內存DC,同時暫時擠出并保留原畫筆 CPen *pOldPen = pDC-SelectObject(&penOther); /將主畫刷選入內存DC,同時暫時擠出并保留原畫刷CBrush *pOldBrush = pDC-SelectObject(&brMain);/繪制60個小圓點,表示分針和秒針刻度CPoint ptCenter = m_rcRegion.CenterPoint(); /創建畫點對象并初始化int nRadius = m_nRadius - 8; /定義半徑初值for(int i=0; iEllipse(rcDot); 63第63頁第63頁CClockBackgroun

52、d源文獻代碼下列(續2):/繪制12個小方框,表示12個正點pDC-SelectObject(&penMain); /恢復內存DC中原有主畫筆pOldBrush = pDC-SelectObject(&brOther);for(i=0; iRectangle(rcDot);/還原設備環境pDC-SelectObject(pOldPen); /恢復內存DC中原有畫筆pDC-SelectObject(pOldBrush); /恢復內存DC中原有畫刷64第64頁第64頁環節6:創建時針類CClockHourHand實現實現時針類CClockHourHand該類新建過程與CClockBackgroun

53、d同樣。選擇類Base ClassCClockElement類因CClockHourHand需從類CClockElement派生CClockHourHand同樣只需實現基類虛函數Draw即可其頭文獻實當代碼下列:#include ClockElement.hclass CClockHourHand : public CClockElement public:CClockHourHand();virtual CClockHourHand();virtual void Draw(CDC *pDC);65第65頁第65頁CClockHourHand源文獻代碼下列:CClockHourHand:CCl

54、ockHourHand()/定義默認顏色m_crMain = RGB(0, 255, 100);m_crOther = RGB(128, 128, 0);CClockHourHand:CClockHourHand() void CClockHourHand:Draw(CDC *pDC)/初始化設備環境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);CBrush brMain(m_crMain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&p

55、enOther);CBrush *pOldBrush = pDC-SelectObject(&brMain);/擬定當前指針弧度int nTime = (m_tmCur.GetHour() % 12) * 3600;nTime += m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTime / 3600 / 12; 66第66頁第66頁CClockHourHand源文獻代碼下列(續):/擬定繪制菱形指針所需四個角坐標CPoint ptDiamond4;for(int i=0; iP

56、olygon(ptDiamond, 4);/恢復設備環境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);67第67頁第67頁環節7:創建分針類CClockMinHand實現實現分針類CClockMinHand該類新建過程與CClockHourHand同樣,類實現也基本相同,其頭文獻實當代碼下列:CClockMinHand類因CClockMinHand需從類CClockElement派生CClockMinHand同樣只需實現基類虛函數Draw即可#include ClockElement.hclass CClockMinHand : p

57、ublic CClockElement public:CClockMinHand();virtual CClockMinHand();virtual void Draw(CDC *pDC);68第68頁第68頁CClockMinHand源文獻代碼下列:CClockMinHand:CClockMinHand()/定義默認顏色m_crMain = RGB(0, 255, 100);m_crOther = RGB(128, 128, 0);CClockMinHand:CClockMinHand() void CClockMinHand:Draw(CDC *pDC)/初始化設備環境CPen penMa

58、in(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 = pDC-SelectObject(&brMain);/擬定分針所在位置弧度int nTime = m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTi

59、me / 3600;69第69頁第69頁CClockMinHand源文獻代碼下列(續):/擬定繪制菱形指針所需四個角坐標CPoint ptDiamond4;for(int i=0; iPolygon(ptDiamond, 4);/恢復設備環境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);70第70頁第70頁環節8:創建秒針類CClockSecHand實現實現秒針類CClockSecHand這類與CClockHourHand同樣建立,類實現也基本相同其頭文獻實當代碼下列:#include ClockElement.hclass CCl

60、ockSecHand : public CClockElement public:CClockSecHand();virtual CClockSecHand();virtual void Draw(CDC *pDC);71第71頁第71頁CClockSecHand源文獻代碼下列:CClockSecHand:CClockSecHand()/設定秒針默認顏色m_crMain = RGB(0, 200, 200);m_crOther = RGB(0, 200, 200);CClockSecHand:CClockSecHand() void CClockSecHand:Draw(CDC *pDC)in

溫馨提示

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

評論

0/150

提交評論