第04章 MFC基本應(yīng)用程序的建立_第1頁(yè)
第04章 MFC基本應(yīng)用程序的建立_第2頁(yè)
第04章 MFC基本應(yīng)用程序的建立_第3頁(yè)
第04章 MFC基本應(yīng)用程序的建立_第4頁(yè)
第04章 MFC基本應(yīng)用程序的建立_第5頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第第4章章MFC基本應(yīng)用程序的建立基本應(yīng)用程序的建立 4.1 Windows編程基礎(chǔ)編程基礎(chǔ) 4.2 編制一個(gè)編制一個(gè)MFC應(yīng)用程序應(yīng)用程序 4.3 使用使用MFC AppWizard 4.4 使用使用ClassWizard 24.1Windows編程基礎(chǔ)編程基礎(chǔ)4.1.3Windows基本數(shù)據(jù)類型基本數(shù)據(jù)類型34.1Windows編程基礎(chǔ)編程基礎(chǔ)需要說(shuō)明的是:u這些基本數(shù)據(jù)類型都是以大寫(xiě)字符出現(xiàn)。u凡是數(shù)據(jù)類型的前綴是P或LP,表示該類型是一個(gè)指針或長(zhǎng)指針數(shù)據(jù)類型。前綴是H,表示是句柄類型。前綴是U,表示是無(wú)符號(hào)數(shù)據(jù)類型。u還提供一些宏來(lái)處理上述基本數(shù)據(jù)類型。LOBYTE和HIBYTE分別

2、用來(lái)獲取16位數(shù)值中的低位和高位字節(jié);LOWORD和HIWORD分別用來(lái)獲取32位數(shù)值中的低位和高位字;MAKEWORD是將兩個(gè)16位無(wú)符號(hào)值結(jié)合成一個(gè)32位無(wú)符號(hào)值。44.1Windows編程基礎(chǔ)編程基礎(chǔ) 4.1.1簡(jiǎn)單的簡(jiǎn)單的Windows應(yīng)用程序應(yīng)用程序 例Ex_HelloMsg 一個(gè)簡(jiǎn)單的Windows應(yīng)用程序。#include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) MessageBox (NULL, 你好,我的Visual C+世

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

4、K。WinMain函數(shù)聲明為返回一個(gè)int值。WINAPI標(biāo)識(shí)符在WINDEF.H定義,語(yǔ)句如下:#define WINAPI _stdcall_stdcall與_cdecl是兩種不同的函數(shù)調(diào)用約定,定義了函數(shù)參數(shù)入棧的順序,由調(diào)用函數(shù)還是被調(diào)用函數(shù)將參數(shù)彈出棧,以及產(chǎn)生函數(shù)修飾名的方法。54.1Windows編程基礎(chǔ)編程基礎(chǔ)輸入上面的代碼,運(yùn)行程序,如圖。從程序可以看出 :傳統(tǒng)的DOS程序以main函數(shù)作為進(jìn)入程序的初始入口點(diǎn),但在Windows應(yīng)用程序中,main函數(shù)被WinMain函數(shù)取而代之,WinMain函數(shù)的原型如下:int WINAPI WinMain (HINSTANCE hI

5、nstance, / 當(dāng)前實(shí)例句柄HINSTANCE hPrevInstance, / 前一實(shí)例句柄LPSTR lpCmdLine, / 指向命令行參數(shù)的指針int nCmdShow) / 窗口的顯示狀態(tài)句柄是一個(gè)標(biāo)識(shí)Windows資源(如菜單、圖標(biāo)、窗口等)和設(shè)備等對(duì)象的變量,或者是一個(gè)對(duì)操作系統(tǒng)資源的間接引用。每一個(gè)Windows應(yīng)用程序都需要Windows.h頭文件,它還包含了其他的一些Windows頭文件。這些頭文件定義了Windows的所有數(shù)據(jù)類型、函數(shù)調(diào)用、數(shù)據(jù)結(jié)構(gòu)和符號(hào)常量。MessageBox是一個(gè)Win32 API(Application Programming Interf

6、ace, 應(yīng)用程序接口)函數(shù),用來(lái)彈出一個(gè)對(duì)話框窗口,顯示短信息。該函數(shù)第一個(gè)參數(shù)用來(lái)指定父窗口句柄,即對(duì)話框所在的窗口句柄。第二、三個(gè)參數(shù)分別用來(lái)指定顯示的消息內(nèi)容和對(duì)話框窗口的標(biāo)題,最后一個(gè)參數(shù)用來(lái)指定在對(duì)話框中顯示的按鈕。 圖圖4.1 Ex_HelloMsg運(yùn)行結(jié)果運(yùn)行結(jié)果64.1Windows編程基礎(chǔ)編程基礎(chǔ)例Ex_HelloWin 一個(gè)完整的Windows應(yīng)用程序。#include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);/ 窗口過(guò)程int WINAPI WinMain (HINSTANCE hInstance, H

7、INSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)HWND hwnd ;/ 窗口句柄 MSG msg ;/ 消息 WNDCLASSwndclass ;/ 窗口類 wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc= WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra= 0 ; wndclass.hInstance= hInstance ; wndclass.hIcon= LoadIcon (NULL,

8、IDI_APPLICATION) ; wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName= NULL ; wndclass.lpszClassName= “HelloWin”;/ 窗口類名 if (!RegisterClass (&wndclass)/ 注冊(cè)窗口 MessageBox (NULL, 窗口注冊(cè)失??!, HelloWin, 0) ; return 0 ; 74

9、.1Windows編程基礎(chǔ)編程基礎(chǔ) hwnd = CreateWindow (HelloWin, / 窗口類名 我的窗口,/ 窗口標(biāo)題 WS_OVERLAPPEDWINDOW, / 窗口樣式 CW_USEDEFAULT, / 窗口最初的 x 位置 CW_USEDEFAULT, / 窗口最初的 y 位置 CW_USEDEFAULT, / 窗口最初的 x 大小 CW_USEDEFAULT, / 窗口最初的 y 大小 NULL, / 父窗口句柄 NULL, / 窗口菜單句柄 hInstance, / 應(yīng)用程序?qū)嵗浔?NULL) ; / 創(chuàng)建窗口的參數(shù) ShowWindow (hwnd, nCmdS

10、how) ;/ 顯示窗口 UpdateWindow (hwnd) ;/ 更新窗口,包括窗口的客戶區(qū) / 進(jìn)入消息循環(huán):當(dāng)從應(yīng)用程序消息隊(duì)列中檢取的消息是WM_QUIT時(shí),則退出循環(huán)。 while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ;/ 轉(zhuǎn)換某些鍵盤(pán)消息 DispatchMessage (&msg) ;/ 將消息發(fā)送給窗口過(guò)程,WndProc return msg.wParam ; 84.1Windows編程基礎(chǔ)編程基礎(chǔ)LRESULT CALLBACK WndProc (HWND hwnd, UI

11、NT message, WPARAM wParam, LPARAM lParam)switch (message) case WM_CREATE:/ 窗口創(chuàng)建產(chǎn)生的消息return 0 ; case WM_LBUTTONDOWN:MessageBox (NULL, 你好,我的Visual C+世界!, 問(wèn)候, 0) ;return 0 ; case WM_DESTROY:/ 當(dāng)窗口關(guān)閉時(shí)產(chǎn)生的消息PostQuitMessage (0) ;return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ; / 執(zhí)行默認(rèn)的消息處理 9

12、4.1Windows編程基礎(chǔ)編程基礎(chǔ)程序運(yùn)行,單擊鼠標(biāo)左鍵,如圖。窗口過(guò)程函數(shù)WndProc用來(lái)接收和處理各種不同的消息,WinMain函數(shù)通常要完成:調(diào)用API函數(shù)RegisterClass注冊(cè)應(yīng)用程序的窗口類。調(diào)用相關(guān)API函數(shù)創(chuàng)建和顯示窗口,并進(jìn)行必要的初始化。CreateWindow創(chuàng)建已注冊(cè)窗口類的窗口。Windows每一個(gè)窗口都有一些基本屬性。窗口類就是充當(dāng)這些屬性的模板。創(chuàng)建和啟動(dòng)應(yīng)用程序的消息循環(huán)。Windows應(yīng)用程序接受各種不同的消息。Windows系統(tǒng)首先將消息放入消息隊(duì)列中,應(yīng)用程序的消息循環(huán)就是從應(yīng)用程序的消息隊(duì)列中檢取消息,并將消息發(fā)送相應(yīng)的窗口過(guò)程函數(shù)中作進(jìn)一步處

13、理。如果接收到WM_QUIT消息,則退出應(yīng)用程序 圖圖4.2 Ex_HelloWin運(yùn)行結(jié)果運(yùn)行結(jié)果104.1Windows編程基礎(chǔ)編程基礎(chǔ)應(yīng)用程序的基本流程,如圖。 圖圖4.3 Windows應(yīng)用程序的基本流程應(yīng)用程序的基本流程114.1Windows編程基礎(chǔ)編程基礎(chǔ)4.1.2Windows編程特點(diǎn)編程特點(diǎn) 消息驅(qū)動(dòng)機(jī)制 DOS程序是通過(guò)調(diào)用系統(tǒng)的函數(shù)來(lái)獲得用戶輸入的,Windows程序則是通過(guò)操作系統(tǒng)發(fā)送的消息來(lái)處理用戶輸入的。無(wú)論是系統(tǒng)產(chǎn)生的動(dòng)作或是運(yùn)行應(yīng)用程序產(chǎn)生的動(dòng)作,都稱為事件(Events)產(chǎn)生的消息(Message)。在應(yīng)用程序中,通過(guò)接收消息、分發(fā)消息、處理消息來(lái)和用戶進(jìn)行交

14、互。許多消息都經(jīng)過(guò)了嚴(yán)格的定義,并且適用于所有的應(yīng)用程序。 圖形設(shè)備接口(GDI )DOS環(huán)境中,要在打印機(jī)上打印一幅圖形是非常復(fù)雜的事件。Windows則提供了一個(gè)抽象的接口,稱為圖形設(shè)備接口(Graphical Device Interface,簡(jiǎn)稱GDI),使得用戶直接利用系統(tǒng)的GDI函數(shù)就能方便實(shí)現(xiàn)輸入或輸出,而不必關(guān)心與系統(tǒng)相連的外部設(shè)備的類型。 基于資源的程序設(shè)計(jì)Windows應(yīng)用程序常常包含眾多圖形元素,每一個(gè)這樣的元素都作為一種可以裝入應(yīng)用程序的資源來(lái)存放。這些資源可以被編輯、修改,也可以被其他應(yīng)用程序所共享。VC中提供的許多編輯器能“所見(jiàn)即所得”地進(jìn)行不同類型資源的設(shè)計(jì)、編輯

15、等。 124.1Windows編程基礎(chǔ)編程基礎(chǔ)動(dòng)態(tài)鏈接庫(kù)動(dòng)態(tài)鏈接庫(kù)u提供一些特定結(jié)構(gòu)的函數(shù),能被應(yīng)用程序在運(yùn)行過(guò)程中裝入和連接,多個(gè)程序可以共享同一個(gè)動(dòng)態(tài)鏈接庫(kù)。從編程角度,動(dòng)態(tài)鏈接庫(kù)可以提高程序模塊的靈活性,它本身是可以單獨(dú)設(shè)計(jì)、編譯和調(diào)試的。uWindows提供了應(yīng)用程序可利用的豐富的函數(shù)調(diào)用,大多數(shù)用于實(shí)現(xiàn)其用戶界面和在顯示器上顯示的文本和圖形,都是通過(guò)動(dòng)態(tài)鏈接庫(kù)來(lái)實(shí)現(xiàn)的。uWindows中,KERNEL32用來(lái)處理存儲(chǔ)器低層功能、任務(wù)和資源管理等核心服務(wù); GDI32用來(lái)提供圖形設(shè)備接口,管理用戶界面和圖形繪制;USER32負(fù)責(zé)窗口的管理。 進(jìn)程和線程進(jìn)程和線程uWindows是一個(gè)3

16、2位多任務(wù)操作系統(tǒng),采用進(jìn)程和線程的管理模式。u進(jìn)程是裝入內(nèi)存中正在執(zhí)行的應(yīng)用程序。進(jìn)程包括私有的虛擬地址空間、代碼、數(shù)據(jù)及其它操作系統(tǒng)資源。進(jìn)程包括了一個(gè)或多個(gè)在進(jìn)程上下文內(nèi)運(yùn)行的線程。u線程是操作系統(tǒng)分配CPU時(shí)間的基本實(shí)體。線程可以執(zhí)行應(yīng)用程序代碼的任何部分,包括當(dāng)前正在被其它線程執(zhí)行的那些部分。同一進(jìn)程的所有線程共享同樣的虛擬地址空間、全局變量和操作系統(tǒng)資源。u一個(gè)應(yīng)用程序,包括一個(gè)或多個(gè)進(jìn)程,每個(gè)進(jìn)程由一個(gè)或多個(gè)線程構(gòu)成。134.1Windows編程基礎(chǔ)編程基礎(chǔ)4.1.3Windows基本數(shù)據(jù)類型基本數(shù)據(jù)類型144.1Windows編程基礎(chǔ)編程基礎(chǔ)需要說(shuō)明的是:u這些基本數(shù)據(jù)類型都是

17、以大寫(xiě)字符出現(xiàn)。u凡是數(shù)據(jù)類型的前綴是P或LP,表示該類型是一個(gè)指針或長(zhǎng)指針數(shù)據(jù)類型。前綴是H,表示是句柄類型。前綴是U,表示是無(wú)符號(hào)數(shù)據(jù)類型。u還提供一些宏來(lái)處理上述基本數(shù)據(jù)類型。LOBYTE和HIBYTE分別用來(lái)獲取16位數(shù)值中的低位和高位字節(jié);LOWORD和HIWORD分別用來(lái)獲取32位數(shù)值中的低位和高位字;MAKEWORD是將兩個(gè)16位無(wú)符號(hào)值結(jié)合成一個(gè)32位無(wú)符號(hào)值。154.2編制一個(gè)編制一個(gè)MFC應(yīng)用程序應(yīng)用程序4.2.1MFC概述概述1987年微軟公司推出了第一代Windows產(chǎn)品,并為應(yīng)用程序設(shè)計(jì)者提供了Win16 API,在此基礎(chǔ)上推出了Windows GUI(圖形用戶界面)

18、,然后采用面向?qū)ο蠹夹g(shù)對(duì)API進(jìn)行封裝。1992年推出應(yīng)用程序框架產(chǎn)品AFX(Application Frameworks),并在AFX的基礎(chǔ)上進(jìn)一步發(fā)展為MFC產(chǎn)品。MFC類的基本層次結(jié)構(gòu)如圖。 圖圖4.4 MFC類的基本層次結(jié)構(gòu)類的基本層次結(jié)構(gòu)CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd164.2編制一個(gè)編制一個(gè)MFC應(yīng)用程序應(yīng)用程序4.2.2設(shè)計(jì)一個(gè)設(shè)計(jì)一個(gè)MFC程序程序例Ex_HelloMFC 一個(gè)MFC應(yīng)用程序。#i

19、nclude / MFC頭文件class CHelloApp : public CWinApp/ 聲明應(yīng)用程序類public:virtual BOOL InitInstance();CHelloApp theApp; / 建立應(yīng)用程序類的實(shí)例class CMainFrame: public CFrameWnd/ 聲明主窗口類public:CMainFrame()/ 創(chuàng)建主窗口Create(NULL, 我的窗口, WS_OVERLAPPEDWINDOW, CRect(0,0,400,300);protected:afx_msg void OnLButtonDown(UINT nFlags, CP

20、oint point);DECLARE_MESSAGE_MAP();/ 消息映射入口BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_WM_LBUTTONDOWN()/ 單擊鼠標(biāo)左鍵消息的映射宏END_MESSAGE_MAP()174.2編制一個(gè)編制一個(gè)MFC應(yīng)用程序應(yīng)用程序void CMainFrame:OnLButtonDown(UINT nFlags, CPoint point) MessageBox (你好,我的Visual C+世界!, 問(wèn)候, 0) ;CFrameWnd:OnLButtonDown(nFlags, point);/ 每當(dāng)應(yīng)用程序首

21、次執(zhí)行時(shí)都要調(diào)用的初始化函數(shù)BOOL CHelloApp:InitInstance()m_pMainWnd = new CMainFrame(); m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); return TRUE; 運(yùn)行上述MFC程序需要進(jìn)行以下步驟:u選擇“File”“New”。單擊Projects,選中Win32 Application項(xiàng),創(chuàng)建一個(gè)Ex_HelloMFC空應(yīng)用程序項(xiàng)目。u選擇“File”“New”。單擊File標(biāo)簽,在左邊的列表框中選擇C+ Source File項(xiàng),在右邊的File框中鍵入E

22、x_HelloMsg.cpp,單擊OK。u輸入上面的代碼。選擇“Project”“Settings”,選擇“General”標(biāo)簽。在“Microsoft Foundation Classes”組合框中,選擇“Use MFC in a Shared DLL”。單擊OK。u程序運(yùn)行后,單擊鼠標(biāo)左鍵,就會(huì)彈出一個(gè)對(duì)話框,結(jié)果同Ex_HelloWin。 184.2編制一個(gè)編制一個(gè)MFC應(yīng)用程序應(yīng)用程序4.2.3理解程序代碼理解程序代碼 MFC是使用afxwin.h來(lái)代替頭文件windows.h。運(yùn)行應(yīng)用程序時(shí),自動(dòng)調(diào)用應(yīng)用程序框架內(nèi)部的WinMain函數(shù),并自動(dòng)查找該應(yīng)用程序類CHelloApp(從C

23、WinApp派生)的全局變量theApp,然后自動(dòng)調(diào)用CHelloApp的虛函數(shù)InitInstance,該函數(shù)會(huì)進(jìn)一步調(diào)用相應(yīng)的函數(shù)來(lái)完成主窗口的構(gòu)造和顯示工作。上述程序中InitInstance的執(zhí)行過(guò)程。首先執(zhí)行的是:m_pMainWnd = new CMainFrame();創(chuàng)建從CFrameWnd類派生而來(lái)的用戶框架窗口CMainFrame類對(duì)象,繼而調(diào)用該類的構(gòu)造函數(shù),使得Create函數(shù)被調(diào)用,完成了窗口創(chuàng)建工作。然后執(zhí)行后面兩句:m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();用作窗口的顯示和更新。最后返回

24、TRUE,表示窗口創(chuàng)建成功。由于應(yīng)用程序類CWinApp是用來(lái)調(diào)用WinMain以及實(shí)例的初始化,因此每一個(gè)MFC應(yīng)用程序有且只能一個(gè)這樣的應(yīng)用程序類,且需要一個(gè)全局的對(duì)象實(shí)例,如上述程序中的theApp。 194.2編制一個(gè)編制一個(gè)MFC應(yīng)用程序應(yīng)用程序InitInstance完成初始化后,調(diào)用基類CWinApp的成員函數(shù)Run,執(zhí)行應(yīng)用程序的消息循環(huán)。Run檢查到消息隊(duì)列為空時(shí),調(diào)用基類CWinApp的成員函數(shù)OnIdle進(jìn)行空閑時(shí)的后臺(tái)處理工作。若消息隊(duì)列為空且又沒(méi)有后臺(tái)工作要處理時(shí),則應(yīng)用程序一直處于等待狀態(tài),一直等到有消息為止。當(dāng)程序結(jié)束后,調(diào)用基類CWinApp的成員函數(shù)ExitI

25、nstance,完成終止應(yīng)用程序的收尾工作。在MFC中,一個(gè)消息的處理往往是通過(guò)獨(dú)特的MFC消息映射機(jī)制來(lái)進(jìn)行的。消息映射(Message Map)機(jī)制,指MFC類中將消息與消息處理函數(shù)聯(lián)系起來(lái),一一對(duì)應(yīng)的機(jī)制。任何一個(gè)從類CCmdTarget派生的類理論上均可處理消息,且都有相應(yīng)的消息映射函數(shù)。按照MFC的消息映射機(jī)制,映射一個(gè)消息的過(guò)程由三個(gè)部分組成:在處理消息的類中,使用消息宏DECLARE_MESSAGE_MAP()聲明對(duì)消息映射的支持,并在該宏之前聲明消息處理函數(shù)。使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在類聲明之后的地方定義該類支持的消息映射入口點(diǎn),

26、所有消息映射宏都添加在這里,當(dāng)然不同的消息MFC都會(huì)有不同的消息映射宏。定義消息處理函數(shù)。為了使該消息能被其他對(duì)象接收并處理,在函數(shù)中常常需要調(diào)用基類中的相關(guān)消息處理函數(shù)。MFC的ClassWizard(類向?qū)?能自動(dòng)完成消息的上述映射過(guò)程。204.3使用使用MFC AppWizard4.3.1應(yīng)用程序框架類型應(yīng)用程序框架類型214.3使用使用MFC AppWizard4.3.2創(chuàng)建一個(gè)單文檔應(yīng)用程序創(chuàng)建一個(gè)單文檔應(yīng)用程序開(kāi)始開(kāi)始選擇“File”“New”,選擇Projects標(biāo)簽;選擇MFC AppWizard(exe)的項(xiàng)目類型(該類型用于創(chuàng)建可執(zhí)行的Windows應(yīng)用程序),將項(xiàng)目工作文

27、件夾定位在“D:Visual C+ 6.0程序”,并在“Project Name”框中輸入項(xiàng)目名Ex_SDIHello,如圖,單擊OK。圖圖4.5 MFC AppWizard的的“New”對(duì)話框?qū)υ捒?24.3使用使用MFC AppWizard第一步第一步u從應(yīng)用程序類型Single Document、Multiple Document和Dialog Based中選擇SDI。u決定應(yīng)用程序中是否需要MFC的“文檔/視圖”結(jié)構(gòu)的支持。若不選定此項(xiàng),則程序中的磁盤(pán)文件的打開(kāi)、保存以及文檔和視圖的相互作用等功能需要用戶來(lái)實(shí)現(xiàn),且將跳過(guò)Step 2Step 5,直接彈出“Step 6”對(duì)話框。u選擇資

28、源所使用的語(yǔ)言,這里是“中文中國(guó)”,單擊Next按鈕。圖圖4.6 SDI的的“Step 1”對(duì)話框?qū)υ捒?34.3使用使用MFC AppWizard第二步第二步單擊Next按鈕進(jìn)入下一步。 第三步第三步單擊Next按鈕進(jìn)入下一步。 圖圖4.7 SDI的的“Step 2”對(duì)話框?qū)υ捒驁D圖4.8 SDI的的“Step 3”對(duì)話框?qū)υ捒?44.3使用使用MFC AppWizard第四步第四步單擊Next按鈕進(jìn)入下一步。 圖圖4.9 SDI的的“Step 4”對(duì)話框?qū)υ捒?54.3使用使用MFC AppWizard第五步第五步在彈出的對(duì)話框(如圖)中出現(xiàn)三個(gè)方面的選項(xiàng),供用戶來(lái)選擇: u應(yīng)用程序的主窗

29、口是MFC標(biāo)準(zhǔn)風(fēng)格還是窗口左邊有切分窗口的瀏覽器風(fēng)格;u在源文件中是否加入注釋用來(lái)引導(dǎo)用戶編寫(xiě)程序代碼;u使用動(dòng)態(tài)鏈接庫(kù)還是靜態(tài)鏈接庫(kù)。u保留缺省狀態(tài),單擊Next按鈕進(jìn)行下一步。圖圖4.10 SDI的的“Step 5”對(duì)話框?qū)υ捒?64.3使用使用MFC AppWizard第六步第六步單擊Finish按鈕出現(xiàn)如圖4.12所示的對(duì)話框 圖圖4.11 SDI的的“Step 6”對(duì)話框?qū)υ捒驁D圖4.12 項(xiàng)目信息對(duì)話框項(xiàng)目信息對(duì)話框274.3使用使用MFC AppWizard編譯并運(yùn)行編譯并運(yùn)行圖圖4.13 應(yīng)用程序運(yùn)行結(jié)果應(yīng)用程序運(yùn)行結(jié)果菜單欄工具欄狀態(tài)欄標(biāo)題欄文檔窗口284.3使用使用MFC

30、AppWizard4.3.3理解程序框架理解程序框架應(yīng)用類應(yīng)用類CEx_SDIHelloApp下面首先來(lái)看看Ex_SDIHello應(yīng)用程序的Ex_SDIHello.h文件:.class CEx_SDIHelloApp : public CWinApppublic:CEx_SDIHelloApp();/AFX_VIRTUAL(CEx_SDIHelloApp)public:virtual BOOL InitInstance();/AFX_VIRTUAL/ Implementation(實(shí)現(xiàn))/AFX_MSG(CEx_SDIHelloApp)afx_msg void OnAppAbout();/ N

31、OTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP()/ 聲明消息映射;. 294.3使用使用MFC AppWizard代碼中,/AFX_VIRTUAL(類名)./AFX_VIRTUAL是ClassWizard定義的專門(mén)用作虛函數(shù)重載的標(biāo)記,表示該程序塊中的虛函數(shù)的重載是由ClassWizard來(lái)自動(dòng)管理的,一般不需要去更改。同樣,/AFX_

32、MSG(類名)./AFX_MSG是ClassWizard定義的專門(mén)用作消息映射聲明的標(biāo)記。代碼中的“/TODO:”以及英文等注釋是由MFC AppWizard為用戶自動(dòng)生成的。若不需要這些注釋,可在應(yīng)用程序向?qū)У牡谖宀綄?duì)話框中,將“Would you like to generate source file comments?”項(xiàng)選為“No,thank you”。下面再來(lái)看看該Ex_SDIHello應(yīng)用程序的Ex_SDIHello.cpp源文件:#include stdafx.h/ 預(yù)編譯處理的頭文件#include Ex_SDIHello.h/ 應(yīng)用類的頭文件#include MainFrm

33、.h/ 主框架類的頭文件#include Ex_SDIHelloDoc.h/ 文檔類的頭文件#include Ex_SDIHelloView.h/ 視圖類的頭文件 304.3使用使用MFC AppWizard/消息映射開(kāi)始BEGIN_MESSAGE_MAP(CEx_SDIHelloApp, CWinApp)/ 消息映射宏/AFX_MSG_MAP(CEx_SDIHelloApp)/ 映射“幫助”菜單項(xiàng)中的“關(guān)于Ex_SDIHello”命令消息,當(dāng)用戶選擇了/ 該命令時(shí),將執(zhí)行函數(shù)OnAppAboutON_COMMAND(ID_APP_ABOUT, OnAppAbout)/ NOTE - the

34、ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP/ 映射“文件”菜單項(xiàng)中的“新建”和“打開(kāi)”命令消息,當(dāng)用戶選擇了“新建”/ 或“打開(kāi)”命令時(shí),將相應(yīng)執(zhí)行CWinApp:OnFileNew或CWinApp:OnFileOpenON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen)

35、/ 映射“文件”菜單項(xiàng)中的“打印設(shè)置”命令消息,當(dāng)用戶選擇了/ 該命令時(shí),將執(zhí)行函數(shù)CWinApp:OnFilePrintSetupON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup)END_MESSAGE_MAP()/ 消息映射宏 314.3使用使用MFC AppWizard/ 消息映射開(kāi)始結(jié)束CEx_SDIHelloApp:CEx_SDIHelloApp()/ 構(gòu)造函數(shù)CEx_SDIHelloApp theApp;/ 定義的一個(gè)應(yīng)用類對(duì)象,表示一個(gè)實(shí)例BOOL CEx_SDIHelloApp:InitInstance().voi

36、d CEx_SDIHelloApp:OnAppAbout()CAboutDlg aboutDlg;/ 定義的CAboutDlg對(duì)象aboutDlg.DoModal();/ 調(diào)用相應(yīng)的庫(kù)函數(shù),顯示CAboutDlg對(duì)話框代碼中,/AFX_MSG_MAP(類名)./AFX_MSG_MAP是ClassWizard定義的專門(mén)用作消息映射的標(biāo)記,表示該程序塊中的消息映射函數(shù)是由ClassWizard來(lái)自動(dòng)管理的,用戶一般不需要去更改。 324.3使用使用MFC AppWizard最主要的InitInstance函數(shù)體代碼:BOOL CEx_SDIHelloApp:InitInstance()/ 若用戶在

37、MFC AppWizard的第三步中,選中了“ActiveX Controls”,/ 則表示所創(chuàng)建的應(yīng)用程序支持ActiveX控件AfxEnableControlContainer();/ 若用戶在MFC AppWizard的第四步中,選中了“3D controls”/ 則表示所創(chuàng)建的應(yīng)用程序支持Windows 95版本前的3D控件風(fēng)格#ifdef _AFXDLLEnable3dControls();/ 使用動(dòng)態(tài)的3D控件#elseEnable3dControlsStatic();/ 使用靜態(tài)的3D控件#endif / 在系統(tǒng)注冊(cè)表中登記應(yīng)用程序的主鍵值,以便將一些與應(yīng)用程序/ 相關(guān)的參數(shù)存放

38、在該主鍵值下SetRegistryKey(_T(Local MFC AppWizard-Generated Applications);/ 從注冊(cè)表中調(diào)入應(yīng)用程序的一些標(biāo)準(zhǔn)參數(shù)值.LoadStdProfileSettings(); 334.3使用使用MFC AppWizard/ 若用戶在MFC AppWizard的第一步中,選擇了“Single document”類型,/ 則進(jìn)行下列的單文檔模板的創(chuàng)建及其初始化操作。CSingleDocTemplate* pDocTemplate;/ 定義一個(gè)單文檔模板指針變量pDocTemplate = new CSingleDocTemplate(/ 登記

39、并創(chuàng)建單文檔應(yīng)用程序模板IDR_MAINFRAME,/ 菜單、快捷鍵等的資源標(biāo)識(shí)號(hào)RUNTIME_CLASS(CEx_SDIHelloDoc),/ 文檔類RUNTIME_CLASS(CMainFrame), / 主框架窗口類RUNTIME_CLASS(CEx_SDIHelloView);/ 視圖類AddDocTemplate(pDocTemplate);/ 向應(yīng)用程序添加文檔模板/ 分列命令行標(biāo)準(zhǔn)命令如DDE、文件打開(kāi)等CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);/ 傳送命令行指定的命令,并執(zhí)行相應(yīng)的操作if (!ProcessShel

40、lCommand(cmdInfo)return FALSE;/ 對(duì)主框架窗口進(jìn)行初始化以便顯示和更新m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();return TRUE;344.3使用使用MFC AppWizarduRUNTIME_CLASS是一個(gè)運(yùn)行類的宏定義,返回CRuntimeClass類指針。借助CRuntimeClass類結(jié)構(gòu)能在應(yīng)用程序運(yùn)行過(guò)程中獲得該類對(duì)象及其基類的相關(guān)信息,從而可以實(shí)現(xiàn)運(yùn)行時(shí)類型檢查。uCSingleDocTemplate是一個(gè)單文檔模板類,將用戶應(yīng)用程序項(xiàng)目中的資源、主框架窗口類、文檔類以及視

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

42、CEx_SDIHelloDoc CEx_SDIHelloDoc類的Ex_SDIHelloDoc.h文件:.class CEx_SDIHelloDoc : public CDocumentprotected: CEx_SDIHelloDoc();/ 構(gòu)造函數(shù)DECLARE_DYNCREATE(CEx_SDIHelloDoc).public:/AFX_VIRTUAL(CEx_SDIHelloDoc)public:virtual BOOL OnNewDocument();/ 當(dāng)新建一個(gè)文檔時(shí),自動(dòng)調(diào)用該函數(shù)virtual void Serialize(CArchive& ar);/ 當(dāng)文檔打

43、開(kāi)或保存時(shí),自動(dòng)調(diào)用該函數(shù)/AFX_VIRTUAL/ Implementationpublic:virtual CEx_SDIHelloDoc();#ifdef _DEBUG/ 若應(yīng)用程序是調(diào)試版本virtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif.364.3使用使用MFC AppWizard/ 產(chǎn)生消息映射函數(shù)protected:/AFX_MSG(CEx_SDIHelloDoc)/ NOTE - the ClassWizard will add and remove mem

44、ber functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP();.用戶的文檔類CEx_SDIHelloDoc是從基類CDocument派生而來(lái)。AssertValid和Dump是用于調(diào)試版本的兩個(gè)虛函數(shù)。AssertValid的目的是啟用“斷言”機(jī)制來(lái)檢驗(yàn)對(duì)象的正確性、合法性,而Dump的目的是為他人分析用戶自己定義的類提供一種機(jī)制,用來(lái)輸出類的名稱或其他數(shù)據(jù)內(nèi)容。374.3使用使用MFC AppWizard視圖類視圖類CEx_SDIHe

45、lloViewCEx_SDIHelloView類的Ex_SDIHelloView.h文件:class CEx_SDIHelloView : public CViewprotected: CEx_SDIHelloView();DECLARE_DYNCREATE(CEx_SDIHelloView)public:CEx_SDIHelloDoc* GetDocument();/ 用于返回文檔類指針public:/AFX_VIRTUAL(CEx_SDIHelloView)public:virtual void OnDraw(CDC* pDC); / 用于繪制的虛函數(shù)virtual BOOL PreCre

46、ateWindow(CREATESTRUCT& cs);/ 用于設(shè)置文檔窗口風(fēng)格的虛函數(shù)protected:/ 以下虛函數(shù)供實(shí)現(xiàn)打印與打印預(yù)覽功能時(shí)重載。若用戶在MFC AppWizard/ 的第四步中未選中“Printing and print preview”時(shí),則不會(huì)出現(xiàn)下列虛函數(shù)。virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrint

47、Info* pInfo);/AFX_VIRTUAL 384.3使用使用MFC AppWizard/ Implementationpublic:virtual CEx_SDIHelloView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#tected:/AFX_MSG(CEx_SDIHelloView)/ NOTE - the ClassWizard will add and remove member functions here.

48、/ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP();#ifndef _DEBUG / 內(nèi)聯(lián)函數(shù),用于返回在文檔模板定義的文檔類指針inline CEx_SDIHelloDoc* CEx_SDIHelloView:GetDocument() return (CEx_SDIHelloDoc*)m_pDocument; #endifCEx_SDIHelloView的成員函數(shù)GetDocument是用inline聲明成一個(gè)內(nèi)聯(lián)函數(shù)。 394.3使用使用MFC AppWiz

49、ardCEx_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, CView)/AFX_MSG_MAP(CEx_SDIHelloView)/AFX_MSG_MAP/ 為“文件”菜單下的“打印.”和“打印預(yù)覽”映射標(biāo)準(zhǔn)打印命令ON_COMM

50、AND(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_SDIHelloView:CEx_SDIHelloView()BOOL CEx_SDIHelloView:PreCreateWindow(CREATESTRUCT& cs)return

51、 CView:PreCreateWindow(cs); 404.3使用使用MFC AppWizardvoid CEx_SDIHelloView:OnDraw(CDC* pDC)CEx_SDIHelloDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);BOOL CEx_SDIHelloView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CEx_SDIHelloView:OnBeginPrinting(CDC* /

52、*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CEx_SDIHelloView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing 414.3使用使用MFC AppWizard/ 以下是用于調(diào)試的函數(shù)#ifdef _DEBUGvoid CEx_SDIHelloView:AssertValid() constCView:AssertValid();void CE

53、x_SDIHelloView:Dump(CDumpContext& dc) constCView:Dump(dc);CEx_SDIHelloDoc* CEx_SDIHelloView:GetDocument() ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CEx_SDIHelloDoc);/ “斷言”m_pDocument指針可以指向的CEx_SDIHelloDoc類/ 是一個(gè)RUNTIME_CLASS類型return (CEx_SDIHelloDoc*)m_pDocument;#endif /_DEBUG 424.3使用使用MFC AppWiz

54、ard視圖類CEx_SDIHelloView是從基類CView派生而來(lái)的。說(shuō)明:u各種類型的輸入都可以由視圖來(lái)響應(yīng)、處理,并且打印和打印預(yù)覽也是在視圖類中完成的。這種文檔和視圖的結(jié)合,稱為“文檔/視圖結(jié)構(gòu)”機(jī)制,是MFC應(yīng)用程序框架的核心,可以進(jìn)行消息的處理、文檔的格式化及文檔數(shù)據(jù)的可視化處理等;它不但使文檔數(shù)據(jù)和視圖分離,而且能簡(jiǎn)化應(yīng)用程序并減少代碼冗余。uPreCreateWindow虛函數(shù)是在相應(yīng)窗口創(chuàng)建前被系統(tǒng)自動(dòng)調(diào)用的。在此函數(shù)中,可以更改其CREATESTRUCT結(jié)構(gòu)內(nèi)容,將改變相應(yīng)窗口的風(fēng)格.uOnDraw是個(gè)非常有用的虛函數(shù),當(dāng)應(yīng)用程序中的窗口狀態(tài)或大小發(fā)生改變時(shí),系統(tǒng)均會(huì)調(diào)用

55、此函數(shù)重新繪制文檔窗口的客戶區(qū)。用戶可以將一些繪圖有關(guān)的代碼添加此函數(shù)中,能在視圖中進(jìn)行圖形的繪制。 例如,下面的代碼:void CEx_SDIHelloView:OnDraw(CDC* pDC)CEx_SDIHelloDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(100,100,Hello,World!); 434.3使用使用MFC AppWizard主框架窗口類主框架窗口類CMainFrame“關(guān)于關(guān)于”對(duì)話框類對(duì)話框類CAboutDlgMFC涉及到的機(jī)制有:u文檔/視圖機(jī)制:它使用戶應(yīng)用程序類、文檔類、視圖類以及框架類之

56、間有機(jī)地結(jié)合在一起,是MFC最引人注目的機(jī)制。u消息映射機(jī)制:它是實(shí)現(xiàn)對(duì)各種不同消息的處理。u數(shù)據(jù)映射機(jī)制:是實(shí)現(xiàn)對(duì)話框中變量與控件之間的數(shù)據(jù)交換和數(shù)據(jù)校驗(yàn)。u運(yùn)行時(shí)類型檢查機(jī)制:它通過(guò)GetRuntimeClass、IsKindOf、宏DECLARE_DYNAMIC和宏IMPLEMENT_DYNAMIC來(lái)實(shí)現(xiàn)的。u診斷信息轉(zhuǎn)儲(chǔ)機(jī)制:它是通過(guò)AssertValid、Dump和宏TRACE來(lái)實(shí)現(xiàn)的。u實(shí)現(xiàn)文檔/視圖機(jī)制是通過(guò)MFC應(yīng)用程序向?qū)ё詣?dòng)完成的,而消息和數(shù)據(jù)映射則是通過(guò)MFC的ClassWizard來(lái)自動(dòng)進(jìn)行的。 444.4使用使用ClassWizard4.4.1ClassWizard概

57、述概述u打開(kāi)MFC的ClassWizard的方法:u選擇“View”“ClassWizard”菜單或直接使用Ctrl+W快捷鍵。u在源代碼文件的文檔編輯窗口中,右擊鼠標(biāo),選擇ClassWizard命令。u當(dāng)ClassWizard打開(kāi)后,就會(huì)彈出如圖的MFC ClassWizard對(duì)話框。 圖圖4.15 MFC ClassWiard對(duì)話框?qū)υ捒?54.4使用使用ClassWizard4.4.2消息和消息映射消息和消息映射消息分類消息分類Windows應(yīng)用程序中的消息主要有三種類型。u窗口消息(Windows message)主要指由WM_開(kāi)頭的消息,一般由窗口類和視圖類對(duì)象來(lái)處理。窗口消息往往帶

58、有參數(shù),以標(biāo)志處理消息的方法。u控件的通知消息(Control notifications)當(dāng)控件的狀態(tài)發(fā)生改變時(shí),控件就會(huì)向其父窗口發(fā)送WM_COMMAND通知消息。應(yīng)用程序框架處理控件消息的方法和窗口消息相同,但按鈕的BN_CLICKED通知消息除外,它的處理方法與命令消息相同。u命令消息(Command message)主要包括由用戶交互對(duì)象(菜單、工具條的按鈕、快捷鍵等)發(fā)送的WM_COMMAND通知消息。命令消息的處理方式與其他兩種消息不同,它能夠被多種對(duì)象接收、處理,這些對(duì)象包括文檔類、文檔模板類、應(yīng)用程序本身以及窗口和視類等;而窗口消息和控件的通知消息是由窗口對(duì)象接收并處理的,這

59、里的窗口對(duì)象是指從CWnd中派生的類的對(duì)象,它包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及從這些類派生的對(duì)象等。 464.4使用使用ClassWizardClassWizard映射消息的一般方法映射消息的一般方法474.4使用使用ClassWizard例如,向CEx_SDIHelloView中添加WM_LBUTTOMDOWN的消息映射,則可按下列步驟進(jìn)行:(1)按Ctrl+W快捷鍵打開(kāi)MFC ClassWizard對(duì)話框。(2)在Class name組合框中,將類名選定為CEx_SDIHelloView。(3)在Object IDs

60、列表框中選定CEx_SDIHelloView,而在Messages列表中選定WM_LBUTTOMDOWN消息。(4)雙擊Messages列表中的WM_LBUTTOMDOWN消息或單擊Add Function按鈕,都會(huì)在CEx_SDIHelloView類中添加該消息的映射函數(shù)OnLButtonDown,同時(shí)在Member funcions列表中顯示這一消息映射函數(shù)和被映射的消息,如圖。圖圖4.16 映射映射WM_LBUTTONDOWN消息消息484.4使用使用ClassWizard(5)單擊Edit Code,轉(zhuǎn)向文檔窗口,定位到OnLButtonDown源代碼處。(6)添加下列代碼:void CEx_SDIHelloView:OnLButtonDown(UINT

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論