版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第3章 MFC基本應(yīng)用程序的建立,3.1 Windows編程基礎(chǔ)編制一個(gè)功能強(qiáng)大和易操作的Windows應(yīng)用程序所需要的代碼肯定會(huì)比一般的C++程序要多得多,但并不是所有的代碼都需要自己從頭開(kāi)始編寫,因?yàn)閂isual C++不僅提供了常用的Windows應(yīng)用程序的基本框架,而且可以在框架程序中直接調(diào)用Win32 API(Application Programming Interface, 應(yīng)用程序接口)函數(shù)。這樣,用戶僅需要在相應(yīng)
2、的框架位置中添加自己的代碼或修改部分代碼就可實(shí)現(xiàn)Windows應(yīng)用程序的許多功能。,3.1.1 簡(jiǎn)單的Windows應(yīng)用程序,先來(lái)看一個(gè)最簡(jiǎn)單的Windows應(yīng)用程序Ex_HelloMsg。[例Ex_HelloMsg] 一個(gè)簡(jiǎn)單的Windows應(yīng)用程序#include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,
3、int nCmdShow){ MessageBox (NULL, "你好,我的Visual C++世界!", "問(wèn)候", 0) ; return 0 ;}在Visual C++ 6.0運(yùn)行上述程序需要進(jìn)行以下步驟:(1) 選擇“文件”→“新建”菜單命令,顯示出“新建”對(duì)話框。在“工程”標(biāo)簽頁(yè)面的列表框中,選中Win32 Application項(xiàng)。,(2) 在工程編輯框中
4、鍵入Win32應(yīng)用程序項(xiàng)目名稱Ex_HelloMsg。在“位置”編輯框中直接鍵入文件夾名稱,或單擊瀏覽按鈕選擇一個(gè)已有的文件夾。(3) 單擊[確定]按鈕繼續(xù)。一個(gè)詢問(wèn)項(xiàng)目類型的Win32應(yīng)用程序向?qū)⒈伙@示,選中An empty project項(xiàng)。單擊[完成]按鈕,系統(tǒng)將顯示該應(yīng)用程序向?qū)У膭?chuàng)建信息,單擊[確定]按鈕系統(tǒng)將自動(dòng)創(chuàng)建此應(yīng)用程序。(4) 再次選擇“文件”→“新建”菜單命令,顯示出“新建”對(duì)話框。在“文件”標(biāo)簽頁(yè)面左邊的列
5、表框中選擇C++ Source File項(xiàng),在右邊的文件框中鍵入Ex_HelloMsg.cpp,單擊[確定]按鈕。,3.1.1 簡(jiǎn)單的Windows應(yīng)用程序,[例Ex_HelloMsg] 一個(gè)簡(jiǎn)單的Windows應(yīng)用程序(5) 輸入上面的代碼,運(yùn)行程序,結(jié)果如圖3.1所示。從上面的程序可以看出:● C++控制臺(tái)應(yīng)用程序以main函數(shù)作為進(jìn)入程序的初始入口點(diǎn),但在Windows應(yīng)用程序中,main主函數(shù)被WinMain函數(shù)取代。Wi
6、nMain函數(shù)的原型如下:int WINAPI WinMain (HINSTANCE hInstance, // 當(dāng)前實(shí)例句柄HINSTANCE hPrevInstance, // 前一實(shí)例句柄LPSTR lpCmdLine, // 指向命令行參數(shù)的指針int nCmdShow) // 窗口的顯示狀態(tài),3.1.1 簡(jiǎn)單的Windows應(yīng)用程序,所謂句柄是一個(gè)標(biāo)識(shí)Windows資源(如菜單、圖標(biāo)、窗口等)和設(shè)備等
7、對(duì)象的數(shù)據(jù)指針類型。通常,一個(gè)句柄變量可用來(lái)對(duì)系統(tǒng)中某些資源的間接引用?!衩恳粋€(gè)C++ Windows應(yīng)用程序都需要Windows.h頭文件,它還包含了其他的一些Windows頭文件。這些頭文件定義了Windows的所有數(shù)據(jù)類型、函數(shù)調(diào)用、數(shù)據(jù)結(jié)構(gòu)和符號(hào)常量?!癯绦蛑?,MessageBox是一個(gè)Win32 API函數(shù),用來(lái)彈出一個(gè)消息對(duì)話框。該函數(shù)第一個(gè)參數(shù)用來(lái)指定父窗口句柄,即對(duì)話框所在的窗口句柄。第二、三個(gè)參數(shù)分別用來(lái)指定顯示的
8、消息內(nèi)容和對(duì)話框窗口的標(biāo)題,最后一個(gè)參數(shù)用來(lái)指定在對(duì)話框中顯示的按鈕。,3.1.1 簡(jiǎn)單的Windows應(yīng)用程序,[例Ex_HelloWin] 一個(gè)完整的Windows應(yīng)用程序#include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);// 窗口過(guò)程int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevIn
9、stance, LPSTR lpCmdLine, int nCmdShow){ HWND hwnd ;// 窗口句柄 MSG msg ;// 消息 WNDCLASSwndclass ;// 窗口類 wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndc
10、lass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndc
11、lass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = "HelloWin";// 窗口
12、類名 if (!RegisterClass (&wndclass)),{// 注冊(cè)窗口 MessageBox (NULL, "窗口注冊(cè)失敗!", "HelloWin", 0) ; return 0 ;} hwnd = CreateWindow ("HelloWin", /
13、/ 窗口類名 "我的窗口",// 窗口標(biāo)題 WS_OVERLAPPEDWINDOW, // 窗口樣式 CW_USEDEFAULT, // 窗口最初的 x 位置 CW_USE
14、DEFAULT, // 窗口最初的 y 位置 CW_USEDEFAULT, // 窗口最初的 x 大小 CW_USEDEFAULT, // 窗口最初的 y 大小 NULL,
15、 // 父窗口句柄 NULL, // 窗口菜單句柄 hInstance, // 應(yīng)用程序?qū)嵗浔?NULL) ; // 創(chuàng)建窗口的參數(shù) S
16、howWindow (hwnd, nCmdShow) ;// 顯示窗口 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) ;/
17、/ 轉(zhuǎn)換某些鍵盤消息 DispatchMessage (&msg) ;// 將消息發(fā)送給窗口過(guò)程,這里是WndProc },} return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ switch (message)
18、 {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)生的消息
19、 PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; // 執(zhí)行默認(rèn)的消息處理},3.1.1 簡(jiǎn)單的Windows應(yīng)用程序,[例Ex_HelloWin] 一個(gè)完整的Windows應(yīng)用程序程序運(yùn)行后,單擊鼠標(biāo)左鍵,就會(huì)彈出一個(gè)對(duì)話框,結(jié)果如圖3.2所示。,圖3.2
20、 Ex_HelloWin運(yùn)行結(jié)果,3.1.1 簡(jiǎn)單的Windows應(yīng)用程序,窗口過(guò)程函數(shù)WndProc用來(lái)接收和處理各種不同的消息,而主函數(shù)WinMain通常要完成以下幾步工作:(1) 調(diào)用API函數(shù)RegisterClass注冊(cè)應(yīng)用程序的窗口類。(2) 調(diào)用相關(guān)API函數(shù)創(chuàng)建和顯示窗口,并進(jìn)行其它必要的初始化處理。其中,函數(shù)CreateWindow用來(lái)創(chuàng)建已注冊(cè)窗口類的窗口。Windows每一個(gè)窗口都有一些基本屬性,如窗口標(biāo)題、
21、窗口位置和大小、應(yīng)用程序圖標(biāo)、鼠標(biāo)指針、菜單和背景顏色等。窗口類就是充當(dāng)這些屬性的模板。(3) 創(chuàng)建和啟動(dòng)應(yīng)用程序的消息循環(huán)。Windows應(yīng)用程序接受各種不同的消息,包括鍵盤消息、鼠標(biāo)以及窗口產(chǎn)生的各種消息。Windows系統(tǒng)首先將消息放入消息隊(duì)列中,應(yīng)用程序的消息循環(huán)就是從應(yīng)用程序的消息隊(duì)列中檢取消息,并將消息發(fā)送相應(yīng)的窗口過(guò)程函數(shù)中作進(jìn)一步處理。API函數(shù)GetMessage 和DispatchMessage就是起到這樣的作用。
22、(4) 如果接收到WM_QUIT消息,則退出應(yīng)用程序。,3.1.1 簡(jiǎn)單的Windows應(yīng)用程序,圖3.3 Windows應(yīng)用程序的基本流程,3.1.2 Windows編程特點(diǎn),一個(gè)完整的Windows應(yīng)用程序除了WinMain函數(shù)外,還包含用于處理用戶動(dòng)作和窗口消息的窗口函數(shù)。這不同于一個(gè)C++的控制臺(tái)應(yīng)用程序,可以將整個(gè)程序包含在main函數(shù)中。事實(shí)上,它們的區(qū)別還遠(yuǎn)不止這些,不久還會(huì)發(fā)現(xiàn)一個(gè)Windows應(yīng)用程序還常常具有這
23、樣的一些特性:● 消息驅(qū)動(dòng)機(jī)制●圖形設(shè)備接口(GDI)●基于資源的程序設(shè)計(jì)●動(dòng)態(tài)鏈接庫(kù)●進(jìn)程和線程,3.1.2 Windows編程特點(diǎn),1. 消息驅(qū)動(dòng)機(jī)制在Windows操作環(huán)境中,無(wú)論是系統(tǒng)產(chǎn)生的動(dòng)作或是用戶運(yùn)行應(yīng)用程序產(chǎn)生的動(dòng)作,都稱為事件(Events)產(chǎn)生的消息(Message)。例如,在Windows 桌面(傳統(tǒng)風(fēng)格)上,雙擊應(yīng)用程序的快捷圖標(biāo),系統(tǒng)就會(huì)執(zhí)行該應(yīng)用程序。在Windows的應(yīng)用程序中,也是通過(guò)接收消
24、息、分發(fā)消息、處理消息來(lái)和用戶進(jìn)行交互的。這種消息驅(qū)動(dòng)的機(jī)制是Windows編程的最大特點(diǎn)。需要注意的是,許多Windows消息都經(jīng)過(guò)了嚴(yán)格的定義,并且適用于所有的應(yīng)用程序。例如,當(dāng)用戶按下鼠標(biāo)的左鍵時(shí)系統(tǒng)就會(huì)發(fā)送WM_LBUTTONDOWN消息,而當(dāng)用戶敲了一個(gè)字符鍵時(shí)系統(tǒng)就會(huì)發(fā)送WM_CHAR消息,若用戶進(jìn)行菜單選擇或工具按鈕單擊等操作時(shí),系統(tǒng)又會(huì)相應(yīng)地發(fā)送WM_COMMAND消息給相應(yīng)的窗口等等。,3.1.2 Windows編程
25、特點(diǎn),2. 圖形設(shè)備接口(GDI)在傳統(tǒng)的DOS環(huán)境中,想要在打印機(jī)上打印一幅圖形是一件非常復(fù)雜的事情,因?yàn)橛脩舯仨毟鶕?jù)打印機(jī)類型和指令規(guī)則向打印機(jī)輸送數(shù)據(jù)。而Windows則提供了一個(gè)抽象的接口,稱為圖形設(shè)備接口(Graphical Device Interface,簡(jiǎn)稱GDI),使得用戶直接利用系統(tǒng)的GDI函數(shù)就能方便實(shí)現(xiàn)輸入或輸出,而不必關(guān)心與系統(tǒng)相連的外部設(shè)備的類型。3. 基于資源的程序設(shè)計(jì)Windows應(yīng)用程序常常包
26、含眾多圖形元素,例如光標(biāo)、菜單、工具欄、位圖、對(duì)話框等,在Windows環(huán)境下,每一個(gè)這樣的元素都作為一種可以裝入應(yīng)用程序的資源來(lái)存放。這些資源就像C++程序中的常量一樣,可以被編輯、修改,也可以被其他應(yīng)用程序所共享。Visual C++ 6.0中就提供這樣的編輯器,可“所見(jiàn)即所得”地對(duì)這些不同類型的資源進(jìn)行設(shè)計(jì)、編輯等。,3.1.2 Windows編程特點(diǎn),4. 動(dòng)態(tài)鏈接庫(kù)動(dòng)態(tài)鏈接庫(kù)提供了一些特定結(jié)構(gòu)的函數(shù),能被應(yīng)用程序在運(yùn)行過(guò)程
27、中裝入和連接,且多個(gè)程序可以共享同一個(gè)動(dòng)態(tài)鏈接庫(kù),這樣就可以大大節(jié)省內(nèi)存和磁盤空間。從編程角度來(lái)說(shuō),動(dòng)態(tài)鏈接庫(kù)可以提高程序模塊的靈活性,因?yàn)樗旧硎强梢詥为?dú)設(shè)計(jì)、編譯和調(diào)試的。Windows提供了應(yīng)用程序可利用的豐富的函數(shù)調(diào)用,大多數(shù)用于實(shí)現(xiàn)其用戶界面和在顯示器上顯示的文本和圖形,都是通過(guò)動(dòng)態(tài)鏈接庫(kù)來(lái)實(shí)現(xiàn)的。這些動(dòng)態(tài)鏈接庫(kù)是一些具有.DLL擴(kuò)展名或者有時(shí)是.EXE擴(kuò)展名的文件。在Windows操作系統(tǒng)中,最主要的DLLKERNEL3
28、2.DLL、GDI32.DLL和USER32.DLL三個(gè)模塊。其中KERNEL32用來(lái)處理存儲(chǔ)器低層功能、任務(wù)和資源管理等Windows核心服務(wù); GDI32用來(lái)提供圖形設(shè)備接口,管理用戶界面和圖形繪制,包括Windows元文件、位圖、設(shè)備描述表和字體等;而USER32負(fù)責(zé)窗口的管理,包括消息、菜單、光標(biāo)、計(jì)時(shí)器以及其它與控制窗口顯示相關(guān)的一些功能。,3.1.2 Windows編程特點(diǎn),5 . 進(jìn)程和線程在32位Windows多任務(wù)操
29、作系統(tǒng)中,采用了進(jìn)程和線程的管理模式。進(jìn)程是裝入內(nèi)存中正在執(zhí)行的應(yīng)用程序。進(jìn)程包括私有的虛擬地址空間、代碼、數(shù)據(jù)及其它操作系統(tǒng)資源,如文件、管道以及對(duì)該進(jìn)程可見(jiàn)的同步對(duì)象等。進(jìn)程包括了一個(gè)或多個(gè)在進(jìn)程上下文內(nèi)運(yùn)行的線程。線程是操作系統(tǒng)分配CPU時(shí)間的基本實(shí)體。線程可以執(zhí)行應(yīng)用程序代碼的任何部分,包括當(dāng)前正在被其它線程執(zhí)行的那些部分。同一進(jìn)程的所有線程共享同樣的虛擬地址空間、全局變量和操作系統(tǒng)資源。在一個(gè)應(yīng)用程序中,可以包括一個(gè)或多個(gè)
30、進(jìn)程,每個(gè)進(jìn)程由一個(gè)或多個(gè)線程構(gòu)成。,3.1.3 Windows基本數(shù)據(jù)類型,表3.1列出了一些在Windows編程中常用的基本數(shù)據(jù)類型。,表3.1 Windows常用的基本數(shù)據(jù)類型,3.1.3 Windows基本數(shù)據(jù)類型,表3.2列出了常用的預(yù)定義句柄,它們的類型均為void *,即一個(gè)32位指針。,表3. 2 Windows常用的句柄類型,3.2 編制一個(gè)MFC應(yīng)用程序,前面的Ex_HelloMsg和Ex_HelloWin都是基
31、于Windows API的C++應(yīng)用程序。顯然,隨著應(yīng)用程序的復(fù)雜性,C++應(yīng)用程序代碼也必然越復(fù)雜。為了幫助用戶處理那些經(jīng)常使用又復(fù)雜繁瑣的各種Windows操作,Visual C++設(shè)計(jì)了一套基礎(chǔ)類庫(kù)(Microsoft Foundation Class Library,簡(jiǎn)稱MFC)。MFC把Windows編程規(guī)范中的大多數(shù)內(nèi)容封裝成為各種類,使程序員從繁雜的編程中解脫出來(lái),提高了編程和代碼效率。,3.2.1 設(shè)計(jì)一個(gè)MFC
32、程序,在理解MFC機(jī)制之前,先來(lái)看一個(gè)MFC應(yīng)用程序。[例Ex_HelloMFC] 一個(gè)MFC應(yīng)用程序#include // MFC頭文件class CHelloApp : public CWinApp// 聲明應(yīng)用程序類{ public: virtual BOOL InitInstance();};CHelloApp theApp; // 建立應(yīng)用程序類的實(shí)例class CMainFr
33、ame: public CFrameWnd// 聲明主窗口類{ public: CMainFrame() {// 創(chuàng)建主窗口 Create(NULL, "我的窗口", WS_OVERLAPPEDWINDOW, CRect(0,0,400,300));} protected: afx_msg void OnLButtonDown(UINT nFlags, C
34、Point point); DECLARE_MESSAGE_MAP()};,// 消息映射入口BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_WM_LBUTTONDOWN()// 單擊鼠標(biāo)左鍵消息的映射宏END_MESSAGE_MAP()//定義消息映射函數(shù)void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) {
35、 MessageBox ("你好,我的Visual C++世界!", "問(wèn)候", 0) ;CFrameWnd::OnLButtonDown(nFlags, point);}BOOL CHelloApp::InitInstance() // 每當(dāng)應(yīng)用程序首次執(zhí)行時(shí)都要調(diào)用的初始化函數(shù){ m_pMainWnd = new CMainFrame(
36、); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE;},3.2.1 設(shè)計(jì)一個(gè)MFC程序,在Visual C++ 6.0運(yùn)行上述MFC程序需要進(jìn)行以下步驟:(1) 選擇“文件”→“新建”菜單命令,顯示出“新建”對(duì)話框。在“工程”標(biāo)簽頁(yè)面的列表框中,選中Win32 Applica
37、tion項(xiàng),創(chuàng)建一個(gè)Ex_HelloMFC空應(yīng)用程序項(xiàng)目。(2) 再次選擇“文件”→“新建”菜單命令,顯示出“新建”對(duì)話框。在文件標(biāo)簽頁(yè)面左邊的列表框中選擇C++ Source File項(xiàng),在右邊的文件框中鍵入Ex_HelloMFC.cpp,單擊[確定]按鈕。(3) 輸入上面的代碼。選擇“工程”→“設(shè)置”菜單命令,在出現(xiàn)的對(duì)話框中選擇“General”標(biāo)簽。然后在“Microsoft Foundation Classes”組合框中,
38、選擇“Use MFC in a Shared DLL”,如圖3.4所示。單擊[確定]按鈕。(4) 程序運(yùn)行后,單擊鼠標(biāo)左鍵,就會(huì)彈出一個(gè)對(duì)話框,結(jié)果同Ex_HelloWin。,3.2.1 設(shè)計(jì)一個(gè)MFC程序,圖3.4 設(shè)置工程屬性,3.2.2 理解程序代碼,按照MFC的消息映射機(jī)制,映射一個(gè)消息的過(guò)程是由三個(gè)部分組成的:(1) 在處理消息的類中,使用消息宏DECLARE_MESSAGE_MAP聲明對(duì)消息映射的支持,并在該宏之前聲明
39、消息處理函數(shù)。例如前面示例中的:protected:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);DECLARE_MESSAGE_MAP()(2) 使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在類聲明之后的地方定義該類支持的消息映射入口點(diǎn),所有消息映射宏都添加在這里,當(dāng)然不同的消息MFC都會(huì)有不同的消息映射宏。例如:BEGIN_
40、MESSAGE_MAP(CMainFrame, CFrameWnd)…END_MESSAGE_MAP(),其中,BEGIN_MESSAGE_MAP帶有兩個(gè)參數(shù),第一個(gè)參數(shù)用來(lái)指定需要支持消息映射的用戶派生類,第二個(gè)參數(shù)指定該類的基類。(3) 定義消息處理函數(shù)。例如:void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { MessageBox (&q
41、uot;你好,我的Visual C++世界!", "問(wèn)候", 0) ; CFrameWnd::OnLButtonDown(nFlags, point);},3.3 使用MFC AppWizard,3.3.1應(yīng)用程序框架類型這些類型基本滿足了各個(gè)層次的用戶的需要,但一般地,用戶更關(guān)心的是MFC AppWizard(exe)應(yīng)用程序框架,因?yàn)樗脩糇畛S谩⒆罨镜娜N應(yīng)用程序類型:?jiǎn)挝臋n、多文
42、檔和基于對(duì)話框的應(yīng)用程序。,表3.3 MFC AppWizard創(chuàng)建的應(yīng)用程序類型,3.3.2 創(chuàng)建一個(gè)單文檔應(yīng)用程序,用MFC AppWizard(MFC應(yīng)用程序向?qū)?可以方便地創(chuàng)建一個(gè)通用的Windows單文檔應(yīng)用程序,其步驟如下。1. 開(kāi)始選擇“文件”→“新建”菜單,在彈出的“新建”對(duì)話框中,可以看到工程標(biāo)簽頁(yè)面中,顯示出一系列的應(yīng)用程序項(xiàng)目類型;選擇MFC AppWizard(exe)的項(xiàng)目類型(該類型用于創(chuàng)建可執(zhí)行
43、的Windows應(yīng)用程序),將項(xiàng)目工作文件夾定位在“D:\Visual C++ 6.0程序”,并在工程編輯框中輸入項(xiàng)目名Ex_SDIHello,結(jié)果如圖3.5所示。,圖3.5 MFC AppWizard的“新建”對(duì)話框,3.3.2 創(chuàng)建一個(gè)單文檔應(yīng)用程序,2. 第一步單擊[確定]按鈕,出現(xiàn)如圖3.6所示的對(duì)話框,進(jìn)行下列選擇:(1)從應(yīng)用程序類型單個(gè)文檔(SDI)、多重文檔(MDI)和基本對(duì)話框(基于對(duì)話框的應(yīng)用程序)中選擇“
44、單個(gè)文檔”。(2) 決定應(yīng)用程序中是否需要MFC的文檔視圖(“文檔/查看體系結(jié)構(gòu)支持”)結(jié)構(gòu)的支持。若不選定此項(xiàng),則程序中的磁盤文件的打開(kāi)、保存以及文檔和視圖的相互作用等功能需要用戶來(lái)實(shí)現(xiàn),且將跳過(guò)Step 2~Step 5,直接彈出“Step 6”對(duì)話框。一般情況下,應(yīng)選中此項(xiàng)。(3) 選擇資源所使用的語(yǔ)言,這里是“中文[中國(guó)]”。3.第二步單擊[下一個(gè)]按鈕,出現(xiàn)如圖3.7所示的對(duì)話框,讓用戶選擇程序中是否加入數(shù)據(jù)庫(kù)
45、的支持(有關(guān)數(shù)據(jù)庫(kù)的內(nèi)容將在以后的章節(jié)中介紹)。,圖3.6 MFC AppWizard的“Step 1”對(duì)話框,圖3.7 MFC AppWizard的“Step 2”對(duì)話框,3.3.2 創(chuàng)建一個(gè)單文檔應(yīng)用程序,4.第三步單擊[下一個(gè)]按鈕進(jìn)入下一步,出現(xiàn)如圖3.8所示的對(duì)話框。允許用戶在程序中加入復(fù)合文檔、自動(dòng)化、ActiveX控件的支持。5. 第四步單擊[下一個(gè)]按鈕進(jìn)入下一步,出現(xiàn)如圖3.9所示的對(duì)話框,對(duì)話框的前幾項(xiàng)依
46、次確定對(duì)浮動(dòng)工具條、打印與預(yù)覽以及通信等特性的支持。,圖3.8 MFC AppWizard的“Step 3”對(duì)話框,圖3.9 MFC AppWizard的“Step 4”對(duì)話框,3.3.2 創(chuàng)建一個(gè)單文檔應(yīng)用程序,6. 第五步保留以上默認(rèn)值,單擊[下一個(gè)]按鈕進(jìn)入下一步。彈出如圖3.10所示的對(duì)話框,這里出現(xiàn)三個(gè)方面的選項(xiàng),供用戶來(lái)選擇:(1) 應(yīng)用程序的主窗口是MFC標(biāo)準(zhǔn)風(fēng)格還是窗口左邊有切分窗口的瀏覽器風(fēng)格;(2) 在
47、源文件中是否加入注釋用來(lái)引導(dǎo)用戶編寫程序代碼;(3) 使用動(dòng)態(tài)鏈接庫(kù)還是靜態(tài)鏈接庫(kù)。,圖3.10 MFC AppWizard的“Step 5”對(duì)話框,3.3.2 創(chuàng)建一個(gè)單文檔應(yīng)用程序,7. 第六步保留默認(rèn)選項(xiàng),單擊[下一步]按鈕進(jìn)行下一步,出現(xiàn)如圖3.11所示的對(duì)話框。在這里,用戶可以對(duì)MFC AppWizard提供的默認(rèn)類名、基類名、各個(gè)源文件名進(jìn)行修改。單擊[完成]按鈕出現(xiàn)一個(gè)信息對(duì)話框,顯示出用戶在前面幾個(gè)步驟中作出
48、的選擇內(nèi)容,單擊[確定]按鈕系統(tǒng)開(kāi)始創(chuàng)建,并又回到了Visual C++ 6.0的主界面。8.編譯并運(yùn)行到這里為止,用戶雖然沒(méi)有編寫任何程序代碼,但MFC AppWizard已經(jīng)根據(jù)用戶的選擇內(nèi)容自動(dòng)生成基本的應(yīng)用程序框架。單擊編譯工具欄上的運(yùn)行工具按鈕“”或按快捷鍵Ctrl+F5,系統(tǒng)開(kāi)始編連并運(yùn)行生成的單文檔應(yīng)用程序可執(zhí)行文件Ex_SDIHello.exe,運(yùn)行結(jié)果如圖3.12所示。,圖3.11 MFC AppWiza
49、rd的“Step 6”對(duì)話框,圖3.12 Ex_SDIHello運(yùn)行結(jié)果,3.3.3 MFC應(yīng)用程序項(xiàng)目組織,1. 項(xiàng)目的文件組織在Visual C++ 6.0中,項(xiàng)目中所有的源文件都是采用文件夾的方式進(jìn)行管理的,它將項(xiàng)目名作為文件夾名,在此文件夾下包含源程序代碼文件(.cpp,.h)、項(xiàng)目文件(.dsp)以及項(xiàng)目工作區(qū)文件(.dsw)等。表3.4列出了這些文件類型的的含義。,表3.4 Visual C++ 6.0文件類型的含
50、義,除了上述文件外,還有相應(yīng)的Debug(調(diào)試)或Release(發(fā)行)、Res(資源)等子文件夾。例如上述創(chuàng)建的單文檔應(yīng)用程序項(xiàng)目Ex_SDIHello,其各文件的組織如圖3.13所示。當(dāng)然,不同類型的項(xiàng)目的文件類型及數(shù)目會(huì)有所不同,3.3.3 MFC應(yīng)用程序項(xiàng)目組織,。,圖3.13 Ex_SDIHello項(xiàng)目的文件組織,3.3.3 MFC應(yīng)用程序項(xiàng)目組織,2. MFC類結(jié)構(gòu)在開(kāi)發(fā)環(huán)境中,Visual C++ 6.0是通過(guò)左邊的項(xiàng)
51、目工作區(qū)窗口來(lái)對(duì)項(xiàng)目進(jìn)行各種管理。項(xiàng)目工作區(qū)窗口包含3個(gè)頁(yè)面,它們分別是ClassView頁(yè)、ResourceView頁(yè)和FileView頁(yè),通過(guò)單擊項(xiàng)目區(qū)窗口底部的頁(yè)面標(biāo)簽進(jìn)行切換。將Visual C++ 6.0項(xiàng)目工作區(qū)窗口切換到ClassView頁(yè)面,可以看到MFC為單文檔應(yīng)用程序項(xiàng)目Ex_SDIHello自動(dòng)創(chuàng)建了類CAboutDlg、CEx_SDIHelloApp、 CEx_SDIHelloDoc、CEx_SDIHello
52、View和CMainFrame。這些MFC類之間的繼承和派生關(guān)系如圖3.14所示。,3.4 使用類向?qū)?MFC類向?qū)?ClassWizard)是Visual C++ 6.0中又一個(gè)非常有用的工具。它能自動(dòng)為一個(gè)項(xiàng)目添加一個(gè)類、進(jìn)行消息和數(shù)據(jù)映射、創(chuàng)建OLE Automation(自動(dòng)化)屬性和方法以及進(jìn)行ActiveX事件處理等。,3.4.1 類向?qū)Ц攀?打開(kāi)MFC類向?qū)Э梢允褂孟铝袔追N方法:(1) 選擇“查看”→“建立類向?qū)А辈藛位?/p>
53、直接使用Ctrl+W快捷鍵。(2) 在源代碼文件的文檔編輯窗口中,右擊鼠標(biāo),從彈出的快捷菜單中選擇“建立類向?qū)А泵?。?dāng)MFC類向?qū)Т蜷_(kāi)后,就會(huì)彈出如圖3.15所示的MFC ClassWizard對(duì)話框。,圖3.15 MFC ClassWizard對(duì)話框,3.4.1 類向?qū)Ц攀?可以看到ClassWizard對(duì)話框包含了5個(gè)標(biāo)簽頁(yè)面,它們各自含義如下:● Message Maps(消息映射):用來(lái)添加、刪除和編程處理消息的成員
54、函數(shù)?!?Member Variables(成員變量):添加或刪除與控件相關(guān)聯(lián)的成員變量(或稱數(shù)據(jù)成員),以便與控件進(jìn)行數(shù)據(jù)交換。這些控件所在的類一般是從CDialog、CPropertyPage、CRecordView或CDaoRecordView中派生的類?!?Automation(自動(dòng)化):為支持Automation的類(如ActiveX控件類)添加屬性和方法?!?ActiveX Events(ActiveX事件):為
55、ActiveX控件類添加觸發(fā)事件的支持?!?Class Info(類信息):有關(guān)項(xiàng)目中類的其他信息。一般來(lái)說(shuō),MFC ClassWizard對(duì)話框最前兩項(xiàng)是用戶最關(guān)心的,也是最經(jīng)常使用的,因?yàn)閹缀跛械拇a編寫都要利用這兩個(gè)標(biāo)簽項(xiàng)。由于Member Variables功能以后還會(huì)詳細(xì)討論,因此這里僅討論Message Maps(消息映射)與類的添加和刪除方法。,3.4.2 消息和消息映射,1. 消息分類Windows應(yīng)用程序
56、中的消息主要有三種類型。(1)窗口消息(Windows message)。這類消息主要是指由WM_開(kāi)頭的消息(WM_ COMMAND除外),一般由窗口類和視圖類對(duì)象來(lái)處理。窗口消息往往帶有參數(shù),以標(biāo)志處理消息的方法。(2)控件的通知消息(Control notifications)。當(dāng)控件的狀態(tài)發(fā)生改變(例如用戶在控件中進(jìn)行輸入)時(shí),控件就會(huì)向其父窗口發(fā)送WM_COMMAND通知消息。應(yīng)用程序框架處理控件消息的方法和窗口消息
57、相同,但按鈕的BN_CLICKED通知消息除外,它的處理方法與命令消息相同。(3)命令消息(Command message)。命令消息主要包括由用戶交互對(duì)象(菜單、工具條的按鈕、快捷鍵等)發(fā)送的WM_COMMAND通知消息。命令消息的處理方式與其他兩種消息不同,它能夠被多種對(duì)象接收、處理,這些對(duì)象包括文檔類、文檔模板類、應(yīng)用程序本身以及窗口和視類等;而窗口消息和控件的通知消息是由窗口對(duì)象接收并處理的,這里的窗口對(duì)象是指從CW
58、nd中派生的類的對(duì)象,它包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及從這些類派生的對(duì)象等。,3.4.2 消息和消息映射,2. ClassWizard映射消息的一般方法在MFC中,絕大多數(shù)消息都可由MFC的ClassWizard來(lái)映射。將ClassWizard對(duì)話框切換到Message Maps頁(yè)面(參看圖3.15),可以看到它有許多選項(xiàng),如項(xiàng)目組合框、類組合框等。各
59、項(xiàng)功能說(shuō)明如表3.5所示。,表3.5 ClassWizard對(duì)話框的Message Maps頁(yè)面功能,3.4.2 消息和消息映射,2. ClassWizard映射消息的一般方法例如,若向CEx_SDIHelloView中添加WM_LBUTTOMDOWN的消息映射,則可按下列步驟進(jìn)行:(1) 按Ctrl+W快捷鍵打開(kāi)MFC ClassWizard對(duì)話框。(2) 在Class name組合框中,將類名選定為CEx_SDIHelloV
60、iew。此時(shí),Object IDs和Messages列表內(nèi)容會(huì)相應(yīng)的改變。(3) 在Object IDs列表框中選定CEx_SDIHelloView,而在Messages列表中選定WM_LBUTTOMDOWN消息。(4) 雙擊Messages列表中的WM_LBUTTOMDOWN消息或單擊[Add Function]按鈕,都會(huì)在CEx_SDIHelloView類中添加該消息的映射函數(shù)OnLButtonDown,同時(shí)在Member fu
61、ncions列表中顯示這一消息映射函數(shù)和被映射的消息,結(jié)果如圖3.16所示。,(5) 單擊[Edit Code]按鈕后,ClassWizard對(duì)話框退出,并轉(zhuǎn)向文檔窗口,定位到OnLButtonDown函數(shù)源代碼處。(6) 添加下列代碼:void CEx_SDIHelloView::OnLButtonDown(UINT nFlags, CPoint point) { MessageBox ("你好,我的
62、Visual C++世界!", "問(wèn)候", 0) ;MessageBox ("你好,我的Visual C++世界!", "問(wèn)候", 0) ;CView::OnLButtonDown(nFlags, point);}(7) 這樣就完成了一個(gè)消息映射過(guò)程。程序運(yùn)行后,在窗口客戶區(qū)單擊鼠標(biāo)左鍵,就會(huì)彈出一個(gè)消息對(duì)話框。,3.4.2 消息和消息映射,圖3.16
63、 映射WM_LBUTTONDOWN消息,3.4.2 消息和消息映射,3. 消息映射代碼查看CEx_SDIHelloView程序代碼,可以發(fā)現(xiàn):ClassWizard為WM_LBUTTOMDOWN的消息映射作了以下三個(gè)方面內(nèi)容的安排:(1) 在頭文件Ex_SDIHelloView.h中聲明消息處理函數(shù)OnLButtonDown:protected://{{AFX_MSG(CEx_SDIHelloView)afx_msg vo
64、id OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSGDECLARE_MESSAGE_MAP()代碼中的//{{AFX_MSG(CEx_SDIHelloView)和//}}AFX_MSG之間的部分是ClassWizard定義的專門用作消息映射函數(shù)聲明的標(biāo)記。表示該程序塊中的消息映射聲明是由ClassWizard來(lái)自動(dòng)管理的,用戶一般不需要去更改。需要說(shuō)明的是,凡//{{和
65、//}}之間的程序代碼塊均由ClassWizard自動(dòng)管理。,3.4.2 消息和消息映射,3. 消息映射代碼(2) 在Ex_SDIHelloView.cpp源文件前面的消息映射入口處,添加了相應(yīng)的映射宏:BEGIN_MESSAGE_MAP(CEx_SDIHelloView, CView)// 消息映射開(kāi)始//{{AFX_MSG_MAP(CEx_SDIHelloView)ON_WM_LBUTTONDOWN()//}}A
66、FX_MSG_MAP…END_MESSAGE_MAP()// 消息映射結(jié)束,(3) 在Ex_SDIHelloView.cpp文件中寫入一個(gè)空的消息處理函數(shù)的模板,以便用戶填入具體代碼,如下面的框架:void CEx_SDIHelloView::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here a
67、nd/or call defaultCView::OnLButtonDown(nFlags, point);}事實(shí)上,根據(jù)ClassWizard產(chǎn)生的上述消息映射過(guò)程,用戶可以自己手動(dòng)添加一些MFC ClassWizard不支持的消息映射函數(shù),以完成特定的功能。例如,Ex_HelloMFC示例就是按照上述過(guò)程添加消息映射的。,3.4.2 消息和消息映射,4. 鍵盤消息當(dāng)用戶按下一個(gè)鍵或組合鍵時(shí),Windows將WM_KEYD
68、OWN或WM_SYSKEYDOWN放入具有輸入焦點(diǎn)的應(yīng)用程序窗口的消息隊(duì)列中。當(dāng)鍵被釋放時(shí),Windows則把WM_KEYUP或WM_SYSKEYUP消息放入消息隊(duì)列中。對(duì)于字符鍵來(lái)說(shuō),還會(huì)在這兩個(gè)消息之間產(chǎn)生WM_CHAR消息。MFC ClassWizard能自動(dòng)添加了當(dāng)前類的WM_KEYDOWN和WM_KEYUP擊鍵消息處理函數(shù)的調(diào)用,它們具有下列函數(shù)原型:afx_msg void OnKeyDown( UINT nChar,
69、UINT nRepCnt, UINT nFlags );afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );afx_msg是MFC用于定義消息函數(shù)的標(biāo)志,參數(shù)nChar表示虛擬鍵代碼,nRepCnt表示當(dāng)用戶按住一個(gè)鍵時(shí)的重復(fù)計(jì)數(shù),nFlags表示擊鍵消息標(biāo)志。,3.4.2 消息和消息映射,所謂虛擬鍵代碼,是指與設(shè)備無(wú)關(guān)的鍵盤編碼。在Visual C++中,最常
70、用的虛擬鍵代碼已被定義在Winuser.h中,例如:VK_SHIFT表示SHIFT鍵,VK_F1表示功能鍵F1等。同擊鍵消息一樣,MFC中的ClassWizard也提供相應(yīng)的字符消息處理框架,并自動(dòng)添加了當(dāng)前類的WM_CHAR消息處理函數(shù)調(diào)用,它具有下列函數(shù)原型:afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );參數(shù)nChar表示鍵的ASCII碼,nRepC
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- mfc基本應(yīng)用程序的建立
- 在mfc中創(chuàng)建應(yīng)用程序的資源
- 第17章 創(chuàng)建windows應(yīng)用程序
- 第26章應(yīng)用程序的調(diào)試和異常處理
- 第3章網(wǎng)站的建立與基本操作
- vb.net程序設(shè)計(jì)教程第11章圖形應(yīng)用程序開(kāi)發(fā)
- vs2010和mfc編程入門之2(利用mfc向?qū)蓡挝臋n應(yīng)用程序框架)
- 13因特網(wǎng)的基本應(yīng)用
- vs2010和mfc編程入門之2(利用mfc向?qū)蓡挝臋n應(yīng)用程序框架)
- 外文翻譯---web 應(yīng)用程序的基本安全做法
- 開(kāi)發(fā)engine應(yīng)用程序的基本原理
- linux基本應(yīng)用培訓(xùn)
- 555定時(shí)器及基本應(yīng)用論文 3
- asa基本應(yīng)用和配置
- 數(shù)控車床的基本應(yīng)用
- 外文文獻(xiàn)翻譯---web 應(yīng)用程序的基本安全做法
- 第3章-基本立體
- 操作系統(tǒng)和基本應(yīng)用
- 1-2向量的基本應(yīng)用
- android應(yīng)用程序基礎(chǔ)
評(píng)論
0/150
提交評(píng)論