第04章 MFC基本應用程序的建立.ppt_第1頁
第04章 MFC基本應用程序的建立.ppt_第2頁
第04章 MFC基本應用程序的建立.ppt_第3頁
第04章 MFC基本應用程序的建立.ppt_第4頁
第04章 MFC基本應用程序的建立.ppt_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章MFC基本應用程序的建立,4.1 Windows編程基礎(chǔ) 4.2 編制一個MFC應用程序 4.3 使用MFC AppWizard 4.4 使用ClassWizard 作業(yè),4.1Windows編程基礎(chǔ),4.1.1簡單的Windows應用程序 例Ex_HelloMsg 一個簡單的Windows應用程序。 #include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) MessageBox (NULL, 你好,我的Visual C+世界!, 問候

2、, 0) ; return 0 ; 運行上述程序需要進行以下步驟: 選擇“File”“New”。單擊Projects,選中Win32 Application項。 在Project Name框中鍵入項目名稱Ex_HelloMsg。在Location下的編輯框中直接鍵入文件夾名稱,或單擊Browse按鈕(.)選擇一個已有的文件夾。 單擊OK。選中An empty project項。單擊Finish,單擊OK系統(tǒng)將自動創(chuàng)建此應用程序。 選擇“File”“New”。單擊File標簽,在左邊的列表框中選擇C+ Source File項,在右邊的File框中鍵入Ex_HelloMsg.cpp,單擊OK。,

3、4.1Windows編程基礎(chǔ),輸入上面的代碼,運行程序,如圖。 從程序可以看出 : 傳統(tǒng)的DOS程序以main函數(shù)作為進入程序的初始入口點,但在Windows應用程序中,main函數(shù)被WinMain函數(shù)取而代之,WinMain函數(shù)的原型如下: int WINAPI WinMain ( HINSTANCE hInstance, / 當前實例句柄 HINSTANCE hPrevInstance, / 前一實例句柄 LPSTR lpCmdLine, / 指向命令行參數(shù)的指針 int nCmdShow) / 窗口的顯示狀態(tài) 句柄是一個標識Windows資源(如菜單、圖標、窗口等)和設(shè)備等對象的變量,或

4、者是一個對操作系統(tǒng)資源的間接引用。 每一個Windows應用程序都需要Windows.h頭文件,它還包含了其他的一些Windows頭文件。這些頭文件定義了Windows的所有數(shù)據(jù)類型、函數(shù)調(diào)用、數(shù)據(jù)結(jié)構(gòu)和符號常量。 MessageBox是一個Win32 API(Application Programming Interface, 應用程序接口)函數(shù),用來彈出一個對話框窗口,顯示短信息。該函數(shù)第一個參數(shù)用來指定父窗口句柄,即對話框所在的窗口句柄。第二、三個參數(shù)分別用來指定顯示的消息內(nèi)容和對話框窗口的標題,最后一個參數(shù)用來指定在對話框中顯示的按鈕。,圖4.1 Ex_HelloMsg運行結(jié)果,4.1

5、Windows編程基礎(chǔ),例Ex_HelloWin 一個完整的Windows應用程序。 #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);/ 窗口過程 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) HWND hwnd ;/ 窗口句柄 MSG msg ;/ 消息 WNDCLASSwndclass ;/ 窗口類 wndclass.style = CS_HREDRAW | CS_V

6、REDRAW ; wndclass.lpfnWndProc= WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra= 0 ; wndclass.hInstance= hInstance ; wndclass.hIcon= LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lps

7、zMenuName= NULL ; wndclass.lpszClassName= “HelloWin”;/ 窗口類名 if (!RegisterClass ( ,4.1Windows編程基礎(chǔ),hwnd = CreateWindow (HelloWin, / 窗口類名 我的窗口,/ 窗口標題 WS_OVERLAPPEDWINDOW, / 窗口樣式 CW_USEDEFAULT, / 窗口最初的 x 位置 CW_USEDEFAULT, / 窗口最初的 y 位置 CW_USEDEFAULT, / 窗口最初的 x 大小 CW_USEDEFAULT, / 窗口最初的 y 大小 NULL, / 父窗口句柄

8、 NULL, / 窗口菜單句柄 hInstance, / 應用程序?qū)嵗浔?NULL) ; / 創(chuàng)建窗口的參數(shù) ShowWindow (hwnd, nCmdShow) ;/ 顯示窗口 UpdateWindow (hwnd) ;/ 更新窗口,包括窗口的客戶區(qū) / 進入消息循環(huán):當從應用程序消息隊列中檢取的消息是WM_QUIT時,則退出循環(huán)。 while (GetMessage ( ,4.1Windows編程基礎(chǔ),LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch (mess

9、age) case WM_CREATE:/ 窗口創(chuàng)建產(chǎn)生的消息 return 0 ; case WM_LBUTTONDOWN: MessageBox (NULL, 你好,我的Visual C+世界!, 問候, 0) ;return 0 ; case WM_DESTROY:/ 當窗口關(guān)閉時產(chǎn)生的消息 PostQuitMessage (0) ; return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ; / 執(zhí)行默認的消息處理 ,4.1Windows編程基礎(chǔ),程序運行,單擊鼠標左鍵,如圖。 窗口過程函數(shù)WndProc用來接收和

10、處理各種不同的消息,WinMain函數(shù)通常要完成: 調(diào)用API函數(shù)RegisterClass注冊應用程序的窗口類。 調(diào)用相關(guān)API函數(shù)創(chuàng)建和顯示窗口,并進行必要的初始化。CreateWindow創(chuàng)建已注冊窗口類的窗口。Windows每一個窗口都有一些基本屬性。窗口類就是充當這些屬性的模板。 創(chuàng)建和啟動應用程序的消息循環(huán)。Windows應用程序接受各種不同的消息。Windows系統(tǒng)首先將消息放入消息隊列中,應用程序的消息循環(huán)就是從應用程序的消息隊列中檢取消息,并將消息發(fā)送相應的窗口過程函數(shù)中作進一步處理。 如果接收到WM_QUIT消息,則退出應用程序,圖4.2 Ex_HelloWin運行結(jié)果,4

11、.1Windows編程基礎(chǔ),應用程序的基本流程,如圖。,圖4.3 Windows應用程序的基本流程,4.1Windows編程基礎(chǔ),4.1.2Windows編程特點 消息驅(qū)動機制 DOS程序是通過調(diào)用系統(tǒng)的函數(shù)來獲得用戶輸入的,Windows程序則是通過操作系統(tǒng)發(fā)送的消息來處理用戶輸入的。 無論是系統(tǒng)產(chǎn)生的動作或是運行應用程序產(chǎn)生的動作,都稱為事件(Events)產(chǎn)生的消息(Message)。在應用程序中,通過接收消息、分發(fā)消息、處理消息來和用戶進行交互。許多消息都經(jīng)過了嚴格的定義,并且適用于所有的應用程序。 圖形設(shè)備接口(GDI ) DOS環(huán)境中,要在打印機上打印一幅圖形是非常復雜的事件。Wi

12、ndows則提供了一個抽象的接口,稱為圖形設(shè)備接口(Graphical Device Interface,簡稱GDI),使得用戶直接利用系統(tǒng)的GDI函數(shù)就能方便實現(xiàn)輸入或輸出,而不必關(guān)心與系統(tǒng)相連的外部設(shè)備的類型。 基于資源的程序設(shè)計 Windows應用程序常常包含眾多圖形元素,每一個這樣的元素都作為一種可以裝入應用程序的資源來存放。這些資源可以被編輯、修改,也可以被其他應用程序所共享。VC中提供的許多編輯器能“所見即所得”地進行不同類型資源的設(shè)計、編輯等。,4.1Windows編程基礎(chǔ),動態(tài)鏈接庫 提供一些特定結(jié)構(gòu)的函數(shù),能被應用程序在運行過程中裝入和連接,多個程序可以共享同一個動態(tài)鏈接庫。

13、從編程角度,動態(tài)鏈接庫可以提高程序模塊的靈活性,它本身是可以單獨設(shè)計、編譯和調(diào)試的。 Windows提供了應用程序可利用的豐富的函數(shù)調(diào)用,大多數(shù)用于實現(xiàn)其用戶界面和在顯示器上顯示的文本和圖形,都是通過動態(tài)鏈接庫來實現(xiàn)的。 Windows中,KERNEL32用來處理存儲器低層功能、任務(wù)和資源管理等核心服務(wù); GDI32用來提供圖形設(shè)備接口,管理用戶界面和圖形繪制;USER32負責窗口的管理。 進程和線程 Windows是一個32位多任務(wù)操作系統(tǒng),采用進程和線程的管理模式。 進程是裝入內(nèi)存中正在執(zhí)行的應用程序。進程包括私有的虛擬地址空間、代碼、數(shù)據(jù)及其它操作系統(tǒng)資源。進程包括了一個或多個在進程上下

14、文內(nèi)運行的線程。 線程是操作系統(tǒng)分配CPU時間的基本實體。線程可以執(zhí)行應用程序代碼的任何部分,包括當前正在被其它線程執(zhí)行的那些部分。同一進程的所有線程共享同樣的虛擬地址空間、全局變量和操作系統(tǒng)資源。 一個應用程序,包括一個或多個進程,每個進程由一個或多個線程構(gòu)成。,4.1Windows編程基礎(chǔ),4.1.3Windows基本數(shù)據(jù)類型,4.1Windows編程基礎(chǔ),需要說明的是: 這些基本數(shù)據(jù)類型都是以大寫字符出現(xiàn)。 凡是數(shù)據(jù)類型的前綴是P或LP,表示該類型是一個指針或長指針數(shù)據(jù)類型。前綴是H,表示是句柄類型。前綴是U,表示是無符號數(shù)據(jù)類型。 還提供一些宏來處理上述基本數(shù)據(jù)類型。LOBYTE和HI

15、BYTE分別用來獲取16位數(shù)值中的低位和高位字節(jié);LOWORD和HIWORD分別用來獲取32位數(shù)值中的低位和高位字;MAKEWORD是將兩個16位無符號值結(jié)合成一個32位無符號值。,4.2編制一個MFC應用程序,4.2.1MFC概述 1987年微軟公司推出了第一代Windows產(chǎn)品,并為應用程序設(shè)計者提供了Win16 API,在此基礎(chǔ)上推出了Windows GUI(圖形用戶界面),然后采用面向?qū)ο蠹夹g(shù)對API進行封裝。1992年推出應用程序框架產(chǎn)品AFX(Application Frameworks),并在AFX的基礎(chǔ)上進一步發(fā)展為MFC產(chǎn)品。MFC類的基本層次結(jié)構(gòu)如圖。,4.2編制一個MFC

16、應用程序,4.2.2設(shè)計一個MFC程序 例Ex_HelloMFC 一個MFC應用程序。 #include / MFC頭文件 class CHelloApp : public CWinApp/ 聲明應用程序類 public: virtual BOOL InitInstance(); CHelloApp theApp; / 建立應用程序類的實例 class CMainFrame: public CFrameWnd/ 聲明主窗口類 public: CMainFrame() / 創(chuàng)建主窗口 Create(NULL, 我的窗口, WS_OVERLAPPEDWINDOW, CRect(0,0,400,30

17、0); protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() ; / 消息映射入口 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_LBUTTONDOWN()/ 單擊鼠標左鍵消息的映射宏 END_MESSAGE_MAP(),4.2編制一個MFC應用程序,void CMainFrame:OnLButtonDown(UINT nFlags, CPoint point) MessageBox (你好,我的Visual C+世界!, 問

18、候, 0) ; CFrameWnd:OnLButtonDown(nFlags, point); / 每當應用程序首次執(zhí)行時都要調(diào)用的初始化函數(shù) BOOL CHelloApp:InitInstance() m_pMainWnd = new CMainFrame(); m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); return TRUE; 運行上述MFC程序需要進行以下步驟: 選擇“File”“New”。單擊Projects,選中Win32 Application項,創(chuàng)建一個Ex_HelloMFC空應用程序項目。 選擇“

19、File”“New”。單擊File標簽,在左邊的列表框中選擇C+ Source File項,在右邊的File框中鍵入Ex_HelloMsg.cpp,單擊OK。 輸入上面的代碼。選擇“Project”“Settings”,選擇“General”標簽。在“Microsoft Foundation Classes”組合框中,選擇“Use MFC in a Shared DLL”。單擊OK。 程序運行后,單擊鼠標左鍵,就會彈出一個對話框,結(jié)果同Ex_HelloWin。,4.2編制一個MFC應用程序,4.2.3理解程序代碼 MFC是使用afxwin.h來代替頭文件windows.h。 運行應用程序時,自

20、動調(diào)用應用程序框架內(nèi)部的WinMain函數(shù),并自動查找該應用程序類CHelloApp(從CWinApp派生)的全局變量theApp,然后自動調(diào)用CHelloApp的虛函數(shù)InitInstance,該函數(shù)會進一步調(diào)用相應的函數(shù)來完成主窗口的構(gòu)造和顯示工作。上述程序中InitInstance的執(zhí)行過程。 首先執(zhí)行的是: m_pMainWnd = new CMainFrame(); 創(chuàng)建從CFrameWnd類派生而來的用戶框架窗口CMainFrame類對象,繼而調(diào)用該類的構(gòu)造函數(shù),使得Create函數(shù)被調(diào)用,完成了窗口創(chuàng)建工作。 然后執(zhí)行后面兩句: m_pMainWnd-ShowWindow(m_n

21、CmdShow); m_pMainWnd-UpdateWindow(); 用作窗口的顯示和更新。 最后返回TRUE,表示窗口創(chuàng)建成功。 由于應用程序類CWinApp是用來調(diào)用WinMain以及實例的初始化,因此每一個MFC應用程序有且只能一個這樣的應用程序類,且需要一個全局的對象實例,如上述程序中的theApp。,4.2編制一個MFC應用程序,InitInstance完成初始化后,調(diào)用基類CWinApp的成員函數(shù)Run,執(zhí)行應用程序的消息循環(huán)。Run檢查到消息隊列為空時,調(diào)用基類CWinApp的成員函數(shù)OnIdle進行空閑時的后臺處理工作。若消息隊列為空且又沒有后臺工作要處理時,則應用程序一直

22、處于等待狀態(tài),一直等到有消息為止。當程序結(jié)束后,調(diào)用基類CWinApp的成員函數(shù)ExitInstance,完成終止應用程序的收尾工作。 在MFC中,一個消息的處理往往是通過獨特的MFC消息映射機制來進行的。 消息映射(Message Map)機制,指MFC類中將消息與消息處理函數(shù)聯(lián)系起來,一一對應的機制。任何一個從類CCmdTarget派生的類理論上均可處理消息,且都有相應的消息映射函數(shù)。 按照MFC的消息映射機制,映射一個消息的過程由三個部分組成: 在處理消息的類中,使用消息宏DECLARE_MESSAGE_MAP()聲明對消息映射的支持,并在該宏之前聲明消息處理函數(shù)。 使用BEGIN_ME

23、SSAGE_MAP和END_MESSAGE_MAP宏在類聲明之后的地方定義該類支持的消息映射入口點,所有消息映射宏都添加在這里,當然不同的消息MFC都會有不同的消息映射宏。 定義消息處理函數(shù)。 為了使該消息能被其他對象接收并處理,在函數(shù)中常常需要調(diào)用基類中的相關(guān)消息處理函數(shù)。MFC的ClassWizard(類向?qū)?能自動完成消息的上述映射過程。,4.3使用MFC AppWizard,4.3.1應用程序框架類型,4.3使用MFC AppWizard,4.3.2創(chuàng)建一個單文檔應用程序 開始 選擇“File”“New”,選擇Projects標簽;選擇MFC AppWizard(exe)的項目類型(該

24、類型用于創(chuàng)建可執(zhí)行的Windows應用程序),將項目工作文件夾定位在“D:Visual C+ 6.0程序”,并在“Project Name”框中輸入項目名Ex_SDIHello,如圖,單擊OK。,圖4.5 MFC AppWizard的“New”對話框,4.3使用MFC AppWizard,第一步 從應用程序類型Single Document、Multiple Document和Dialog Based中選擇SDI。 決定應用程序中是否需要MFC的“文檔/視圖”結(jié)構(gòu)的支持。若不選定此項,則程序中的磁盤文件的打開、保存以及文檔和視圖的相互作用等功能需要用戶來實現(xiàn),且將跳過Step 2Step 5,

25、直接彈出“Step 6”對話框。 選擇資源所使用的語言,這里是“中文中國”,單擊Next按鈕。,圖4.6 SDI的“Step 1”對話框,4.3使用MFC AppWizard,第二步 單擊Next按鈕進入下一步。 第三步 單擊Next按鈕進入下一步。,圖4.7 SDI的“Step 2”對話框,圖4.8 SDI的“Step 3”對話框,4.3使用MFC AppWizard,第四步 單擊Next按鈕進入下一步。,圖4.9 SDI的“Step 4”對話框,4.3使用MFC AppWizard,第五步 在彈出的對話框(如圖)中出現(xiàn)三個方面的選項,供用戶來選擇: 應用程序的主窗口是MFC標準風格還是窗口

26、左邊有切分窗口的瀏覽器風格; 在源文件中是否加入注釋用來引導用戶編寫程序代碼; 使用動態(tài)鏈接庫還是靜態(tài)鏈接庫。 保留缺省狀態(tài),單擊Next按鈕進行下一步。,圖4.10 SDI的“Step 5”對話框,4.3使用MFC AppWizard,第六步 單擊Finish按鈕出現(xiàn)如圖4.12所示的對話框,圖4.11 SDI的“Step 6”對話框,圖4.12 項目信息對話框,4.3使用MFC AppWizard,編譯并運行,4.3使用MFC AppWizard,4.3.3理解程序框架 應用類CEx_SDIHelloApp 下面首先來看看Ex_SDIHello應用程序的Ex_SDIHello.h文件: .

27、 class CEx_SDIHelloApp : public CWinApp public: CEx_SDIHelloApp(); /AFX_VIRTUAL(CEx_SDIHelloApp) public: virtual BOOL InitInstance(); /AFX_VIRTUAL / Implementation(實現(xiàn)) /AFX_MSG(CEx_SDIHelloApp) afx_msg void OnAppAbout(); / NOTE - the ClassWizard will add and remove member functions here. / DO NOT ED

28、IT what you see in these blocks of generated code ! /AFX_MSG DECLARE_MESSAGE_MAP()/ 聲明消息映射 ; .,4.3使用MFC AppWizard,代碼中, /AFX_VIRTUAL(類名) . /AFX_VIRTUAL 是ClassWizard定義的專門用作虛函數(shù)重載的標記,表示該程序塊中的虛函數(shù)的重載是由ClassWizard來自動管理的,一般不需要去更改。同樣, /AFX_MSG(類名) . /AFX_MSG 是ClassWizard定義的專門用作消息映射聲明的標記。 代碼中的“/TODO:”以及英文等注釋是

29、由MFC AppWizard為用戶自動生成的。若不需要這些注釋,可在應用程序向?qū)У牡谖宀綄υ捒蛑校瑢ⅰ癢ould you like to generate source file comments?”項選為“No,thank you”。 下面再來看看該Ex_SDIHello應用程序的Ex_SDIHello.cpp源文件: #include stdafx.h/ 預編譯處理的頭文件 #include Ex_SDIHello.h/ 應用類的頭文件 #include MainFrm.h/ 主框架類的頭文件 #include Ex_SDIHelloDoc.h/ 文檔類的頭文件 #include Ex_S

30、DIHelloView.h/ 視圖類的頭文件,4.3使用MFC AppWizard,/消息映射開始 BEGIN_MESSAGE_MAP(CEx_SDIHelloApp, CWinApp)/ 消息映射宏 /AFX_MSG_MAP(CEx_SDIHelloApp) / 映射“幫助”菜單項中的“關(guān)于Ex_SDIHello”命令消息,當用戶選擇了 / 該命令時,將執(zhí)行函數(shù)OnAppAbout ON_COMMAND(ID_APP_ABOUT, OnAppAbout) / NOTE - the ClassWizard will add and remove mapping macros here. / D

31、O NOT EDIT what you see in these blocks of generated code! /AFX_MSG_MAP / 映射“文件”菜單項中的“新建”和“打開”命令消息,當用戶選擇了“新建” / 或“打開”命令時,將相應執(zhí)行CWinApp:OnFileNew或CWinApp:OnFileOpen ON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen) / 映射“文件”菜單項中的“打印設(shè)置”命令消息,當用戶選擇了 / 該命令時,將執(zhí)行函數(shù)CWinAp

32、p:OnFilePrintSetup ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup) END_MESSAGE_MAP()/ 消息映射宏,4.3使用MFC AppWizard,/ 消息映射開始結(jié)束 CEx_SDIHelloApp:CEx_SDIHelloApp()/ 構(gòu)造函數(shù) CEx_SDIHelloApp theApp;/ 定義的一個應用類對象,表示一個實例 BOOL CEx_SDIHelloApp:InitInstance() . . void CEx_SDIHelloApp:OnAppAbout() CAboutDlg a

33、boutDlg;/ 定義的CAboutDlg對象 aboutDlg.DoModal();/ 調(diào)用相應的庫函數(shù),顯示CAboutDlg對話框 代碼中, /AFX_MSG_MAP(類名) . /AFX_MSG_MAP 是ClassWizard定義的專門用作消息映射的標記,表示該程序塊中的消息映射函數(shù)是由ClassWizard來自動管理的,用戶一般不需要去更改。,4.3使用MFC AppWizard,最主要的InitInstance函數(shù)體代碼: BOOL CEx_SDIHelloApp:InitInstance() / 若用戶在MFC AppWizard的第三步中,選中了“ActiveX Contr

34、ols”, / 則表示所創(chuàng)建的應用程序支持ActiveX控件 AfxEnableControlContainer(); / 若用戶在MFC AppWizard的第四步中,選中了“3D controls” / 則表示所創(chuàng)建的應用程序支持Windows 95版本前的3D控件風格 #ifdef _AFXDLL Enable3dControls();/ 使用動態(tài)的3D控件 #else Enable3dControlsStatic();/ 使用靜態(tài)的3D控件 #endif / 在系統(tǒng)注冊表中登記應用程序的主鍵值,以便將一些與應用程序 / 相關(guān)的參數(shù)存放在該主鍵值下 SetRegistryKey(_T(L

35、ocal MFC AppWizard-Generated Applications); / 從注冊表中調(diào)入應用程序的一些標準參數(shù)值. LoadStdProfileSettings();,4.3使用MFC AppWizard,/ 若用戶在MFC AppWizard的第一步中,選擇了“Single document”類型, / 則進行下列的單文檔模板的創(chuàng)建及其初始化操作。 CSingleDocTemplate* pDocTemplate;/ 定義一個單文檔模板指針變量 pDocTemplate = new CSingleDocTemplate(/ 登記并創(chuàng)建單文檔應用程序模板 IDR_MAINFR

36、AME,/ 菜單、快捷鍵等的資源標識號 RUNTIME_CLASS(CEx_SDIHelloDoc),/ 文檔類 RUNTIME_CLASS(CMainFrame), / 主框架窗口類 RUNTIME_CLASS(CEx_SDIHelloView);/ 視圖類 AddDocTemplate(pDocTemplate);/ 向應用程序添加文檔模板 / 分列命令行標準命令如DDE、文件打開等 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); / 傳送命令行指定的命令,并執(zhí)行相應的操作 if (!ProcessShellCommand(cmdI

37、nfo) return FALSE; / 對主框架窗口進行初始化以便顯示和更新 m_pMainWnd-ShowWindow(SW_SHOW); m_pMainWnd-UpdateWindow(); return TRUE; ,4.3使用MFC AppWizard,RUNTIME_CLASS是一個運行類的宏定義,返回CRuntimeClass類指針。借助CRuntimeClass類結(jié)構(gòu)能在應用程序運行過程中獲得該類對象及其基類的相關(guān)信息,從而可以實現(xiàn)運行時類型檢查。 CSingleDocTemplate是一個單文檔模板類,將用戶應用程序項目中的資源、主框架窗口類、文檔類以及視圖類建立了聯(lián)系。Ad

38、dDocTemplate負責將這些聯(lián)系嵌入應用程序中。類似的,還有用于多文檔應用程序的多文檔模板類CMultiDocTemplate,但與單文檔不同的是,多文檔模板可以創(chuàng)建多個視、多個文檔, 很多程序都需要從命令行輸入?yún)?shù),它是通過ParseCommandLine函數(shù)保存在由CCommandLineInfo類定義的對象中,命令行最終的命令和參數(shù)是通過ProcessShellCommand執(zhí)行的。與DOS命令行操作不同的是,Windows應用程序命令行參數(shù)是通過選擇“開始”“運行”菜單命令,在彈出的運行對話框中指定的。,4.3使用MFC AppWizard,文檔類CEx_SDIHelloDoc

39、CEx_SDIHelloDoc類的Ex_SDIHelloDoc.h文件: . class CEx_SDIHelloDoc : public CDocument protected: CEx_SDIHelloDoc();/ 構(gòu)造函數(shù) DECLARE_DYNCREATE(CEx_SDIHelloDoc) . public: /AFX_VIRTUAL(CEx_SDIHelloDoc) public: virtual BOOL OnNewDocument();/ 當新建一個文檔時,自動調(diào)用該函數(shù) virtual void Serialize(CArchive #endif .,4.3使用MFC App

40、Wizard,/ 產(chǎn)生消息映射函數(shù) protected: /AFX_MSG(CEx_SDIHelloDoc) / NOTE - the ClassWizard will add and remove member functions here. / DO NOT EDIT what you see in these blocks of generated code ! /AFX_MSG DECLARE_MESSAGE_MAP() ; . 用戶的文檔類CEx_SDIHelloDoc是從基類CDocument派生而來。 AssertValid和Dump是用于調(diào)試版本的兩個虛函數(shù)。AssertVal

41、id的目的是啟用“斷言”機制來檢驗對象的正確性、合法性,而Dump的目的是為他人分析用戶自己定義的類提供一種機制,用來輸出類的名稱或其他數(shù)據(jù)內(nèi)容。,4.3使用MFC AppWizard,視圖類CEx_SDIHelloView CEx_SDIHelloView類的Ex_SDIHelloView.h文件: class CEx_SDIHelloView : public CView protected: CEx_SDIHelloView(); DECLARE_DYNCREATE(CEx_SDIHelloView) public: CEx_SDIHelloDoc* GetDocument();/ 用于

42、返回文檔類指針 public: /AFX_VIRTUAL(CEx_SDIHelloView) public: virtual void OnDraw(CDC* pDC); / 用于繪制的虛函數(shù) virtual BOOL PreCreateWindow(CREATESTRUCT /AFX_VIRTUAL,4.3使用MFC AppWizard,/ Implementation public: virtual CEx_SDIHelloView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpConte

43、xt #endif CEx_SDIHelloView的成員函數(shù)GetDocument是用inline聲明成一個內(nèi)聯(lián)函數(shù)。,4.3使用MFC AppWizard,CEx_SDIHelloView類的Ex_SDIHelloView.cpp文件: #include stdafx.h #include Ex_SDIHello.h #include Ex_SDIHelloDoc.h #include Ex_SDIHelloView.h . IMPLEMENT_DYNCREATE(CEx_SDIHelloView, CView) BEGIN_MESSAGE_MAP(CEx_SDIHelloView, CV

44、iew) /AFX_MSG_MAP(CEx_SDIHelloView) /AFX_MSG_MAP / 為“文件”菜單下的“打印.”和“打印預覽”映射標準打印命令 ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview) END_MESSAGE_MAP() CEx_SDIHelloView:CEx_SDIHelloView() CEx_SDIH

45、elloView:CEx_SDIHelloView() BOOL CEx_SDIHelloView:PreCreateWindow(CREATESTRUCT,4.3使用MFC AppWizard,void CEx_SDIHelloView:OnDraw(CDC* pDC) CEx_SDIHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BOOL CEx_SDIHelloView:OnPreparePrinting(CPrintInfo* pInfo) / default preparation return DoPreparePrintin

46、g(pInfo); void CEx_SDIHelloView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: add extra initialization before printing void CEx_SDIHelloView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: add cleanup after printing,4.3使用MFC AppWizard,/ 以下是用于調(diào)試的函數(shù) #ifdef _DEBUG void CEx_SDI

47、HelloView:AssertValid() const CView:AssertValid(); void CEx_SDIHelloView:Dump(CDumpContext #endif /_DEBUG,4.3使用MFC AppWizard,視圖類CEx_SDIHelloView是從基類CView派生而來的。說明: 各種類型的輸入都可以由視圖來響應、處理,并且打印和打印預覽也是在視圖類中完成的。這種文檔和視圖的結(jié)合,稱為“文檔/視圖結(jié)構(gòu)”機制,是MFC應用程序框架的核心,可以進行消息的處理、文檔的格式化及文檔數(shù)據(jù)的可視化處理等;它不但使文檔數(shù)據(jù)和視圖分離,而且能簡化應用程序并減少代碼冗

48、余。 PreCreateWindow虛函數(shù)是在相應窗口創(chuàng)建前被系統(tǒng)自動調(diào)用的。在此函數(shù)中,可以更改其CREATESTRUCT結(jié)構(gòu)內(nèi)容,將改變相應窗口的風格. OnDraw是個非常有用的虛函數(shù),當應用程序中的窗口狀態(tài)或大小發(fā)生改變時,系統(tǒng)均會調(diào)用此函數(shù)重新繪制文檔窗口的客戶區(qū)。用戶可以將一些繪圖有關(guān)的代碼添加此函數(shù)中,能在視圖中進行圖形的繪制。 例如,下面的代碼: void CEx_SDIHelloView:OnDraw(CDC* pDC) CEx_SDIHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC-TextOut(100,100

49、,Hello,World!); ,4.3使用MFC AppWizard,主框架窗口類CMainFrame “關(guān)于”對話框類CAboutDlg MFC涉及到的機制有: 文檔/視圖機制:它使用戶應用程序類、文檔類、視圖類以及框架類之間有機地結(jié)合在一起,是MFC最引人注目的機制。 消息映射機制:它是實現(xiàn)對各種不同消息的處理。 數(shù)據(jù)映射機制:是實現(xiàn)對話框中變量與控件之間的數(shù)據(jù)交換和數(shù)據(jù)校驗。 運行時類型檢查機制:它通過GetRuntimeClass、IsKindOf、宏DECLARE_DYNAMIC和宏IMPLEMENT_DYNAMIC來實現(xiàn)的。 診斷信息轉(zhuǎn)儲機制:它是通過AssertValid、Du

50、mp和宏TRACE來實現(xiàn)的。 實現(xiàn)文檔/視圖機制是通過MFC應用程序向?qū)ё詣油瓿傻模⒑蛿?shù)據(jù)映射則是通過MFC的ClassWizard來自動進行的。,4.4使用ClassWizard,4.4.1ClassWizard概述 打開MFC的ClassWizard的方法: 選擇“View”“ClassWizard”菜單或直接使用Ctrl+W快捷鍵。 在源代碼文件的文檔編輯窗口中,右擊鼠標,選擇ClassWizard命令。 當ClassWizard打開后,就會彈出如圖的MFC ClassWizard對話框。,圖4.15 MFC ClassWiard對話框,4.4使用ClassWizard,4.4.2

51、消息和消息映射 消息分類 Windows應用程序中的消息主要有三種類型。 窗口消息(Windows message) 主要指由WM_開頭的消息,一般由窗口類和視圖類對象來處理。窗口消息往往帶有參數(shù),以標志處理消息的方法。 控件的通知消息(Control notifications) 當控件的狀態(tài)發(fā)生改變時,控件就會向其父窗口發(fā)送WM_COMMAND通知消息。應用程序框架處理控件消息的方法和窗口消息相同,但按鈕的BN_CLICKED通知消息除外,它的處理方法與命令消息相同。 命令消息(Command message) 主要包括由用戶交互對象(菜單、工具條的按鈕、快捷鍵等)發(fā)送的WM_COMMAN

52、D通知消息。命令消息的處理方式與其他兩種消息不同,它能夠被多種對象接收、處理,這些對象包括文檔類、文檔模板類、應用程序本身以及窗口和視類等;而窗口消息和控件的通知消息是由窗口對象接收并處理的,這里的窗口對象是指從CWnd中派生的類的對象,它包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及從這些類派生的對象等。,4.4使用ClassWizard,ClassWizard映射消息的一般方法,4.4使用ClassWizard,例如,向CEx_SDIHelloView中添加WM_LBUTTOMDOWN的消息映射,則可按下列步驟進行: (1)按Ct

53、rl+W快捷鍵打開MFC ClassWizard對話框。 (2)在Class name組合框中,將類名選定為CEx_SDIHelloView。 (3)在Object IDs列表框中選定CEx_SDIHelloView,而在Messages列表中選定WM_LBUTTOMDOWN消息。 (4)雙擊Messages列表中的WM_LBUTTOMDOWN消息或單擊Add Function按鈕,都會在CEx_SDIHelloView類中添加該消息的映射函數(shù)OnLButtonDown,同時在Member funcions列表中顯示這一消息映射函數(shù)和被映射的消息,如圖。,圖4.16 映射WM_LBUTTOND

54、OWN消息,4.4使用ClassWizard,(5)單擊Edit Code,轉(zhuǎn)向文檔窗口,定位到OnLButtonDown源代碼處。 (6)添加下列代碼: void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default MessageBox (你好,我的Visual C+世界!, 問候, 0) ; CView:OnLButtonDown(nFlags, point); (7)程序運行后,在窗口客戶區(qū)左擊,彈出

55、一個消息對話框。 查看CEx_SDIHelloView程序代碼,可以發(fā)現(xiàn):ClassWizard為WM_LBUTTOMDOWN的消息映射作了以下三個方面內(nèi)容的安排: 在頭文件Ex_SDIHelloView.h中聲明消息處理函數(shù)OnLButtonDown: protected: /AFX_MSG(CEx_SDIHelloView) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); /AFX_MSG DECLARE_MESSAGE_MAP(),4.4使用ClassWizard,在Ex_SDIHelloView.cpp源文件前面的消息映射入

56、口處,添加映射宏: BEGIN_MESSAGE_MAP(CEx_SDIHelloView, CView)/ 消息映射開始 /AFX_MSG_MAP(CEx_SDIHelloView) ON_WM_LBUTTONDOWN() /AFX_MSG_MAP END_MESSAGE_MAP()/ 消息映射結(jié)束 在Ex_SDIHelloView.cpp文件中寫入一個空的消息處理函數(shù)的模板,框架: void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here

57、and/or call default CView:OnLButtonDown(nFlags, point); 根據(jù)ClassWizard產(chǎn)生的上述消息映射過程,可以手動添加一些ClassWizard不支持的消息映射函數(shù),以完成特定的功能。 鼠標和鍵盤消息各自都有相應的消息處理宏和預定義消息處理函數(shù),因此消息映射函數(shù)名稱不再需要用戶重新定義。對于菜單和按鈕等命令消息來說,用ClassWizard映射時會彈出一個對話框,用來指定消息映射函數(shù)的名稱。 若指定的消息映射函數(shù)需要刪除,則需要先在ClassWizard對話框的Messages列表中選定要刪除的消息映射函數(shù),然后單擊Delete Func

58、tion按鈕,最后關(guān)閉ClassWizard對話框,并在該消息映射函數(shù)所在的類實現(xiàn)文件(.cpp)中將映射函數(shù)定義的代碼全部刪除。,4.4使用ClassWizard,鍵盤和鼠標消息 按下一個鍵或組合鍵時,將WM_KEYDOWN或WM_SYSKEYDOWN放入具有輸入焦點的應用程序窗口的消息隊列中。鍵被釋放時,把WM_KEYUP或WM_SYSKEYUP消息放入消息隊列中。對字符鍵,會在這兩個消息之間產(chǎn)生WM_CHAR消息。, ClassWizard能自動添加了當前類的WM_KEYDOWN和WM_KEYUP擊鍵消息處理函數(shù)的調(diào)用,它們具有下列函數(shù)原型: afx_msg void OnKeyDown

59、( UINT nChar, UINT nRepCnt, UINT nFlags ); afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags ); afx_msg是MFC用于定義消息函數(shù)的標志,參數(shù)nChar表示虛擬鍵代碼,nRepCnt表示當用戶按住一個鍵時的重復計數(shù),nFlags表示擊鍵消息標志。 虛擬鍵代碼指與設(shè)備無關(guān)的鍵盤編碼。最常用的虛擬鍵代碼已被定義在Winuser.h中。 MFC中的ClassWizard也提供相應的字符消息處理框架,并自動添加了當前類的WM_CHAR消息處理函數(shù)調(diào)用,它具有下列函數(shù)原型: afx_msg

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論