




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第3章章 MFC基本應用程序的建立基本應用程序的建立 Microsoft Foundation Class Library 主講教師:劉懷主講教師:劉懷 廣廣 Visual C+不僅提供了常用的不僅提供了常用的Windows應用程應用程 序的基本框架序的基本框架,而且,而且可以可以在框架程序中直接調(diào)用在框架程序中直接調(diào)用 Win32 API(Application Programming Interface, 應用程序接口應用程序接口)函數(shù)。函數(shù)。 這樣,用戶僅需要在相應的框架位置中添加自這樣,用戶僅需要在相應的框架位置中添加自 己的代碼或修改部分代碼就可實現(xiàn)己的代碼或修改部分代碼就可實現(xiàn)W
2、indows應用程應用程 序的許多功能。序的許多功能。 3.1 Windows編程基礎(chǔ)編程基礎(chǔ) 步驟:步驟:/ Win32應用程序應用程序 選擇選擇“文件文件”“新建新建”菜單菜單 “工程工程”標簽頁面標簽頁面選中選中 Win32 Application。 鍵入項目名稱鍵入項目名稱“ Ex_3_1” “位置位置”編輯框鍵入或瀏覽文件編輯框鍵入或瀏覽文件 夾名夾名“ Ex_3_1” 。 單擊單擊確定確定按鈕繼續(xù)。選中按鈕繼續(xù)。選中An empty project項。單擊項。單擊完成完成 按鈕,單擊按鈕,單擊確定確定按鈕系統(tǒng)將自動創(chuàng)建此應用程序。按鈕系統(tǒng)將自動創(chuàng)建此應用程序。 再次選擇再次選擇“文
3、件文件”“新建新建”菜單。在菜單。在“文件文件”標簽頁面左標簽頁面左 邊的列表框中選擇邊的列表框中選擇C+ Source File項,右邊的文件框中鍵入項,右邊的文件框中鍵入 Ex_3_1,單擊,單擊確定確定按鈕。按鈕。 1. 輸入下面的代碼,運行程序。輸入下面的代碼,運行程序。 3.1.1 C+的的Windows應用程序應用程序 例例Ex_3_1 一個簡單的一個簡單的Windows應用程序應用程序 #include /C+ Windows應用程序都需要應用程序都需要Windows.h 頭文件頭文件 int WINAPI WinMain (HINSTANCE hInstance, /當前實例句
4、柄當前實例句柄 HINSTANCE hPrevInstance, /前一實例句柄前一實例句柄 LPSTR lpCmdLine, /指向命令行參數(shù)的指針指向命令行參數(shù)的指針 int nCmdShow /窗口的顯示狀態(tài)窗口的顯示狀態(tài) )/main主函數(shù)被主函數(shù)被WinMain函數(shù)取代函數(shù)取代 MessageBox (NULL, /父窗口句柄父窗口句柄 你好,我的你好,我的Visual C+世界!世界!, /顯示的消息內(nèi)容顯示的消息內(nèi)容 問候問候, /對話框窗口的標題對話框窗口的標題 0 /顯示的按鈕顯示的按鈕 ) ; return 0 ; 3.1.1 c+的的Windows應用程序應用程序 圖1
5、Ex_HelloMsg運行結(jié)果 MessageBox是一個是一個Win32 API函數(shù),用來彈出一個消函數(shù),用來彈出一個消 息對話框。息對話框。 3.1.1 c+的的Windows應用程序應用程序 傳統(tǒng)的DOS程序以main函數(shù)作為進入程序的初始入口點,但在Windows應用程序中, main函數(shù)被WinMain函數(shù)取而代之,WinMain函數(shù)的原型如下: int WINAPI WinMain ( HINSTANCE hInstance, / 當前實例句柄 HINSTANCE hPrevInstance, / 前一實例句柄 LPSTR lpCmdLine, / 指向命令行參數(shù)的指針 int n
6、CmdShow) / 窗口的顯示狀態(tài) 句柄是一個標識Windows資源(如菜單、圖標、窗口等)和設(shè)備等對象的變量,或者是一 個對操作系統(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ù)分別用來指定顯
7、示的消息內(nèi)容和對話框窗口的標題, 最后一個參數(shù)用來指定在對話框中顯示的按鈕。 3.1.1 c+的的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 ;/ 窗口類窗口類
8、 wndclass.style = CS_HREDRAW | CS_VREDRAW ; 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) GetStock
9、Object (WHITE_BRUSH) ; wndclass.lpszMenuName= NULL ; wndclass.lpszClassName= “HelloWin”;/ 窗口類名窗口類名 if (!RegisterClass ( return 0 ; 例Ex_HelloWin 一個完整的Windows應用程序。 3.1.1 c+的的Windows應用程序應用程序 hwnd = CreateWindow (HelloWin, / 窗口類名窗口類名 我的窗口我的窗口,/ 窗口標題窗口標題 WS_OVERLAPPEDWINDOW, / 窗口樣式窗口樣式 CW_USEDEFAULT, / 窗
10、口最初的窗口最初的 x 位置位置 CW_USEDEFAULT, / 窗口最初的窗口最初的 y 位置位置 CW_USEDEFAULT, / 窗口最初的窗口最初的 x 大小大小 CW_USEDEFAULT, / 窗口最初的窗口最初的 y 大小大小 NULL, / 父窗口句柄父窗口句柄 NULL, / 窗口菜單句柄窗口菜單句柄 hInstance, / 應用程序?qū)嵗浔鷳贸绦驅(qū)嵗浔?NULL) ; / 創(chuàng)建窗口的參數(shù)創(chuàng)建窗口的參數(shù) ShowWindow (hwnd, nCmdShow) ;/ 顯示窗口顯示窗口 UpdateWindow (hwnd) ;/ 更新窗口,包括窗口的客戶區(qū)更新窗口,包括
11、窗口的客戶區(qū) / 進入消息循環(huán):當從應用程序消息隊列中檢取的消息是進入消息循環(huán):當從應用程序消息隊列中檢取的消息是WM_QUIT時,則退出循環(huán)。時,則退出循環(huán)。 while (GetMessage (/ 轉(zhuǎn)換某些鍵盤消息轉(zhuǎn)換某些鍵盤消息 DispatchMessage (/ 將消息發(fā)送給窗口過程,這里是將消息發(fā)送給窗口過程,這里是 return msg.wParam ; 3.1.1 c+的的Windows應用程序應用程序 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch
12、 (message) case WM_CREATE:/ 窗口創(chuàng)建產(chǎn)生的消息窗口創(chuàng)建產(chǎn)生的消息 return 0 ; case WM_LBUTTONDOWN: MessageBox (NULL, 你好,我的你好,我的Visual C+世界!世界!, 問候問候, 0) ; return 0 ; case WM_DESTROY:/ 當窗口關(guān)閉時產(chǎn)生的消息當窗口關(guān)閉時產(chǎn)生的消息 PostQuitMessage (0) ; return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ; / 執(zhí)行默認的消息處理執(zhí)行默認的消息處理 3.1.
13、1 c+的的Windows應用程序應用程序 3.1.1 c+的的Windows應用程序應用程序 例Ex_HelloWin 一個完整的Windows應用程序。 3.1.1 c+的的Windows應用程序應用程序 例Ex_HelloWin 一個完整的Windows應用程序。 程序運行,單擊鼠標左鍵,如圖。程序運行,單擊鼠標左鍵,如圖。 窗口過程函數(shù)窗口過程函數(shù)WndProc用來接收和處理各種不同的消息,用來接收和處理各種不同的消息,WinMain函數(shù)通常要完成:函數(shù)通常要完成: 調(diào)用調(diào)用API函數(shù)函數(shù)RegisterClass注冊應用程序的窗口類。注冊應用程序的窗口類。 調(diào)用相關(guān)調(diào)用相關(guān)API函數(shù)
14、創(chuàng)建和顯示窗口,并進行必要的初始化。函數(shù)創(chuàng)建和顯示窗口,并進行必要的初始化。CreateWindow創(chuàng)建已注冊窗創(chuàng)建已注冊窗 口類的窗口。口類的窗口。Windows每一個窗口都有一些基本屬性。窗口類就是充當這些屬性的模板。每一個窗口都有一些基本屬性。窗口類就是充當這些屬性的模板。 創(chuàng)建和啟動應用程序的消息循環(huán)。創(chuàng)建和啟動應用程序的消息循環(huán)。Windows應用程序接受各種不同的消息。應用程序接受各種不同的消息。Windows系系 統(tǒng)首先將消息放入消息隊列中,應用程序的消息循環(huán)就是從應用程序的消息隊列中檢取消統(tǒng)首先將消息放入消息隊列中,應用程序的消息循環(huán)就是從應用程序的消息隊列中檢取消 息,并將消
15、息發(fā)送相應的窗口過程函數(shù)中作進一步處理。息,并將消息發(fā)送相應的窗口過程函數(shù)中作進一步處理。 如果接收到如果接收到WM_QUIT消息,則退出應用程序消息,則退出應用程序 圖圖4.2 Ex_HelloWin運行結(jié)果運行結(jié)果 3.1.1 c+的的Windows應用程序應用程序 應用程序的基本流程,如圖。應用程序的基本流程,如圖。 圖圖4.3 Windows應用程序的基本流程應用程序的基本流程 3.1.1 c+的的Windows應用程序應用程序 3.1.2 Windows編程特點編程特點 1. 消息驅(qū)動機制消息驅(qū)動機制 無論是系統(tǒng)產(chǎn)生的動作或是用戶運行應用程序產(chǎn)生的動作,無論是系統(tǒng)產(chǎn)生的動作或是用戶運
16、行應用程序產(chǎn)生的動作, 都稱為事件都稱為事件(Events)產(chǎn)生的消息產(chǎn)生的消息(Message)。在。在Windows的應的應 用程序中,也是通過用程序中,也是通過接收消息、分發(fā)消息、處理消息接收消息、分發(fā)消息、處理消息來和用戶來和用戶 進行交互的。進行交互的。 3.1.2 Windows編程特點編程特點 2. 圖形設(shè)備接口圖形設(shè)備接口(GDI) Windows則提供了一個抽象的接口,稱為圖形設(shè)備接口則提供了一個抽象的接口,稱為圖形設(shè)備接口 (Graphical Device Interface,簡稱,簡稱GDI),使得用戶直接利用,使得用戶直接利用 系統(tǒng)的系統(tǒng)的GDI函數(shù)就能方便實現(xiàn)輸入或
17、輸出。函數(shù)就能方便實現(xiàn)輸入或輸出。 3.1.2 Windows編程特點編程特點 3. 基于資源的程序設(shè)計基于資源的程序設(shè)計 如光標、菜單、工具欄、位圖、對話框等,在如光標、菜單、工具欄、位圖、對話框等,在Windows 環(huán)境下,每一個這樣的元素都作為一種可以裝入應用程序的資環(huán)境下,每一個這樣的元素都作為一種可以裝入應用程序的資 源來存放。這些資源就像源來存放。這些資源就像C+程序中的常量一樣,可以被編輯、程序中的常量一樣,可以被編輯、 修改,也可以被其他應用程序所共享。修改,也可以被其他應用程序所共享。 3.1.2 Windows編程特點編程特點 4. 動態(tài)鏈接庫動態(tài)鏈接庫 動態(tài)鏈接庫動態(tài)鏈接
18、庫提供了一些特定結(jié)構(gòu)的函數(shù),在運行過程中裝提供了一些特定結(jié)構(gòu)的函數(shù),在運行過程中裝 入和連接,本身是單獨設(shè)計編譯的,可實現(xiàn)共享。入和連接,本身是單獨設(shè)計編譯的,可實現(xiàn)共享。 Windows操作系統(tǒng)提供了豐富的動態(tài)鏈接庫,這些動態(tài)操作系統(tǒng)提供了豐富的動態(tài)鏈接庫,這些動態(tài) 鏈接庫是一些具有鏈接庫是一些具有.DLL擴展名或者有時是擴展名或者有時是.EXE擴展名的文件。擴展名的文件。 在在Windows操作系統(tǒng)中,最主要的操作系統(tǒng)中,最主要的DLL有三個模塊。其有三個模塊。其 中,中,KERNEL32用來處理存儲器低層功能、任務和資源管理用來處理存儲器低層功能、任務和資源管理 等等Windows核心服
19、務;核心服務;GDI32用來提供圖形設(shè)備接口,管理用來提供圖形設(shè)備接口,管理 用戶界面和圖形繪制;而用戶界面和圖形繪制;而USER32負責窗口的管理,包括消息、負責窗口的管理,包括消息、 菜單、光標、計時器以及其它與控制窗口顯示相關(guān)的一些功能。菜單、光標、計時器以及其它與控制窗口顯示相關(guān)的一些功能。 3.1.2 Windows編程特點編程特點 5 . 進程和線程進程和線程 進程進程是裝入內(nèi)存中正在執(zhí)行的應用程序。進程包括了一個是裝入內(nèi)存中正在執(zhí)行的應用程序。進程包括了一個 或多個在進程上下文內(nèi)運行的線程?;蚨鄠€在進程上下文內(nèi)運行的線程。線程線程是操作系統(tǒng)分配是操作系統(tǒng)分配CPU 時間的基本實體
20、。同一進程的所有線程共享同樣的虛擬地址空時間的基本實體。同一進程的所有線程共享同樣的虛擬地址空 間、全局變量和操作系統(tǒng)資源。在一個應用程序中,可以包括間、全局變量和操作系統(tǒng)資源。在一個應用程序中,可以包括 一個或多個進程,每個進程由一個或多個線程構(gòu)成。一個或多個進程,每個進程由一個或多個線程構(gòu)成。 3.1.3 Windows基本數(shù)據(jù)類型基本數(shù)據(jù)類型 表表3.1 Windows常用的基本數(shù)據(jù)類型常用的基本數(shù)據(jù)類型 3.1.3 Windows基本數(shù)據(jù)類型基本數(shù)據(jù)類型 表表3. 2 Windows常用的句柄類型常用的句柄類型 它們的類型均為它們的類型均為void *,即一個,即一個32位指針。位指針
21、。 3.2 編制一個編制一個MFC應用程序應用程序 在在Visual C+ 6.0運行運行MFC程序需要進行以下步驟:程序需要進行以下步驟: (1) 選擇選擇“文件文件”“新建新建”菜單菜單在在“工程工程”標簽頁面的列標簽頁面的列 表框中表框中選中選中Win32 Application項,創(chuàng)建一個項,創(chuàng)建一個Ex_3_2空空 應用程序。應用程序。 (2) 再次選擇再次選擇“文件文件”“新建新建”菜單命令。在文件標簽頁面菜單命令。在文件標簽頁面 左邊的列表框中選擇左邊的列表框中選擇C+ Source File項,在右邊的文件框項,在右邊的文件框 中鍵入中鍵入Ex_3_2.cpp,單擊,單擊確定確
22、定按鈕。按鈕。 (3) 輸入下面的代碼:選擇輸入下面的代碼:選擇“工程工程”“設(shè)置設(shè)置”菜單命令菜單命令在在 出現(xiàn)的對話框中選擇出現(xiàn)的對話框中選擇“General”標簽標簽在在“Microsoft Foundation Classes”組合框中選擇組合框中選擇“Use MFC in a Shared DLL”。單擊。單擊確定確定按鈕。按鈕。 (4) 程序運行后,單擊鼠標左鍵,就會彈出一個對話框。程序運行后,單擊鼠標左鍵,就會彈出一個對話框。 例例Ex_HelloMFC 一個一個MFC應用程序應用程序 #include / MFC頭文件頭文件 class CHelloApp : public C
23、WinApp/ 聲明應用程序類聲明應用程序類 public: virtual BOOL InitInstance(); ; CHelloApp theApp; / 建立應用程序類的實例建立應用程序類的實例 class CMainFrame: public CFrameWnd/聲明主窗口類聲明主窗口類 public: CMainFrame() / 創(chuàng)建主窗口創(chuàng)建主窗口 Create(NULL, 我的窗口我的窗口, WS_OVERLAPPEDWINDOW, CRect(0,0,400,300); protected: afx_msg void OnLButtonDown(UINT nFlags,
24、CPoint point);聲明消息函數(shù)聲明消息函數(shù) DECLARE_MESSAGE_MAP() ; / 消息映射入口消息映射入口 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_LBUTTONDOWN() /單擊鼠標左鍵消息的映射宏單擊鼠標左鍵消息的映射宏 END_MESSAGE_MAP() /定義消息映射函數(shù)定義消息映射函數(shù) void CMainFrame:OnLButtonDown(UINT nFlags, CPoint point) MessageBox (你好,我的你好,我的Visual C+世界!世界!, 問候問候, 0) ; CFra
25、meWnd:OnLButtonDown(nFlags, point); BOOL CHelloApp:InitInstance() / 每當應用程序首次執(zhí)行時都要調(diào)用的初始化函數(shù)每當應用程序首次執(zhí)行時都要調(diào)用的初始化函數(shù) m_pMainWnd = new CMainFrame(); m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); return TRUE; 3.2 編制一個編制一個MFC應用程序應用程序 AfxWinInit函數(shù):創(chuàng)建當前應用程序主線程 InitApplication函數(shù):初始化CWINAPP類的一些內(nèi)部
26、東西,對編程人員來說無意義 InitInstance函數(shù): 內(nèi)部通過Create()函數(shù)來完成窗口的注冊,創(chuàng)建更新和顯示。 Run函數(shù):內(nèi)部就是真正的消息循環(huán)機制了(TraslateMessage和DisPatchMessage)。 3.2.2 理解程序代碼理解程序代碼 3.2.2 理解程序代碼理解程序代碼 按照按照MFC的消息映射機制,映射一個消息的過程是由三的消息映射機制,映射一個消息的過程是由三 個部分組成的:個部分組成的: (1) 在處理消息的類中,使用消息宏在處理消息的類中,使用消息宏 DECLARE_MESSAGE_MAP聲明對消息映射的支持,并在聲明對消息映射的支持,并在 該宏之
27、前該宏之前聲明消息處理函數(shù)聲明消息處理函數(shù)。 protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() 3.2.2 理解程序代碼理解程序代碼 (2) 使用使用BEGIN_MESSAGE_MAP和和END_MESSAGE_MAP 宏在類聲明之后的地方定義該類支持的宏在類聲明之后的地方定義該類支持的消息映射入口點,所消息映射入口點,所 有消息映射宏有消息映射宏都添加在這里,當然不同的消息都添加在這里,當然不同的消息MFC都會有都會有 不同的消息映射宏。不同的消息映射宏。 BEGIN
28、_MESSAGE_MAP(CMainFrame, CFrameWnd) END_MESSAGE_MAP() 其中,其中,BEGIN_MESSAGE_MAP帶有兩個參數(shù),第一個參數(shù)用帶有兩個參數(shù),第一個參數(shù)用 來指定需要支持消息映射的用戶派生類,第二個參數(shù)指定該類來指定需要支持消息映射的用戶派生類,第二個參數(shù)指定該類 的基類。的基類。 3.2.2 理解程序代碼理解程序代碼 (3) 定義消息處理函數(shù)定義消息處理函數(shù) void CMainFrame:OnLButtonDown(UINT nFlags, CPoint point) MessageBox (你好,我的你好,我的Visual C+世界!世
29、界!, 問候問候, 0) ; CFrameWnd:OnLButtonDown(nFlags, point); 3.2.2 理解程序代碼理解程序代碼 附:添加右鍵消息映射函數(shù)附:添加右鍵消息映射函數(shù) void CMainFrame:OnRButtonDown(UINT nFlags, CPoint point) CString str; CTime time=CTime:GetCurrentTime(); str.Format(%d時時%d分分%d秒秒, time.GetHour(),time.GetMinute(),time.GetSecond(); MessageBox (str, syst
30、em time, 0); CFrameWnd:OnRButtonDown(nFlags, point); 3.3 使用使用MFC AppWizard 3.3.1 應用程序框架類型應用程序框架類型 這些類型基本滿足了各個層次的用戶的需要,但一般這些類型基本滿足了各個層次的用戶的需要,但一般 地,用戶更關(guān)心的是地,用戶更關(guān)心的是MFC AppWizard(exe)應用程序框架,應用程序框架, 因為它包含用戶最常用、最基本的三種應用程序類型:因為它包含用戶最常用、最基本的三種應用程序類型:單文單文 檔、多文檔和基于對話框檔、多文檔和基于對話框的應用程序。的應用程序。 3.3 使用使用MFC AppW
31、izard 表表3.3 MFC AppWizard創(chuàng)建的應用程序類型創(chuàng)建的應用程序類型 3.3.2 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序 1. 開始開始 選擇選擇“文件文件”“新建新建”菜單,在彈出的菜單,在彈出的“新建新建”對話對話 框中,可以看到工程標簽頁面中,顯示出一系列的應用程序框中,可以看到工程標簽頁面中,顯示出一系列的應用程序 項目類型;選擇項目類型;選擇MFC AppWizard(exe)的項目類型,將項目的項目類型,將項目 工作文件夾定位在工作文件夾定位在“D:Visual C+ 6.0程序程序”,并在工程編,并在工程編 輯框中輸入項目名輯框中輸入項目名Ex_SDIHe
32、llo。 3.3.2 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序 2. 第一步第一步 確定確定,出現(xiàn)如圖所示的對話框:,出現(xiàn)如圖所示的對話框: 從單個文檔從單個文檔(SDI)、多重文檔、多重文檔(MDI)和基本對話框中選擇和基本對話框中選擇“單單 個文檔個文檔”。 決定應用程序中是否需要決定應用程序中是否需要MFC的文檔視圖的文檔視圖(“文檔文檔/查看體系查看體系 結(jié)構(gòu)支持結(jié)構(gòu)支持”)結(jié)構(gòu)的支持。一般情況下,應選中此項。結(jié)構(gòu)的支持。一般情況下,應選中此項。 選擇資源所使用的語言,這里是選擇資源所使用的語言,這里是“中文中文中國中國”。 3.3.2 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序
33、 3.第二步第二步 如圖如圖3.7所示的對話框,讓用戶選擇程序中是否加入所示的對話框,讓用戶選擇程序中是否加入數(shù)據(jù)庫數(shù)據(jù)庫 的支持的支持(以后介紹以后介紹)。 3.3.2 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序 4.第三步第三步 如圖所示。允許用戶在程序中加入如圖所示。允許用戶在程序中加入復合文檔、自動化、復合文檔、自動化、 ActiveX控件的支持控件的支持。 3.3.2 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序 5. 第四步第四步 如圖所示,前幾項依次確定對如圖所示,前幾項依次確定對浮動工具條、打印與預覽浮動工具條、打印與預覽 以及通信等特性以及通信等特性支持。支持。 3.3.2
34、 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序 6. 第五步第五步 如圖所示,這里出現(xiàn)三個方面的選項,供用戶來選擇:如圖所示,這里出現(xiàn)三個方面的選項,供用戶來選擇: (1) 應用程序的主窗口是應用程序的主窗口是MFC標準風格還是窗口左邊有切分窗標準風格還是窗口左邊有切分窗 口瀏覽器風格;口瀏覽器風格; (2) 在源文件中是否加入注釋用來引導用戶編寫程序代碼;在源文件中是否加入注釋用來引導用戶編寫程序代碼; (3) 使用動態(tài)鏈接庫還是靜態(tài)鏈接庫。使用動態(tài)鏈接庫還是靜態(tài)鏈接庫。 3.3.2 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序 7. 第六步第六步 如圖所示。用戶可以對如圖所示。用戶可以對M
35、FC AppWizard提供的默認提供的默認類名、類名、 基類名、各個源文件基類名、各個源文件名進行修改。名進行修改。完成完成 ,單擊,單擊確定確定按鈕系按鈕系 統(tǒng)開始創(chuàng)建,并又回到了統(tǒng)開始創(chuàng)建,并又回到了Visual C+ 6.0的主界面。的主界面。 3.3.2 創(chuàng)建一個單文檔應用程序創(chuàng)建一個單文檔應用程序 8.編譯并運行編譯并運行 用戶雖然沒有編寫任何程序代碼,但用戶雖然沒有編寫任何程序代碼,但MFC AppWizard已已 經(jīng)根據(jù)用戶的選擇內(nèi)容自動生成基本的應用程序框架。單擊運經(jīng)根據(jù)用戶的選擇內(nèi)容自動生成基本的應用程序框架。單擊運 行按鈕行按鈕“”“”或按快捷鍵或按快捷鍵Ctrl+F5,
36、系統(tǒng)開始編連并運行生成的,系統(tǒng)開始編連并運行生成的 可執(zhí)行文件可執(zhí)行文件Ex_SDIHello.exe,如圖所示。,如圖所示。 菜單欄菜單欄 工具欄工具欄 狀態(tài)欄狀態(tài)欄 標題欄標題欄 文檔窗文檔窗 口口 3.3.3 MFC應用程序項目組織應用程序項目組織 1. 項目的文件組織項目的文件組織 在在Visual C+ 6.0中,項目中所有的源文件都是采用中,項目中所有的源文件都是采用 文件夾的方式進行管理的,它將項目名作為文件夾名,在文件夾的方式進行管理的,它將項目名作為文件夾名,在 此文件夾下包含源程序代碼文件此文件夾下包含源程序代碼文件(.cpp 和和 .h)、項目文件、項目文件 (.dsp)
37、以及項目工作區(qū)文件以及項目工作區(qū)文件(.dsw)等。等。 除了上述文件外,還有相應的除了上述文件外,還有相應的Debug(調(diào)試調(diào)試)或或 Release(發(fā)行發(fā)行)、Res(資源資源)等子文件夾。當然,不同類型等子文件夾。當然,不同類型 的項目的文件類型及數(shù)目會有所不同。的項目的文件類型及數(shù)目會有所不同。 3.3.3 MFC應用程序項目組織應用程序項目組織 3.3.3 MFC應用程序項目組織應用程序項目組織 表表3.4 Visual C+ 6.0文件類型的含義文件類型的含義 3.3.3 MFC應用程序項目組織應用程序項目組織 2. MFC類結(jié)構(gòu)類結(jié)構(gòu) 項目工作區(qū)窗口包含項目工作區(qū)窗口包含3個頁
38、面,它們分別是個頁面,它們分別是ClassView頁、頁、 ResourceView頁和頁和FileView頁,通過單擊項目區(qū)窗口底部的頁,通過單擊項目區(qū)窗口底部的 頁面標簽進行切換。頁面標簽進行切換。 將將Visual C+ 6.0項目工作區(qū)窗口切換到項目工作區(qū)窗口切換到ClassView頁面,頁面, 可以看到可以看到MFC為單文檔應用程序項目為單文檔應用程序項目Ex_SDIHello自動創(chuàng)建自動創(chuàng)建 了類了類CAboutDlg、CEx_SDIHelloApp、 CEx_SDIHelloDoc、 CEx_SDIHelloView和和CMainFrame。這些。這些MFC類之間的繼類之間的繼
39、承和派生關(guān)系如圖所示。承和派生關(guān)系如圖所示。 3.3.3 MFC應用程序項目組織應用程序項目組織 3.3.3 MFC應用程序項目組織應用程序項目組織 3.4 使用類向?qū)褂妙愊驅(qū)?MFC類向?qū)ь愊驅(qū)?ClassWizard)是是Visual C+ 6.0中又一個中又一個 非常有用的工具。它能自動為一個項目添加一個非常有用的工具。它能自動為一個項目添加一個類類、進行、進行 消息和數(shù)據(jù)映射消息和數(shù)據(jù)映射、創(chuàng)建、創(chuàng)建OLE Automation (自動化自動化)屬性和方屬性和方 法法以及進行以及進行ActiveX事件處理事件處理等。等。 3.4.1 類向?qū)Ц攀鲱愊驅(qū)Ц攀?(1) 選擇選擇“查看查看”
40、“建立類向?qū)Ы㈩愊驅(qū)А辈藛位蛑苯邮褂貌藛位蛑苯邮褂肅trl+W快捷快捷 鍵。鍵。 (2) 在源代碼文件的文檔編輯窗口中,在源代碼文件的文檔編輯窗口中,右擊鼠標右擊鼠標,快捷菜單中,快捷菜單中 “建立類向?qū)Ы㈩愊驅(qū)А薄?Message Maps(消息映射消息映射):用:用 來添加、刪除和編程處理。來添加、刪除和編程處理。 Member Variables(成員變量成員變量): 添加或刪除與控件相關(guān)聯(lián)的成員添加或刪除與控件相關(guān)聯(lián)的成員 變量變量(或稱數(shù)據(jù)成員或稱數(shù)據(jù)成員) 。 Automation(自動化自動化):為支持:為支持 Automation的類的類(如如ActiveX控控 件類件類)
41、添加屬性和方法。添加屬性和方法。 ActiveX Events(ActiveX事件事件): 為為ActiveX控件類添加觸發(fā)事件控件類添加觸發(fā)事件 的支持。的支持。 Class Info(類信息類信息) 3.4.2 類的添加和刪除類的添加和刪除 1. 類的添加類的添加 選擇選擇“工程工程”“添加工程添加工程”“Files”菜單命令,可將菜單命令,可將 外部源文件所定義的類添加到項目外部源文件所定義的類添加到項目中;從大多數(shù)中;從大多數(shù)MFC類中類中派生派生 一個類,并且創(chuàng)建的類代碼自動包含一個類,并且創(chuàng)建的類代碼自動包含MFC所必需的消息映射等所必需的消息映射等 機制。機制。 3.4.2 類的
42、添加和刪除類的添加和刪除 啟動啟動MFC ClassWizard。單擊。單擊Add Class按鈕,選擇按鈕,選擇 New命令。命令。 對話框中,對話框中,Name是用來輸入用戶定義的類名,注意要以是用來輸入用戶定義的類名,注意要以 “C”字母打頭;字母打頭;File Name是該類的源代碼文件名,單擊是該類的源代碼文件名,單擊 Change按鈕可改變源文件名稱及其在磁盤中的位置;按鈕可改變源文件名稱及其在磁盤中的位置; Base class用來指定該類的基類;用來指定該類的基類;Dialog ID是當選擇是當選擇 CDialog作為基類時指定對話框的資源作為基類時指定對話框的資源ID號。最下
43、面的號。最下面的 Automation是用來設(shè)置對自動化的支持。是用來設(shè)置對自動化的支持。 單擊單擊OK按鈕,一個新類就會自動添加到項目中。按鈕,一個新類就會自動添加到項目中。 3.4.2 類的添加和刪除類的添加和刪除 2. 類的刪除類的刪除 將將Visual C+ 6.0打開的所有文檔窗口關(guān)閉。打開的所有文檔窗口關(guān)閉。 將將項目工作區(qū)窗口項目工作區(qū)窗口切換到切換到FileView頁面,展開頁面,展開Source Files和和 Header Files結(jié)點,分別選定要刪除類的對應結(jié)點,分別選定要刪除類的對應.h和和.cpp文件,文件, 按下按下Delete鍵,刪除這兩個文件。鍵,刪除這兩個文
44、件。 選擇選擇“文件文件”“關(guān)閉工作區(qū)關(guān)閉工作區(qū)”菜單命令,關(guān)閉項目。菜單命令,關(guān)閉項目。 從實際的文件夾中刪除對應的從實際的文件夾中刪除對應的.h和和.cpp文件與文件與.clw文件。文件。 3.4.2類的添加和刪除類的添加和刪除 注意:注意: 這樣,當調(diào)入項目文件后,按這樣,當調(diào)入項目文件后,按Ctrl+W快捷鍵就會彈出一個對快捷鍵就會彈出一個對 話框,詢問是否重新建立話框,詢問是否重新建立ClassWizard數(shù)據(jù)文件,單擊數(shù)據(jù)文件,單擊是是按按 鈕鈕,出現(xiàn)如圖所示的,出現(xiàn)如圖所示的Select Source Files對話框。單擊右下對話框。單擊右下 的的Add All按鈕即可將按鈕即
45、可將.h和和.cpp所包含的類刪除。所包含的類刪除。 3.4.2 消息和消息映射消息和消息映射 1. 消息分類消息分類 (1)窗口消息窗口消息(Windows message): 由由WM_開頭的消息開頭的消息(WM_ COMMAND除外除外),一般由窗口類和視圖類,一般由窗口類和視圖類 對象來處理。窗口消息往往帶有參數(shù),以標志處理消息的方法。窗對象來處理。窗口消息往往帶有參數(shù),以標志處理消息的方法。窗 口消息一般與窗口內(nèi)部運作有關(guān),如創(chuàng)建窗口,繪制窗口,銷毀窗口消息一般與窗口內(nèi)部運作有關(guān),如創(chuàng)建窗口,繪制窗口,銷毀窗 口,通常,消息是從系統(tǒng)發(fā)到窗口,或從窗口發(fā)到系統(tǒng)口,通常,消息是從系統(tǒng)發(fā)到
46、窗口,或從窗口發(fā)到系統(tǒng). 宏名稱 對應消息 消息處理函數(shù) ON_WM_CHAR WM_CHAR OnChar ON_WM_CLOSE WM_CLOSE OnClose ON_WM_CREATE WM_CREATE OnCreate ON_WM_DESTROY WM_DESTROY OnDestroy ON_WM_LBUTTONDOWN WM_LBUTTONDOWN OnLButtonDown ON_WM_LBUTTONUP WM_LBUTTONUP OnLButtonUp ON_WM_MOUSEMOVE WM_MOUSEMOVE OnMouseMove ON_WM_PAINTWM_PAINT
47、OnPaint 3.4.2 消息和消息映射消息和消息映射 (2)命令消息命令消息(Command message): 如 菜 單 、 工 具 條 的 按 鈕 、 快 捷 鍵 等 發(fā) 送 的如 菜 單 、 工 具 條 的 按 鈕 、 快 捷 鍵 等 發(fā) 送 的 WM_COMMAND通知消息。通知消息。 命令消息的處理方式與其他兩種消息命令消息的處理方式與其他兩種消息不同不同,它能夠被,它能夠被 多種對象接收、處理,這些對象包括文檔類、文檔模板類、多種對象接收、處理,這些對象包括文檔類、文檔模板類、 應用程序本身以及窗口和視類等;而窗口消息和控件的通應用程序本身以及窗口和視類等;而窗口消息和控件的
48、通 知消息是由窗口對象接收并處理的,這里的窗口對象是指知消息是由窗口對象接收并處理的,這里的窗口對象是指 從從CWnd中派生的類的對象,它包括中派生的類的對象,它包括CFrameWnd、 CMDIFrameWnd、CMDIChildWnd、CView、CDialog以以 及從這些類派生的對象等。及從這些類派生的對象等。 命令消息通常與處理用戶請求有關(guān),當用戶單擊一個菜命令消息通常與處理用戶請求有關(guān),當用戶單擊一個菜 單或工具欄時,命令消息就產(chǎn)生了。并發(fā)送到能處理該消息單或工具欄時,命令消息就產(chǎn)生了。并發(fā)送到能處理該消息 的類或函數(shù)(如裝載文本,保存選項等)這類消息都以的類或函數(shù)(如裝載文本,保
49、存選項等)這類消息都以 WM_COMMAND呈現(xiàn)。在呈現(xiàn)。在MFC中,通過菜單標識(中,通過菜單標識(ID)來區(qū))來區(qū) 分不同的命令消息;在分不同的命令消息;在SDK中,通過消息的中,通過消息的wParam參數(shù)識別。參數(shù)識別。 從從CCmdTarget派生的類,都可以接收到這類消息,其派生的類,都可以接收到這類消息,其 wParam 記錄著該消息來自哪一個菜單項目。記錄著該消息來自哪一個菜單項目。 ON_COMMAND(IDM_ABOUT, OnAbout) ON_COMMAND(IDM_FILENEW, OnFileNew) ON_COMMAND(IDM_FILEOPEN, OnFileOp
50、en) ON_COMMAND(IDM_FILESAVE, OnFileSave) 3.4.2 消息和消息映射消息和消息映射 (3)控件的通知消息控件的通知消息(Control notifications): 當控件的狀態(tài)發(fā)生改變時,控件就會向其父窗口發(fā)送當控件的狀態(tài)發(fā)生改變時,控件就會向其父窗口發(fā)送 WM_COMMAND通知消息。由控件產(chǎn)生的消息,例如通知消息。由控件產(chǎn)生的消息,例如,按鈕按鈕 的單擊,列表框的選擇等均產(chǎn)生此類消息,為的是向其父窗的單擊,列表框的選擇等均產(chǎn)生此類消息,為的是向其父窗 口通(通常是對話框)通知事件的發(fā)生。這類消息也是以口通(通常是對話框)通知事件的發(fā)生。這類消息也
51、是以 WM_COMMAND形式呈現(xiàn)。從形式呈現(xiàn)。從CCmdTarget派生的類都可派生的類都可 以接收到這類消息。以接收到這類消息。 3.4.2 消息和消息映射消息和消息映射 控件宏 消息處理函數(shù) Button ON_BN_CLICKED(,) memberFxn ComboBox ON_CBN_DBLCLK(,) memberFxn Edit ON_EN_SETFOCUS(,) memberFxn ListBox ON_LBN_DBLCLK(,) memberFxn 3.4.2 消息和消息映射消息和消息映射 (1) 按按Ctrl+W快捷鍵打開快捷鍵打開MFC ClassWizard對話框。對
52、話框。 (2) 在在Class name組合框中,將類名選定為組合框中,將類名選定為 CEx_SDIHelloView。Object IDs和和Messages列表內(nèi)容會列表內(nèi)容會 相應的改變。相應的改變。 (3) 在在Object IDs列表框中選定列表框中選定CEx_SDIHelloView,而在,而在 Messages列表中選定列表中選定WM_LBUTTOMDOWN消息。消息。 2. 步驟步驟 3.4.2 消息和消息映射消息和消息映射 (4) 雙擊雙擊Messages列表列表中的中的WM_LBUTTOMDOWN消息或消息或單單 擊擊Add Function按鈕,都會在按鈕,都會在CEx_
53、SDIHelloView類中類中 添加該消息的映射函數(shù)。添加該消息的映射函數(shù)。 (5) 單擊單擊Edit Code按鈕后,按鈕后,ClassWizard對話框退出,并對話框退出,并 轉(zhuǎn)向文檔窗口,定位到轉(zhuǎn)向文檔窗口,定位到OnLButtonDown函數(shù)源代碼處。函數(shù)源代碼處。 (6) 添加下列代碼:添加下列代碼: void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CPoint point) MessageBox (你好,我的你好,我的Visual C+世界!世界!, 問候問候, 0) ; CView:OnLButtonDown(nFlags, p
54、oint); 3.4.2 消息和消息映射消息和消息映射 (7) 完成了一個消息映射過程。運行。完成了一個消息映射過程。運行。 3.4.2 消息和消息映射消息和消息映射 3. 消息映射代碼消息映射代碼 ClassWizard為為WM_LBUTTOMDOWN的消息映射作了的消息映射作了三個三個 方面方面內(nèi)容的安排:內(nèi)容的安排: (1) 在在Ex_SDIHelloView.h中中聲明消息處理函數(shù)聲明消息處理函數(shù)OnLButtonDown protected: /AFX_MSG(CEx_SDIHelloView) afx_msg void OnLButtonDown(UINT nFlags, CPoi
55、nt point); /AFX_MSG DECLARE_MESSAGE_MAP() 3.4.2 消息和消息映射消息和消息映射 (2) 在在Ex_SDIHelloView.cpp前面的前面的消息映射入口處消息映射入口處,添加了,添加了 相應的映射宏:相應的映射宏: BEGIN_MESSAGE_MAP(CEx_SDIHelloView, CView)/ 消息映射開始消息映射開始 /AFX_MSG_MAP(CEx_SDIHelloView) ON_WM_LBUTTONDOWN() /AFX_MSG_MAP END_MESSAGE_MAP() / 消息映射結(jié)束消息映射結(jié)束 3.4.2 消息和消息映射消
56、息和消息映射 (3) 在在Ex_SDIHelloView.cpp寫入消息處理函數(shù)的寫入消息處理函數(shù)的模板模板,用戶,用戶 填入具體代碼:填入具體代碼: void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CView:OnLButtonDown(nFlags, point); 3.4.2 消息和消息映射消息和消息映射 4. 鍵盤消息鍵盤消息 afx_msg void OnKeyDown( UINT
57、nChar, UINT nRepCnt, UINT nFlags ); afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags ); afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ); nChar:虛擬鍵代碼;:虛擬鍵代碼;nRepCnt:當按住一個鍵時的重復計數(shù);:當按住一個鍵時的重復計數(shù); nFlags:擊鍵消息標志。:擊鍵消息標志。 虛擬鍵代碼虛擬鍵代碼:是指與設(shè)備無關(guān)的鍵盤編碼。在:是指與設(shè)備無關(guān)的鍵盤編碼。在Visual C+中,最中,最 常用的虛擬
58、鍵代碼已被定義在常用的虛擬鍵代碼已被定義在Winuser.h中,例如:中,例如:VK_SHIFT 表示表示SHIFT鍵,鍵,VK_F1表示功能鍵表示功能鍵F1等。等。 3.4.2 消息和消息映射消息和消息映射 5. 鼠標消息鼠標消息 LBUTTON(左左)、MBUTTON(中中)和和RBUTTON(右右) 3.4.2 消息和消息映射消息和消息映射 MK_CONTROL 鍵盤上的鍵盤上的Ctrl鍵被按下鍵被按下 MK_LBUTTON 鼠標左按鈕被按下鼠標左按鈕被按下 MK_MBUTTON 鼠標中按鈕被按下鼠標中按鈕被按下 MK_RBUTTON 鼠標右按鈕被按下鼠標右按鈕被按下 MK_SHIFT
59、鍵盤上的鍵盤上的Shift鍵被按下鍵被按下 若收到了若收到了WM_LBUTTONDOWN消息,且值消息,且值nFlags 其中,其中,point表示鼠標光標在屏幕的表示鼠標光標在屏幕的(x,y)坐標;坐標;nFlags表示表示 鼠標按鈕和鍵盤組合情況,它可以是下列值的組合鼠標按鈕和鍵盤組合情況,它可以是下列值的組合(MK前綴表前綴表 示示“鼠標鍵鼠標鍵”): 3.4.2 消息和消息映射消息和消息映射 6. 計時器消息計時器消息 是通過是通過CWnd的的SetTimer函數(shù)來設(shè)置并啟動計時器的。函數(shù)來設(shè)置并啟動計時器的。 UINT SetTimer( UINT nIDEvent, UINT nE
60、lapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) ); nIDEvent:指定該計時器的標識值:指定該計時器的標識值(不能為不能為0),當應用程序需要多個,當應用程序需要多個 計時器時可多次調(diào)用該函數(shù),但計時器時可多次調(diào)用該函數(shù),但每一個計時器的標識值應是唯一的每一個計時器的標識值應是唯一的。 nElapse:計時器的時間間隔:計時器的時間間隔(單位為單位為毫秒毫秒)。 lpfnTimer:是一個回調(diào)函數(shù)的指針,該函數(shù)由應用程序來定義,用是一個回調(diào)函數(shù)的指針,該函數(shù)由應用程序來定義,用 來處理計時器來處理計時器W
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 精裝臥室出租合同范本
- OEM加工食品合同范例
- 公路路燈安裝合同范例
- 兼職導游勞務合同范本
- 醫(yī)院廣告合同范本
- 合肥裝潢公司合同范本
- 單位長期租車合同范本
- 單位出讓房屋合同范例
- 制作安裝供貨合同范本
- 后增補協(xié)議合同范本
- 《抖音高活躍群體研究報告》
- 2025年高考作文備考訓練之二元思辨作文題目解析及范文:我與“別人”
- 《中央集成式商用車電驅(qū)動橋總成技術(shù)要求及臺架試驗方法》
- 2024年江西應用工程職業(yè)學院單招職業(yè)技能測試題庫標準卷
- 第1課 中國古代政治制度的形成與發(fā)展 課件-歷史統(tǒng)編版(2019)選擇性必修1國家制度與社會治理
- 2025年中國中煤校園招聘筆試參考題庫含答案解析
- 開曼群島公司法2024版中文譯本(含2024年修訂主要內(nèi)容)
- 東北師大附屬中學2025屆高考數(shù)學四模試卷含解析
- 漏采血標本不良事件根因分析
- 安全管理工作的成果與亮點
- 糧食儲備庫內(nèi)圓筒鋼板倉及附房工程施工組織設(shè)計
評論
0/150
提交評論