第1章 Windows編程基礎(chǔ)1.ppt_第1頁(yè)
第1章 Windows編程基礎(chǔ)1.ppt_第2頁(yè)
第1章 Windows編程基礎(chǔ)1.ppt_第3頁(yè)
第1章 Windows編程基礎(chǔ)1.ppt_第4頁(yè)
第1章 Windows編程基礎(chǔ)1.ppt_第5頁(yè)
已閱讀5頁(yè),還剩61頁(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章 Windows編程基礎(chǔ),從main到WinMain,窗口和消息,C+的“類”,MFC編程,MFC應(yīng)用程序框架,1.1 從main到WinMain,學(xué)習(xí)編程往往以簡(jiǎn)單的例子來(lái)入手,例如C語(yǔ)言,常常有下列簡(jiǎn)單的框架代碼: #include int main() printf(Hello World!n);/* 輸出 */ return 0;/* 指定返回值 */ ,1.1.1 Windows等價(jià)程序,等價(jià)的Windows程序可以寫(xiě)成: #include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PST

2、R szCmdLine, int nCmdShow) MessageBox (NULL, TEXT(Hello, World!), TEXT(Hello), 0) ; return 0 ; ,1.1.1 Windows等價(jià)程序,在Visual C+ 6.0中的編輯、連接和運(yùn)行的過(guò)程: 選擇“開(kāi)始”“程序”“Microsoft Visual Studio 6.0” “Microsoft Visual C+ 6.0”,運(yùn)行Visual C+ 6.0。第一次運(yùn)行時(shí),將顯示如圖1.1的“每日提示”對(duì)話框。,1.1.1 Windows等價(jià)程序, 選擇“文件”“新建”菜單命令,打開(kāi)應(yīng)用程序向?qū)?,顯示出“新

3、建”對(duì)話框,如圖1.2所示。,1.1.1 Windows等價(jià)程序, 單擊“位置”編輯框右側(cè)的瀏覽按鈕 (圖1.2中的標(biāo)記2),從彈出的“選擇目錄”對(duì)話框指定項(xiàng)目所在的文件夾,如圖1.3所示。,1.1.1 Windows等價(jià)程序, 在“新建”對(duì)話框的“工程名稱”編輯框(圖1.2中的標(biāo)記3)中,輸入項(xiàng)目名稱Ex_HelloMsg,保留“平臺(tái)”下“Win32”復(fù)選框的默認(rèn)“選中 ”狀態(tài),單擊“確定 ”按鈕進(jìn)入下一步。 出現(xiàn)“Win32 Application”(Win32應(yīng)用程序)向?qū)У牟襟E1(共1步)對(duì)話框,從中可選擇要?jiǎng)?chuàng)建的應(yīng)用程序類型:“一個(gè)空工程”、“一個(gè)簡(jiǎn)單的Win32程序”和“一個(gè)典型的

4、Hello World! 程序”,如圖1.4所示。,1.1.1 Windows等價(jià)程序, 選中“一個(gè)空工程”,單擊 “完成”按鈕,彈出“新建工程信息”對(duì)話框,如圖1.5所示。,1.1.1 Windows等價(jià)程序, 再次選擇“文件”“新建”菜單命令,Visual C+將打開(kāi)“新建”對(duì)話框并自動(dòng)切換到“文件”頁(yè)面,如圖1.6所示。,1.1.1 Windows等價(jià)程序, 單擊“確定 ”按鈕,系統(tǒng)將在創(chuàng)建的Win32項(xiàng)目工程“Ex_HelloMsg”中創(chuàng)建并添加一個(gè)新的文件HelloMsg.c,同時(shí)打開(kāi)該文件窗口。 單擊編譯工具條 上的運(yùn)行工具按鈕“ ”或直接按快捷鍵Ctrl+F5,就可以運(yùn)行剛剛生成

5、的Ex_HelloMsg.exe,結(jié)果如圖1.7所示。,1.1.2 頭文件,HelloMsg.c是一個(gè)#include預(yù)處理指令開(kāi)始,實(shí)際上在用C/C+編寫(xiě)的Windows應(yīng)用程序的頭部都可以看到這樣的指令: #include 頭文件Windows.h是最主要的包含頭文件,它還包含了其它一些Windows頭文件。例如: windef.h:基本類型定義 winbase.h:內(nèi)核函數(shù) wingdi.h:用戶接口函數(shù) winuser.h:圖形設(shè)備接口函數(shù),1.1.3 程序入口函數(shù),在C/C+程序中,其入口函數(shù)都是main。但在Windows程序中,這一個(gè)入口函數(shù)是由WinMain來(lái)代替。該函數(shù)是在w

6、inbase.h中聲明的,其原型如下: int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd ); WinMain函數(shù)被聲明成為返回一個(gè)int值,同時(shí)WinMain函數(shù)名前還有WINAPI標(biāo)識(shí)符的修飾。WINAPI是一種“調(diào)用約定”宏,它在windef.h中有如下定義: #define WINAPI _stdcall、_stdcall是Pascal方式清理C方式壓棧,函數(shù)參數(shù)采用從右到左的壓棧方式,函數(shù)被調(diào)用者修改堆棧, WinMain函數(shù)的第一個(gè)和第二個(gè)參數(shù)都是“

7、HINSTANCE(實(shí)例句柄)”類型?!癏INSTANCE”中,H表示“Handle”,是“句柄”的意思。 WinMain函數(shù)的第三個(gè)參數(shù)lpCmdLine用來(lái)指定程序的命令行,其參數(shù)類型為“LPSTR”。但在HelloMsg.c中,卻將其改為PSTR。這兩種數(shù)據(jù)類型都是合法的,也都是指向字符串的指針類型。 WinMain函數(shù)的第四個(gè)參數(shù)nShowCmd用來(lái)指定程序最初顯示的方式,它可以是正常、最大化或最小化來(lái)顯示程序窗口。,1.1.4 MessageBox函數(shù),MessageBox是一個(gè)Win32 API函數(shù),用來(lái)彈出一個(gè)對(duì)話框窗口,顯示短信息。該函數(shù)具有下列原型: int MessageB

8、ox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); 其中,第一個(gè)參數(shù)hWnd用來(lái)指定父窗口句柄,即對(duì)話框所在的窗口句柄。第二、三個(gè)參數(shù)分別用來(lái)指定顯示的消息內(nèi)容(lpText)和對(duì)話框窗口的標(biāo)題(lpCaption),最后一個(gè)參數(shù)用來(lái)指定在對(duì)話框中顯示的預(yù)定義的按鈕和圖標(biāo)標(biāo)識(shí),它們是在winuser.h定義的一組以MB_開(kāi)始的常數(shù)組合。例如:,續(xù)例HelloMsg.c 改變MessageBox的第四個(gè)參數(shù) #include int WINAPI WinMain (HINSTANCE hInstance, HINSTANC

9、E hPrevInstance, PSTR szCmdLine, int nCmdShow) MessageBox (NULL, TEXT(Hello, World!), TEXT(Hello),MB_ICONQUESTION | MB_ABORTRETRYIGNORE ) ; return 0 ; ,1.1.4 MessageBox函數(shù),程序運(yùn)行后,結(jié)果如圖1.8所示。,1.2 窗口和消息,1.2.1 程序框架代碼 為了能處理上述兩個(gè)部分的內(nèi)容:窗口創(chuàng)建和消息處理,Windows提供了相應(yīng)的程序框架,如下面的例子。 創(chuàng)建并運(yùn)行上述程序時(shí),先創(chuàng)建一個(gè)Ex_HelloWin“空工程”,然后再創(chuàng)建

10、并添加新的源文件hellowin.c,輸入上述代碼,然后編連和運(yùn)行,結(jié)果如圖1.9所示。,1.2.2 注冊(cè)窗口類,注冊(cè)的過(guò)程也就是將這些屬性告訴系統(tǒng),然后再調(diào)用CreateWindow函數(shù)創(chuàng)建出窗口。WNDCLASS結(jié)構(gòu)具有下列原型: typedef struct UINT style;/ 窗口的風(fēng)格 WNDPROC lpfnWndProc;/ 指定窗口的消息處理函數(shù)的窗口過(guò)程函數(shù) int cbClsExtra;/ 指定分配給窗口類結(jié)構(gòu)之后的額外字節(jié)數(shù) int cbWndExtra;/ 指定分配給窗口實(shí)例之后的額外字節(jié)數(shù) HINSTANCE hInstance;/ 指定窗口過(guò)程所對(duì)應(yīng)的實(shí)例句柄

11、 HICON hIcon;/ 指定窗口的圖標(biāo) HCURSOR hCursor;/ 指定窗口的鼠標(biāo)指針 HBRUSH hbrBackground;/ 指定窗口的背景畫(huà)刷 LPCTSTR lpszMenuName;/ 窗口的菜單資源名稱 LPCTSTR lpszClassName;/ 該窗口類的名稱 WNDCLASS, *PWNDCLASS;,1.2.2 注冊(cè)窗口類,該結(jié)構(gòu)有十個(gè)域(成員),其中第一個(gè)域style表示窗口類的風(fēng)格,它往往是由一些基本的預(yù)定義風(fēng)格通過(guò)位的“或”操作(操作符位“|”)組合而成。例如,在HelloWin.c中,有: WNDCLASSwndclass ;/ 窗口類 wndc

12、lass.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 = GetStockObject (

13、WHITE_BRUSH) ; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = HelloWin;/ 窗口類名,1.2.3 創(chuàng)建和顯示窗口,用下列調(diào)用CreateWindow函數(shù)的代碼來(lái)創(chuàng)建窗口的: hwnd = CreateWindow (“HelloWin”, / 窗口類名,要與注冊(cè)時(shí)指定的相 我的窗口, / 窗口標(biāo)題 WS_OVERLAPPEDWINDOW, / 窗口樣式 CW_USEDEFAULT, / 窗口最初的 x 位置 CW_USEDEFAULT, / 窗口最初的 y 位置 480, / 窗口最初的 x 大小 320,

14、/ 窗口最初的 y 大小 NULL, / 父窗口句柄 NULL,/ 窗口菜單句柄 hInstance, / 應(yīng)用程序?qū)嵗浔?NULL) ; / 創(chuàng)建窗口的參數(shù),1.2.3 創(chuàng)建和顯示窗口,CreateWindow函數(shù)后面的參數(shù)中,仍用到了該應(yīng)用程序的實(shí)例句柄hInstance。如果窗口創(chuàng)建成功,返回值是新窗口的句柄,否則返回NULL。窗口創(chuàng)建后,并不會(huì)在屏幕上顯示出來(lái)。要能真正把窗口顯示在屏幕上,還得使用ShowWindow函數(shù),其原型如下: BOOL ShowWindow( HWND hWnd, int nCmdShow );,1.2.4 消息和消息處理,1. 消息循環(huán) 在Win32編程中

15、,消息循環(huán)是相當(dāng)重要的一個(gè)概念,看似很難,但使用起來(lái)卻是非常簡(jiǎn)單。在WinMain函數(shù)的最后,有下列代碼: while (GetMessage (/ 將消息發(fā)送給窗口過(guò)程,這里是WndProc ,GetMessage函數(shù)就是用來(lái)從應(yīng)用程序的消息隊(duì)列中按照先進(jìn)先出的原則將這些消息一個(gè)個(gè)的取出來(lái),放進(jìn)一個(gè)MSG結(jié)構(gòu)中去。它的原型如下: BOOL GetMessage( LPMSG lpMsg, / 指向一個(gè)MSG結(jié) 構(gòu)的指針,用來(lái)保存消息 HWND hWnd, / 指定哪個(gè)窗口的消息將被獲取 UINT wMsgFilterMin,/ 指定獲取的主消息值的最小值 UINT wMsgFilterMax

16、/ 指定獲取的主消息值的最大值 );,1.2.4 消息和消息處理,GetMessage函數(shù)用來(lái)將獲取的消息復(fù)制到一個(gè)MSG結(jié)構(gòu)中。如果隊(duì)列中沒(méi)有任何消息,該函數(shù)將一直空閑直到隊(duì)列中又有消息時(shí)再返回。如果隊(duì)列中已有消息,它將取出一個(gè)后返回。MSG結(jié)構(gòu)包含Windows消息的完整信息,其定義如下: typedef struct HWND hwnd; / 消息發(fā)向的窗口的句柄 UINT message;/ 主消息的標(biāo)識(shí)值 WPARAM wParam;/ 附消息值,其具體含義依賴于主消息值 LPARAM lParam;/ 附消息值,其具體含義依賴于主消息值 DWORD time;/ 消息放入消息隊(duì)列中

17、的時(shí)間 POINT pt;/ 消息放入消息隊(duì)列時(shí)的鼠標(biāo)坐標(biāo) MSG, *PMSG;,1.2.4 消息和消息處理,2. 消息處理 用于消息處理的函數(shù)又叫窗口過(guò)程,在這個(gè)函數(shù)中,不同的消息將用switch語(yǔ)句分配到不同的處理程序中去。Windows的消息處理函數(shù)都有一個(gè)確定的統(tǒng)一方式,即這種函數(shù)的參數(shù)個(gè)數(shù)和類型以及其返回值的類型都有明確的規(guī)定。 在HelloWin.c中,WinProc函數(shù)常處理3個(gè)消息,分別是WM_CREATE(創(chuàng)建窗口消息)、WM_PAINT(窗口重畫(huà)消息)、WM_DESTROY(銷毀窗口消息)。,3. 結(jié)束消息循環(huán) 當(dāng)用戶按Alt+F4或單擊窗口右上角的退出按鈕,系統(tǒng)就向應(yīng)用

18、程序發(fā)送一條WM_DESTROY的消息。在處理此消息時(shí),調(diào)用了PostQuitMessage函數(shù),該函數(shù)會(huì)給窗口的消息隊(duì)列中發(fā)送一條WM_QUIT的消息。,case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hWnd,1.2.5 WM_PAINT消息,WM_PAINT是Win32的圖形和文本編程中經(jīng)常使用到的消息。當(dāng)窗口客戶區(qū)的一部分或全部變成“無(wú)效”時(shí),則必須要“刷新”重繪,此時(shí)將向程序發(fā)生此消息。,1.2.6 Windows基本數(shù)據(jù)類型,在前面示例和函數(shù)原型中,看到了一些“奇怪”的數(shù)據(jù)類型,很多這樣的數(shù)據(jù)類型只是一些基本數(shù)據(jù)類型的別

19、名,以方便不同風(fēng)格的程序員使用。其中,表1.1列出了一些在Windows編程中常用的基本數(shù)據(jù)類型。,1.2.6 Windows基本數(shù)據(jù)類型,表1.2列出了常用的預(yù)定義句柄,它們的類型均為void *,即一個(gè)32位指針。,1.3 C+的“類”,1.3.1 類和對(duì)象 1. 類的定義 如同C語(yǔ)言的“結(jié)構(gòu)”類型,“類”也是一種復(fù)合的數(shù)據(jù)類型,只不過(guò)要更為復(fù)雜一些。在C+中,一個(gè)獨(dú)立“類”的聲明格式一般如下:,1.3.1 類和對(duì)象,成員函數(shù)既可以在類中進(jìn)行定義,也可先在類中聲明函數(shù)原型,然后在類外定義,這種定義又稱為成員函數(shù)的實(shí)現(xiàn)。需要說(shuō)明的是,成員函數(shù)在類外實(shí)現(xiàn)時(shí),必須用作用域運(yùn)算符“:”來(lái)告知編譯系

20、統(tǒng)該函數(shù)所屬的類。即:,例如,下面的類的定義示例代碼。,1.3.1 類和對(duì)象,2. 對(duì)象的定義和初始化 同變量一樣,類聲明后,就可以定義該類的對(duì)象。類的對(duì)象也有好幾種定義方式。但由于“類”比任何數(shù)據(jù)類型都要復(fù)雜得多,為了提高程序的可讀性,真正將“類”當(dāng)成一個(gè)密閉、“封裝”的盒子(接口),在程序中應(yīng)盡量使用對(duì)象的聲明之后定義方式,即按下列格式進(jìn)行:, ;,1.3.1 類和對(duì)象,3. 對(duì)象成員的訪問(wèn) 一個(gè)對(duì)象的成員就是該對(duì)象的類所定義的數(shù)據(jù)成員和成員函數(shù)。訪問(wèn)對(duì)象的成員變量和成員函數(shù)與訪問(wèn)一般結(jié)構(gòu)的變量的方法是一樣的。對(duì)于普通對(duì)象,其訪問(wèn)格式如下:,. .(),若對(duì)象是一個(gè)指針,則對(duì)象的成員訪問(wèn)格

21、式如下:,- -(),1.3.2 構(gòu)造函數(shù)和析構(gòu)函數(shù),1. 構(gòu)造函數(shù) C+規(guī)定,在類的定義中是不能對(duì)數(shù)據(jù)成員進(jìn)行初始化的。為了能給數(shù)據(jù)成員設(shè)置某些初值,這時(shí)就要使用類的特殊成員函數(shù)構(gòu)造函數(shù)。構(gòu)造函數(shù)的最大特點(diǎn)是在對(duì)象建立時(shí)它會(huì)被自動(dòng)執(zhí)行,因此用于變量、對(duì)象的初始化代碼一般放在構(gòu)造函數(shù)中。 C+規(guī)定,一個(gè)類的構(gòu)造函數(shù)必須與相應(yīng)的類同名,它可以帶參數(shù),也可以不帶參數(shù),與一般的成員函數(shù)定義相同,可以重載,也可以有默認(rèn)的形參值。例如: 例Constructor.cpp 設(shè)計(jì)類的構(gòu)造函數(shù),1.3.2 構(gòu)造函數(shù)和析構(gòu)函數(shù),2. 析構(gòu)函數(shù) 與構(gòu)造函數(shù)相對(duì)應(yīng)的是析構(gòu)函數(shù)(Destructor)。析構(gòu)函數(shù)是C+

22、類中另一個(gè)特殊的成員函數(shù),它只是在類名稱前加上一個(gè)“”符號(hào)(邏輯非),以與構(gòu)造函數(shù)功能相反。其格式如下:,() ,1.3.3 new和delete,在C+中,new和delete是運(yùn)算符,它們能有效地、直接地在堆內(nèi)存區(qū)中進(jìn)行內(nèi)存的動(dòng)態(tài)分配和釋放。例如: double *p; p = new double; *p = 30.4;/ 將值存放p所指向的內(nèi)存空間中 delete p; p = NULL;/ 一個(gè)好的習(xí)慣 其中,“p = new double;”是將自動(dòng)根據(jù)double類型的空間大小開(kāi)辟一個(gè)內(nèi)存空間,并將其首地址作為指針變量p的值。當(dāng)然,也可在開(kāi)辟內(nèi)存空間時(shí),對(duì)內(nèi)存空間里的內(nèi)容進(jìn)行初始

23、化。如上述代碼可寫(xiě)成: double *p; p = new double(30.4);/ 使p所指向的內(nèi)存空間的初值為30.4,1.3.4 this指針,this指針是類中一個(gè)特殊指針,當(dāng)類實(shí)例化(用類定義對(duì)象)時(shí),this指針的指向?qū)ο笞约?,而在類的聲明時(shí)指向類本身。 下面來(lái)看一個(gè)示例,它是通過(guò)this指針用另一個(gè)對(duì)象直接給對(duì)象賦值。 在類CPoint中,使用this指針的成員函數(shù)是Copy,此時(shí)this指針指向類自己,在成員函數(shù)Copy中,由于語(yǔ)句“*this = one”等到對(duì)象調(diào)用時(shí)才會(huì)執(zhí)行,因而當(dāng)在main函數(shù)調(diào)用“pt1.Copy(pt2);”時(shí),this指針指向?qū)ο髉t1,此時(shí)

24、“*this = one”是將one的內(nèi)容拷貝到類對(duì)象pt1中,這樣就使得pt1的數(shù)據(jù)成員的值等于pt2的數(shù)據(jù)成員的值。因此main函數(shù)中最后的語(yǔ)句“pt1.print();”輸出的結(jié)果就是等于pt2的結(jié)果。程序運(yùn)行的結(jié)果如下:,1.3.4 this指針,當(dāng)成員函數(shù)的形參名與該類的成員變量名同名時(shí),則必須用this指針來(lái)顯式區(qū)分,例如: class CPoint public: CPoint( int x = 0, int y = 0) this-x = x;this-y = y; void Offset(int x, int y) (*this).x += x; (*this).y += y

25、; void Print() const coutPoint(x, y)endl; private: int x, y; ;,1.3.5 繼承和派生,1. 派生類的定義 在C+中,一個(gè)派生類的定義可按下列格式:,class : , , ;,1.3.5 繼承和派生,2. 繼承方式 類的繼承使得基類可以向派生類傳遞基類的屬性和方法,但在派生類中訪問(wèn)基類的屬性和方法不僅取決于基類成員的訪問(wèn)屬性而且還取決于其繼承方式。 繼承方式能有條件地改變了在派生類中的基類成員的訪問(wèn)屬性,從而使派生類對(duì)象對(duì)派生類中的自身成員和基類成員的訪問(wèn)均取決于成員的訪問(wèn)屬性。C+繼承方式有3種:public(公有)、priva

26、te(私有)及protected(保護(hù))。,1.3.5 繼承和派生,3. 派生類數(shù)據(jù)成員初始化 C+規(guī)定,派生類中對(duì)象成員初值的設(shè)定應(yīng)在初始化列表中進(jìn)行,因此一個(gè)派生類的構(gòu)造函數(shù)的定義可有下列格式:,1.3.5 繼承和派生,4. 基類成員的訪問(wèn) 假設(shè),派生類B公有繼承了基類A,A中的公有成員為m,則在派生類B及其對(duì)象中訪問(wèn)基類A成員m的方式有: 若派生類B中無(wú)任何和A基類成員m同名的成員時(shí),則可在派生類B中直接引用m。若有同名成員存在,則在派生類B中須指定成員所屬的類,即訪問(wèn)形式為“A:m”。 若派生類B對(duì)象oB是一個(gè)普通對(duì)象,當(dāng)派生類B中無(wú)任何和A基類成員m同名的成員時(shí),則通過(guò)oB訪問(wèn)基類成

27、員m的形式為“oB.m”。若派生類B中有同名成員m存在,則通過(guò)oB訪問(wèn)基類成員m的形式為“oB.A:m”。 若派生類B對(duì)象poB是一個(gè)指針對(duì)象,當(dāng)派生類B中無(wú)任何和A基類成員m同名的成員時(shí),則通過(guò)poB訪問(wèn)基類成員m的形式為“poB-m”,若派生類B中有同名成員m存在,則通過(guò)poB訪問(wèn)基類成員m的形式為“poB-A:m”。,1.3.6 虛函數(shù),多態(tài)(Polymorphism),是指不同類型的對(duì)象接收相同的消息時(shí)產(chǎn)生不同的行為。在C+中,多態(tài)可分為2種:編譯時(shí)的多態(tài)和運(yùn)行時(shí)的多態(tài)。 虛函數(shù)是用關(guān)鍵字virtual來(lái)修飾基類中的public或protected的成員函數(shù)。在基類中,虛函數(shù)定義的一般

28、格式如下:,virtual ( ) ,例VirtualFunc.cpp 虛函數(shù)的動(dòng)態(tài)聯(lián)編,程序運(yùn)行的結(jié)果如下:,1.4 MFC編程,1.4.1 MFC概述 在用MFC應(yīng)用程序向?qū)?chuàng)建的程序中仍然保留stdafx.h頭文件包含,它是每個(gè)應(yīng)用程序所必有的預(yù)編譯頭文件,程序所用到的Visual C+頭文件包含語(yǔ)句一般均添加到這個(gè)文件中。MFC類的基本層次結(jié)構(gòu)如圖1.10所示。,1.4.2 MFC程序框架,來(lái)看一個(gè)MFC應(yīng)用程序。 例Ex_HelloMFC 基本MFC的Windows程序框架 創(chuàng)建一個(gè)“一個(gè)空工程”類型的Win32 Application項(xiàng)目Ex_HelloMFC。 選擇“文件”“新建

29、”菜單命令,顯示出“新建”對(duì)話框。單擊“文件”標(biāo)簽,在左邊的文件類型列表框中選擇C+ Source File項(xiàng),在右邊的“文件”下的編輯框中鍵入HelloMFC.cpp,單擊 按鈕。,1.4.2 MFC程序框架, 在文檔窗口中輸入上面的代碼,選擇“工程”“設(shè)置”菜單命令,在出現(xiàn)的對(duì)話框中選擇“常規(guī)”(General)標(biāo)簽,然后在“Microsoft 基礎(chǔ)類”組合框中,選擇“Use MFC in a Shared DLL(使用MFC作為一個(gè)共享DLL)”,如圖1.11所示,單擊 確定按鈕。 編譯運(yùn)行,結(jié)果如圖1.12所示。,1.4.3 程序運(yùn)行機(jī)制,從示例Ex_HelloMFC可以看出,MFC是

30、使用afxwin.h來(lái)代替頭文件windows.h,但在Ex_HelloMFC程序中卻看不到Windows應(yīng)用程序所必須的程序入口函數(shù)WinMain。這是因?yàn)镸FC將它隱藏在應(yīng)用程序框架內(nèi)部了。 下面來(lái)看看上述程序中InitInstance的執(zhí)行過(guò)程: 首先執(zhí)行的是: m_pMainWnd = new CMainFrame(); 該語(yǔ)句用來(lái)創(chuàng)建從CFrameWnd類派生而來(lái)的用戶框架窗口CMainFrame類對(duì)象,繼而調(diào)用該類的構(gòu)造函數(shù),使得Create函數(shù)被調(diào)用,完成了窗口創(chuàng)建工作。 然后執(zhí)行后面兩句,用作窗口的顯示和更新。 m_pMainWnd-ShowWindow(m_nCmdShow)

31、; m_pMainWnd-UpdateWindow(); 最后返回TRUE,表示窗口創(chuàng)建成功。,1.4.4 消息映射,按照MFC的消息映射機(jī)制,映射一個(gè)消息的過(guò)程是由三個(gè)部分組成的: 在處理消息的類中,使用消息宏DECLARE_MESSAGE_MAP()聲明對(duì)消息映射的支持,并在該宏之前聲明消息處理函數(shù)。例如前面示例中的: protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() 使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在類聲明之后的地方定義該類支持的消息映射入口點(diǎn),所有消息映射宏都添加在這里,當(dāng)然不同的消

32、息MFC都會(huì)有不同的消息映射宏。例如: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) END_MESSAGE_MAP(),1.4.4 消息映射,定義消息處理函數(shù)。例如: void CMainFrame:OnPaint() CPaintDC dc(this); CRectrc; GetClientRect( ,1.5 MFC應(yīng)用程序框架,1.5.1 MFC應(yīng)用程序類型 Visual C+ 6.0中的MFC AppWizard能為用戶快速、高效、自動(dòng)地生成一些常用的標(biāo)準(zhǔn)程序結(jié)構(gòu)和編程風(fēng)格,它們被稱為應(yīng)用程序框架結(jié)構(gòu)。MFC AppWizard提供的應(yīng)用程序框架類

33、型如表1.3所示。,1.5.2 文檔應(yīng)用程序創(chuàng)建,1. 創(chuàng)建 啟動(dòng)Visual C+ 6.0,選擇“文件”“新建”菜單,在彈出的“新建”對(duì)話框的工程標(biāo)簽頁(yè)面中,選擇MFC AppWizard(exe)的項(xiàng)目類型。單擊位置框右側(cè)的按鈕 ,在彈出的對(duì)話框中,將該應(yīng)用程序的文件夾定位在“E:Visual C+程序第1章”,并在工程名稱編輯框中輸入應(yīng)用程序名Ex_SDI,結(jié)果如圖1.13所示。,1.5.2 文檔應(yīng)用程序創(chuàng)建,2. 第一步 單擊 按鈕進(jìn)入下一步,出現(xiàn)如圖1.14所示的對(duì)話框。,1.5.2 文檔應(yīng)用程序創(chuàng)建,3. 第二步 單擊 按鈕,出現(xiàn)如圖1.15所示的對(duì)話框。,1.5.2 文檔應(yīng)用程序

34、創(chuàng)建,4. 第三步 保留默認(rèn)選項(xiàng),單擊下一步按鈕,出現(xiàn)如圖1.16所示的對(duì)話框。,1.5.2 文檔應(yīng)用程序創(chuàng)建,5. 第四步 保留默認(rèn)選項(xiàng),單擊 下一步按鈕,出現(xiàn)如圖1.17所示的對(duì)話框。,1.5.2 文檔應(yīng)用程序創(chuàng)建,6. 第五步 保留默認(rèn)選項(xiàng),單擊下一步按鈕,彈出如圖1.18所示的對(duì)話框。,1.5.2 文檔應(yīng)用程序創(chuàng)建,7. 第六步 保留默認(rèn)選項(xiàng),單擊 按鈕,出現(xiàn)如圖1.19所示的對(duì)話框。,1.5.2 文檔應(yīng)用程序創(chuàng)建,8. 編譯并運(yùn)行 單擊編譯工具欄 上的運(yùn)行工具按鈕“ ”或按快捷鍵Ctrl+F5,系統(tǒng)開(kāi)始編譯、連接并運(yùn)行生成的單文檔應(yīng)用程序可執(zhí)行文件Ex_SDI.exe,運(yùn)行結(jié)果如圖1.20所示。,1.5.3 項(xiàng)目文件和項(xiàng)目配置,Visual C+是用文件夾來(lái)管理一個(gè)應(yīng)用程序項(xiàng)目的,且將項(xiàng)目名作為文件夾名,在此文件夾下包含源程序代碼文件(.cpp,.h)、項(xiàng)目文件(.dsp)以及項(xiàng)目工作區(qū)文件(.dsw)等。表1.4列出了這些文件類型的的含義。,1.5.3 項(xiàng)目文件和項(xiàng)目配置,除了上述文件外,還有相應(yīng)的Debug(調(diào)試)或Re

溫馨提示

  • 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)論