課件:《網(wǎng)絡(luò)程序設(shè)計》第04章附錄1--VC++MFC-簡明教程_第1頁
課件:《網(wǎng)絡(luò)程序設(shè)計》第04章附錄1--VC++MFC-簡明教程_第2頁
課件:《網(wǎng)絡(luò)程序設(shè)計》第04章附錄1--VC++MFC-簡明教程_第3頁
課件:《網(wǎng)絡(luò)程序設(shè)計》第04章附錄1--VC++MFC-簡明教程_第4頁
課件:《網(wǎng)絡(luò)程序設(shè)計》第04章附錄1--VC++MFC-簡明教程_第5頁
已閱讀5頁,還剩113頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2022/7/201MFC編程入門簡明教程原著:Marshall Brain編譯:張圣華2022/7/202MFC 編程入門 本階段課程的目的是幫助你理解和掌握 Visual C+ MFC 編程的基本概念和技術(shù)。很多人使用 Visual C+,開始于 AppWizard,使用它建立一程序框架,然后就不知道下一步該如何是好了。這主要是因為不理解 AppWizard 所產(chǎn)生的 MFC 代碼的含義。所以你必須了解和掌握 MFC 代碼結(jié)構(gòu),才能繼續(xù)下去。 課程將從最基礎(chǔ)的出發(fā),向你介紹驅(qū)動 MFC 程序的基本概念。使你能更好地理解 MFC 和 AppWizard 所產(chǎn)生的代碼。2022/7/203第一

2、部分 MFC 導(dǎo)論 第二部分 一個簡單的 MFC 程序 第三部分 MFC 樣式 第四部分 消息映射 目 錄2022/7/204第一部分MFC導(dǎo)論 Visual C+ 不僅僅是一個編譯器。它是一個全面的應(yīng)用程序開發(fā)環(huán)境,使用它你充分利用具有面向?qū)ο筇匦缘?C+ 來開發(fā)出專業(yè)級的 Windows 應(yīng)用程序。 為了能充分利用這些特性,你必須理解 C+ 程序設(shè)計語言。掌握了C+,你就必須掌握 Microsoft 基本類庫 (MFC) 的層次結(jié)構(gòu)。該層次 結(jié)構(gòu)包容了 Windows API 中的用戶界面部分,并使你能夠很容易地以面向?qū)ο蟮姆绞浇?Windows 應(yīng)用程序。這種層次結(jié)構(gòu)適用于所有版本的

3、Windows 并彼此兼容。你用 MFC 所建立的代碼是完全可移植的。2022/7/205本章將向你介紹 MFC 的基本概念和術(shù)語以及事件驅(qū)動程序設(shè)計方法。 在本節(jié)中,你將會輸入、編譯和運行一個簡單的MFC程序。下一節(jié)中將向你詳細(xì)解釋這些代碼。第三節(jié)討論 MFC 控制和如何定制它們。第四節(jié)將介紹消息映射,你將會處理 MFC 的事件。2022/7/206什么是 MFC ? 如果你要建立一個 Windows 應(yīng)用程序,應(yīng)該如何下手? 好的開端是從設(shè)計用戶界面開始。首先,你要決定什么樣的用戶能使用該程序并根據(jù)需要來設(shè)置相應(yīng)的用戶界面對象。Windows 用戶界面有一些標(biāo)準(zhǔn)的控制,如按鈕、菜單、滾動條

4、和列表等,這對那些 Windows 用戶已經(jīng)是很熟悉了。 要記住的是,作為程序員必須選擇一組控制并決定如何把它們安排到屏幕上。傳統(tǒng)上,你需要在紙上做一下用戶界面的草圖,直到對各元素感到滿意為止。這對于一些比較小的項目,以及一些大項目的早期原型階段是可以的。2022/7/207下一步,是要實現(xiàn)代碼。為任何 Windows 平臺建立應(yīng)用程序時,程序員都有兩種選擇:C 或 C+。 使用 C,程序員是在 Windows 應(yīng)用程序界面 ( API ) 的水平上編寫代碼。該界面是由幾百個 C 函數(shù)所組成,這些函數(shù)在Windows API 參考手冊中都有介紹。對于Windows NT, API 被稱為 “W

5、in32 API”,以區(qū)別于其用于Windows 3.1的16位 API。2022/7/208Microsoft 也提供了 C+ 庫,它位于任何 Windows API 之上,能夠使程序員的工作更容易。它就是Microsoft基本類庫 (MFC),該庫的主要優(yōu)點是效率高。它減少了大量在建立 Windows 程序時必須編寫的代碼。同時它還提供了所有一般 C+ 編程的優(yōu)點,例如繼承和封裝。MFC 是可移植的,例如,在 Windows 3.1下編寫的代碼可以很容易地移植到 Windows NT 或 Windows 95 上。因此,MFC 是很值得推薦的開發(fā)Windows 應(yīng)用程序的方法,在本章自始至

6、終使用的都是 MFC。2022/7/209 當(dāng)使用 MFC 時,你編寫的代碼是用來建立必要的用戶界面控制并定制其外觀。同時你還要編寫用來響應(yīng)用戶操作這些控制的代碼。例如,如果用戶單擊一個按鈕時,你應(yīng)該有代碼來響應(yīng)。這就是事件驅(qū)動代碼,它構(gòu)成了所有應(yīng)用程序。一旦應(yīng)用程序正確的響應(yīng)了所有允許的控制,它的任務(wù)也就完成了。 你可以看出,使用 MFC 進(jìn)行 Windows 編程時是一件比較容易的的過程。本章的目的是比較詳細(xì)地教你如何快速建立專業(yè)級的應(yīng)用程序的技術(shù)。Visual C+ 應(yīng)用程序開發(fā)環(huán)境特別適合于使用 MFC (也有其它開發(fā)環(huán)境使用MFC),所以一起學(xué)習(xí) MFC 和 Visual C+ 能夠

7、增強你的開發(fā)程序的能力。2022/7/2010Windows詞匯 在 Windows 用戶界面和軟件開發(fā)中所要用到的詞匯都是基本和唯一的。對于新接觸該環(huán)境的用戶,下面復(fù)習(xí)幾個定義以便使我們的討論更加容易。 Windows應(yīng)用程序使用幾個標(biāo)準(zhǔn)的控制: 靜態(tài)文本標(biāo)簽 按鈕 列表框 組合框(一種更高級的列表框) 單選按鈕 檢查按鈕 編輯框(單行和多行) 滾動條2022/7/2011 你可以通過代碼或“資源編輯器”來建立這些控制,在資源編輯器中可以建立對話框和這些控制。在本章中,我們將使用代碼來建立它們。 Windows支持幾種類型的應(yīng)用程序窗口。一個典型的應(yīng)用程序應(yīng)該活動在稱為“框架窗口”中。一個框

8、架窗口是一個全功能的主窗口,用戶可以改變尺寸、最小化、最大化等。 Windows也支持兩種類型的對話框:模式和無模式對話框。模式對話框一旦出現(xiàn)在屏幕上,只有當(dāng)它退出時,屏幕上該應(yīng)用程序的其余部分才能響應(yīng)。無模式對話框出現(xiàn)在屏幕上時,程序的其余部分也可以作出響應(yīng),它就象浮動在上面一樣。2022/7/2012最簡單的 Windows 應(yīng)用程序是使用單文檔界面(SDI),只有一個框架窗口。Windows 的鐘表、PIF 編輯器、記事本等都是 SDI 應(yīng)用程序的例子。 Windows 也提供了一種稱為多文檔界面(MDI)的組織形式,它可用于更復(fù)雜的應(yīng)用程序。MDI 系統(tǒng)允許用戶在同一應(yīng)用程序中同時可以

9、查看多個文檔。例如,一個文本編輯器可以允許用戶同時打開多個文本文件。使用 MDI 時,應(yīng)用程序有一個主窗口,在主窗口中有一些子窗口,每個子窗口中各自包含有各自的文檔。在MDI框架中,主窗口有一個主菜單,它對主框架中最頂端窗口有效。各子窗口都可以縮成圖標(biāo)或展開,MDI主窗口也可以變成桌面上的一個圖標(biāo)。MDI界面可能會給你一種第二桌面的感覺,它對窗口的管理和刪除混亂的窗口有很大的幫助。2022/7/2013 你所建立的每一個應(yīng)用程序都會使用它自己的一套控制、菜單結(jié)構(gòu)以及對話框。應(yīng)用程序界面的好壞取決于你如何選擇和組織這些界面對象。 Visual C+ 中的資源編輯器可以使你能容易的建立和定制這些界

10、面對象。2022/7/2014事件驅(qū)動軟件和詞匯 所有基于窗口的 GUI 都包含相同的基本元素,它們的操作方式都是相同的。在屏幕上,用戶所看到的是一組窗口,每個窗口都包含有控制、圖標(biāo)、對象以及一些處理鼠標(biāo)和鍵盤的元素。 從用戶角度來看,各系統(tǒng)的界面對象都是相同的:按鈕、滾動條、圖標(biāo)、對話框以及下拉菜單等等。盡管這些界面元素的“外觀和感覺”可能有些不同,但這些界面對象的工作方式都是相同的。例如,滾動條對于Windows和Macintosh可能有些不同,但他們的作用完全是一樣的。2022/7/2015從程序員的角度來看,這些系統(tǒng)在概念上是相似的,盡管它們可能有很大的不同。為了建立 GUI 程序,程

11、序員第一步要把所有需要的用戶界面控制都放到窗口上。 例如,如果程序員要建立一個從攝氏到華氏的轉(zhuǎn)換的簡單程序,則程序員要選擇用戶界面對象來完成并在屏幕上把結(jié)果顯示出來。在這個簡單的程序中,程序員可能需要用戶在一個可編輯的編輯框中輸入溫度值,在一個不可編輯的編輯框中顯示轉(zhuǎn)換結(jié)果,然后讓用戶可以單擊一個標(biāo)有“退出”的按鈕來退出應(yīng)用程序。2022/7/2016因為是用戶來操作應(yīng)用程序的控制,所以程序必須作出響應(yīng)。所做的響應(yīng)依賴于用戶使用鼠標(biāo)或鍵盤在不同控制上的操作。屏幕上的每個用戶界面對象對事件的響應(yīng)是不同的。例如,如果用戶單擊退出按鈕,則該按鈕必須更新屏幕、加亮它自己。然后程序必須響應(yīng)退出。 Win

12、dows 所用的模式也是類似的。在一個典型的應(yīng)用程序中,你將建立一個主窗口,并且在其中放置了一些用戶界面控制。這些控制通常被稱為子窗口它們就象一些在主窗口中的更小更特殊的子窗口。作為程序員,你應(yīng)該通過函數(shù)調(diào)用來發(fā)送信息操作這些控制、通過把信息發(fā)送給你的代碼來響應(yīng)用戶的操作。2022/7/2017如果你從未做過事件驅(qū)動程序設(shè)計,則所有這些對你來說可能是很陌生的。但是,事件驅(qū)動程序設(shè)計方式是很容易理解的。具體的細(xì)節(jié)對不同的系統(tǒng)可能有些不同,但是其基本概念是類似的。 在一個事件驅(qū)動界面中,應(yīng)用程序會在屏幕上繪制幾個界面對象,如按鈕、文本區(qū)和菜單。應(yīng)用程序通常通過一段稱為事件循環(huán)的代碼來響應(yīng)用戶的操作

13、。 用戶可以使用鼠標(biāo)或鍵盤來任意操作屏幕上的對象。例如,用戶用鼠標(biāo)單擊一個按鈕。用鼠標(biāo)單擊就稱為一個事件。事件驅(qū)動系統(tǒng)把用戶的動作如鼠標(biāo)單擊和鍵盤操作定義為事件,也把系統(tǒng)操作如更新屏幕定義為事件。2022/7/2018在比較低級的編程方法中,如用C直接編寫Windows API 應(yīng)用程序,代碼量是非常大的,因為你所要照顧的細(xì)節(jié)太多了。 例如,你用某種類型的結(jié)構(gòu)來接收單擊鼠標(biāo)事件。你的事件循環(huán)中的代碼會查看結(jié)構(gòu)中不同域,以確定哪個用戶界面對象受到了影響,然后會完成相應(yīng)的操作。 當(dāng)屏幕上有很多對象時,應(yīng)用程序會變得很大。只是簡單地處理哪個對象被單擊和對它需要做些什么就要花費大量的代碼。2022/7

14、/2019 幸運的是,你可以用比較高級的方法來進(jìn)行編程,這就是使用MFC。 在MFC中,幾乎所有的低級的細(xì)節(jié)處理都為你代辦了。如果你把某一用戶界面對象放在屏幕上,你只需要兩行代碼來建立它。如果用戶單擊一個按鈕,則按鈕自己會完成一切必要的操作,從更新屏幕上的外觀到調(diào)用你程序中的預(yù)處理函數(shù)。該函數(shù)包含有對該按鈕作出相應(yīng)操作的代碼。 MFC 為你處理所有的細(xì)節(jié):你建立按鈕并告知它特定的處理函數(shù),則當(dāng)它被按下時,它就會調(diào)用相應(yīng)的函數(shù)。第四節(jié)介紹了怎樣使用消息映射來處理事件。2022/7/2020例子 理解一個典型的 MFC 程序的結(jié)構(gòu)和樣式的最好方法是輸入一段小程序,然后編譯和運行它。下面的程序是一段

15、簡單的“hello world”程序。這對很多C程序員都是很熟悉了,讓我們看一下如何用MFC方法來實現(xiàn)。如果你是第一次看到這類程序,也許比較難理解。這沒關(guān)系,我們后面會詳細(xì)介紹?,F(xiàn)在你只要用Visual C+ 環(huán)境中建立、編譯和運行它就可以了。2022/7/2021/hello.cpp #include / 說明應(yīng)用程序類 class CHelloApp : public CWinApp public: virtual BOOL InitInstance(); ; / 建立應(yīng)用程序類的實例 CHelloApp HelloApp; / 說明主窗口類 class CHelloWindow : pu

16、blic CFrameWnd CStatic* cs; public: CHelloWindow(); ; 2022/7/2022/ 每當(dāng)應(yīng)用程序首次執(zhí)行時都要調(diào)用的初始化函數(shù) BOOL CHelloApp:InitInstance() m_pMainWnd = new CHelloWindow(); m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); return TRUE; / 窗口類的構(gòu)造函數(shù) CHelloWindow:CHelloWindow() / 建立窗口本身 Create(NULL, Hello World!

17、, WS_OVERLAPPEDWINDOW, CRect(0,0,200,200); / 建立靜態(tài)標(biāo)簽 cs = new CStatic(); cs-Create(hello world, WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80,150,150), this); 2022/7/2023 上面的這段程序如果用C來實現(xiàn),得需要幾頁的代碼。這個簡單的例子做了三件事。 第一,它建立了一個應(yīng)用程序?qū)ο蟆D闼帉懙拿總€ MFC 程序都有一個單一的程序?qū)ο?,它是處?MFC 和 Windows 的初始化細(xì)節(jié)的。 第二,應(yīng)用程序建立了一個窗口來作為應(yīng)用程序的主窗口

18、。 最后,在應(yīng)用程序的窗口中建立了一個靜態(tài)文本標(biāo)簽,它包含有“hello world”幾個字。在第二節(jié)中我們會仔細(xì)研究這段程序,以理解其結(jié)構(gòu)。2022/7/2024啟動 VC+,如果你是剛剛安裝好,則你會在屏幕上看到一個帶有工具欄的空窗口。如果 VC+ 已經(jīng)在該機器上使用過了,則所顯示的窗口可能有些不同,因為 VC+ 會記憶和自動重新打開上次使用后退出時的項目和文件。我們需要的是它沒有裝如任何項目和代碼。 如果程序啟動后彈出對話框指示不能打開某些文件,你只要單擊“No”即可。在“Window”菜單中選取“Close All”選項關(guān)閉所有窗口。在“File”菜單中選取“Close”選項來關(guān)閉其它

19、窗口。現(xiàn)在,你就處于開始狀態(tài)了。2022/7/2025 如果你以后不希望看到“InfoViewer Topic”窗口,你可以把它關(guān)掉。如果以后需要的話,你還可以打開該窗口。 現(xiàn)在一切都正常了。正如你所看到的,頂部是菜單和幾個工具欄。左邊的窗口所顯示的是在線幫助內(nèi)容,你可以雙擊某項標(biāo)題來瀏覽其內(nèi)容。在線幫助的內(nèi)容是十分豐富的。 現(xiàn)在該做什么了?你所要做的是輸入上面的程序,然后編譯并運行它。開始之前,要檢查以下你的硬盤上至少要留有5MB的剩余空間。2022/7/2026建立項目和編譯代碼 為了在 Visual C+ 中編譯代碼,你必須要建立一個項目。為了這么小的程序來建立一個項目可能有點小題大作,

20、但是,在任何實際的程序中,項目的概念是非常有用的。一個項目主要保存著下面三種不同類型的信息: 1. 它可以記住建立一個可執(zhí)行程序所需要的所有源程序代碼文件。 在這個簡單的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一個大型的應(yīng)用程序中,為了便于管理和維護(hù),你可以會有許多個不同的源文件。項目會維護(hù)這些不同文件的列表,并當(dāng)你要建立下一個新的可執(zhí)行程序時,在必要時編譯它們。2022/7/20272.它會記住針對你的應(yīng)用程序所使用的編譯器和鏈接器選項。例如,它會記住把哪個庫連接到了執(zhí)行程序中,你是否預(yù)編譯了頭文件等等。3.它會記住你想要建立的項目類型: 一個控制臺應(yīng)用程序,或一個窗口應(yīng)用程

21、序等等。如果你已經(jīng)對項目文件有所了解,則會很容易明白作為機器產(chǎn)生的項目文件的作用?,F(xiàn)在,我們來建立一個簡單的項目,并用它來編譯 HELLO.CPP。2022/7/2028 首先從“File”菜單中選擇“New”選項。在“Projects”標(biāo)簽中,單擊“Win32 Application”。在“Location”域中輸入一個合適的路徑名或單擊“Browse”按鈕來選擇一個。在“Project name”中輸入“hello”作為項目名稱。這時候你會看到“hello”也會出現(xiàn)在“Location”域中。單擊“OK”按鈕。Visual C+ 會建立一個新的稱為 HELLO 的目錄,并把所有的項目文件

22、HELLO.OPT、HELLO.NCB、HELLO.DSP 和 HELLO.DSW 都放到該目錄中。如果你退出,以后再重新打開該項目,則可選擇 HELLO.DSW。 現(xiàn)在,在屏幕的左邊,出現(xiàn)了三個標(biāo)簽。InfoView 標(biāo)簽仍然在,又新出現(xiàn)了 ClassView 和 FileView 標(biāo)簽。ClassView 標(biāo)簽會把你程序中所有的類都列出來,F(xiàn)ileView 標(biāo)簽給出了項目中文件的列表。2022/7/2029 現(xiàn)在可以輸入程序的代碼了。在“File”菜單中選擇“New”選項來建立一個編輯窗口。在出現(xiàn)的對話框中,選擇“Files”標(biāo)簽和“Text File”。則會出現(xiàn) Visual C+ 的智

23、能編輯器,你可以用它來輸入上面的程序代碼。輸入代碼時,你會發(fā)現(xiàn)編輯器會自動把不同類型的文本變成不同的顏色,如注釋、關(guān)鍵字字符串等的顏色都不同。如果你要改變其顏色或關(guān)閉顏色功能,可選擇“Tools”菜單中“Options”選項,然后選擇“Format”標(biāo)簽和“Source Windows”選項就可以修改。 輸入完代碼后,選擇“File”菜單中的“Save”選項來保存。在 Visual C+ 新建立的目錄中,把它存成 HELLO.CPP 文件。2022/7/2030現(xiàn)在選擇在“Project”菜單中選擇“Add To Project”選項,再選“Files.”。你會看到一個對話框供你選擇要添加的文

24、件。在本例子中,選擇 HELLO.CPP 文件。 在屏幕的左邊,單擊 FileView 標(biāo)簽,并雙擊標(biāo)有 HELLO 的圖標(biāo)。你會看到名為 HELLO.CPP 的文件。單擊 ClassView 標(biāo)簽,并雙擊文件夾圖標(biāo),你會看到程序中所有的類。任何時候你都可以使用 FileView 來刪除項目的文件,你只要單擊該文件,然后按鍵盤上的 delete 鍵。 最后,此時你必須告訴項目要使用MFC庫。如果你忽略了這一步,則項目在鏈接時會出錯,而出錯信息對你毫無幫助。2022/7/2031 選擇“Project” 菜單的“Settings”。在出現(xiàn)的對話框中選擇“General” 標(biāo)簽。在“ Micros

25、oft Foundation Classes”組合框中,選擇“Use MFC in a Shared DLL”。然后關(guān)閉對話框。 我們已經(jīng)建立了項目文件,并調(diào)整了設(shè)置,你現(xiàn)在可以準(zhǔn)備編譯 HELLO.CPP 程序了。在“Build”菜單中,你會發(fā)現(xiàn)有三個不同的編譯選項: 1. Compile HELLO.CPP (只有當(dāng)含有 HELLO. CPP 的窗口處于激活狀態(tài)時才可) 2. Build HELLO.EXE 3. Rebuild All 2022/7/2032第一個選項只是編譯源文件并形成它們的目標(biāo)文件。該選項不能完成鏈接任務(wù),所以它只對快速編譯一些源文件以檢查錯誤有用。第二個選項編譯自上

26、次編譯后所修改的所有源文件,并鏈接形成可執(zhí)行文件。第三個選項要重新編譯和鏈接所有的源文件。 我們可以選擇“Build HELLO.EXE”來編譯和鏈接代碼。Visual C+ 會建立一個名為“Debug”的新子目錄,并把 HELLO.EXE 放在該目錄中。該子目錄的文件都是可以再產(chǎn)生的,所以你可以任意刪除它們。2022/7/2033 如果你發(fā)現(xiàn)了編譯錯誤,雙擊輸出窗口中的錯誤信息。這時編輯器會把你帶到出錯的位置處。檢查你的代碼是否有問題,如果有,就修改之。如果你看到大量的鏈接錯誤,則可能你在建立項目對話框中所指定的項目類型不對。你可以把該項目所在的子目錄刪除,然后再重新按上面的步驟來建立。 為

27、了執(zhí)行該程序,你可選擇“Build”菜單中的“Execute HELLO.EXE”選項。你就可以看到你的第一個MFC程序了 出現(xiàn)一個帶有“hello world”的窗口。該窗口本身帶有:標(biāo)題欄、尺寸縮放區(qū)、最大和最小按鈕等等。在窗口中,有一個標(biāo)有“hello world”的字串。請注意,該程序是完整的。你可以移動窗口、縮放窗口、最小化等。你只使用了很少的代碼就完成了一個完整的 Window 應(yīng)用程序。這就是使用 MFC 的優(yōu)點。所有的細(xì)節(jié)問題都有MFC來處理。2022/7/2034結(jié)論 在本節(jié)中,我們已經(jīng)成功地編譯和執(zhí)行了第一個 MFC 程序。你將來會用類似的步驟來建立應(yīng)用程序。你可以為每個項

28、目建立單獨的目錄,或建立一個單獨的項目文件,然后再添加或刪除不同的源文件。 在下一節(jié)中,我們將仔細(xì)研究該程序,你會更完整的理解它的結(jié)構(gòu)。2022/7/2035第二部分 一個簡單的MFC程序 在本節(jié),我們將一段一段地來研究上一節(jié)中提到的 MFC 應(yīng)用程序,以便能理解它的結(jié)構(gòu)和概念框架。我們將先介紹 MFC,然后再介紹如何用 MFC 來建立應(yīng)用程序。MFC簡介 MFC 是一個很大的、擴展了的 C+ 類層次結(jié)構(gòu),它能使開發(fā) Windows 應(yīng)用程序變得更加容易。MFC 是在整個 Windows 家族中都是兼容的,也就是說,無論是 Windows 3.x、Windows95 還是 Windows NT

29、,所使用的 MFC 是兼容的。每當(dāng)新的 Windows 版本出現(xiàn)時,MFC也會得到修改以便使舊的編譯器和代碼能在新的系統(tǒng)中工作。MFC也會得到擴展,添加新的特性,變得更加容易建立應(yīng)用程序。2022/7/2036 與傳統(tǒng)上使用 C 語言直接訪問 Windows API相反,使用 MFC 和 C+ 的優(yōu)點是 MFC 已經(jīng)包含和壓縮了所有標(biāo)準(zhǔn)的“樣板文件”代碼,這些代碼是所有用 C 編寫的 Windows 程序所必需的。因此用 MFC 編寫的程序要比用C語言編寫的程序小得多。另外,MFC 所編寫的程序的性能也毫無損失。必要時,你也可以直接調(diào)用標(biāo)準(zhǔn) C 函數(shù),因為 MFC 不修改也不隱藏 Window

30、s 程序的基本結(jié)構(gòu)。 使用 MFC 的最大優(yōu)點是它為你做了所有最難做的事。MFC 中包含了上成千上萬行正確、優(yōu)化和功能強大的 Windows 代碼。你所調(diào)用的很多成員函數(shù)完成了你自己可能很難完成的工作。從這點上講,MFC 極大地加快了你的程序開發(fā)速度。2022/7/2037 MFC 是很龐大的。例如,版本 4.0 中包含了大約200 個不同的類。萬幸的是,你在典型的程序中不需要使用所有的函數(shù)。事實上,你可能只需要使用其中的十多個 MFC 的不同類就可以建立一個非常漂亮的程序。該層次結(jié)構(gòu)大約可分為幾種不同的類型的類: 應(yīng)用程序框架 圖形繪制的繪制對象 文件服務(wù) 異常處理 結(jié)構(gòu) - List、Ar

31、ray 和 Map Internet 服務(wù) OLE 2 數(shù)據(jù)庫 通用類2022/7/2038 在本章中,我們將集中討論可視對象。下面的列表給出了部分類: CObject CCmdTarget CWinThread CWinApp CWnd CFrameWnd CDialog CView CStatic CButton CListBox CComboBox CEdit CScrollBar 2022/7/2039 在上面的列表中,有幾點需要注意: 第一,MFC 中的大部分類都是從基類 CObject 中繼承下來的。該類包含有大部分MFC類所通用的數(shù)據(jù)成員和成員函數(shù)。 第二,是該列表的簡單性。CW

32、inApp 類是在你建立應(yīng)用程序是要用到的,并且任何程序中都只用一次。CWnd 類匯集了 Windows 中的所有通用特性、對話框和控制:CFrameWnd 類是從 CWnd 繼承來的,實現(xiàn)了標(biāo)準(zhǔn)的框架窗口。CDialog 可分別處理無模式和有模式兩種類型的對話框。CView 是用于讓用戶通過該視圖窗口來訪問文檔。 最后,Windows 支持六種控制類型:靜態(tài)文本框、可編輯文本框、按鈕、滾動條、列表框和組合框(一種擴展的列表框)。一旦你理解了這些,你也就能更好的理解 MFC 了。MFC 中的其它類實現(xiàn)了其它特性,如內(nèi)存管理、文檔控制等。2022/7/2040為了建立一個MFC應(yīng)用程序,你既要會

33、直接使用這些類,而通常你也需要從這些類中派生新的類。在繼承的類中,你可以建立新的成員函數(shù),這能更適用你自己的需要。前面的簡單例子中已經(jīng)看到了這種繼承過程,下面會詳細(xì)介紹。上一節(jié)里的CHelloApp 和 CHelloWindow 都是從已有的 MFC 類中繼承的。2022/7/2041設(shè)計一個程序 在討論代碼本身之前,我們需要花些工夫來簡單介紹一下 MFC 中程序設(shè)計的過程。例如,假如你要編一個程序來向用戶顯示“Hello World”信息。這當(dāng)然是很簡單的,但仍需要一些考慮。 “hello world”應(yīng)用程序首先需要在屏幕上建立一個窗口來顯示“hello world”。然后需要實際把“he

34、llo world”放到窗口上。我們需要 3 個對象來完成這項任務(wù): 1. 一個應(yīng)用程序?qū)ο?,用來初始化?yīng)用程序并把它掛到 Windows 上。該應(yīng)用程序?qū)ο筇幚硭械牡图壥录?2. 一個窗口對象來作為主窗口。 3. 一個靜態(tài)文本對象,用來顯示“hello world”。 2022/7/2042 你用 MFC 所建立的每個程序都會包含頭兩個對象。第三個對象是針對該應(yīng)用程序的。每個應(yīng)用程序都會定義它自己的一組用戶界面對象,以顯示應(yīng)用程序的輸出和收集應(yīng)用的輸入信息。 一旦你完成了界面的設(shè)計,并決定實現(xiàn)該界面所需要的控制,你就需要編寫代碼來在屏幕上建立這些控制。你還會編寫代碼來處理用戶操作這些控制

35、所產(chǎn)生的信息。在“hello world”應(yīng)用程序中,只有一個控制。它用來輸出“hello world”。復(fù)雜的程序可能在其主窗口和對話框中需要上百個控制。 應(yīng)該注意,在應(yīng)用程序中有兩種不同的方法來建立用戶控制。這里所介紹的是用 C+ 代碼方式來建立控制。但是,在比較大的應(yīng)用程序中,這種方法是不可行的。因此,在通常情況下要使用資源文件的圖形編輯器來建立控制。這種方法要方便得多。2022/7/2043理解“hello world”的代碼 下面列出了你在上一講中已經(jīng)輸入、編譯和運行的“hello world” 程序的代碼。添加行號是為了討論方便。我們來一行行地研究它,你會更好的理解 MFC 建立應(yīng)

36、用程序的方式。 如果你還沒有編譯和運行該代碼,應(yīng)該按上一講的方法去做。 1 /hello.cpp 2 #include 3 / Declare the application class 4 class CHelloApp : public CWinApp 5 6 public: 7virtual BOOL InitInstance(); 8 ; 2022/7/20449 / Create an instance of the application class 10 CHelloApp HelloApp; 11 / Declare the main window class 12 class

37、 CHelloWindow : public CFrameWnd 13 14 CStatic* cs; 15 public: 16 CHelloWindow(); 17 ; 18 / The InitInstance function is called each 19 / time the application first executes. 20 BOOL CHelloApp:InitInstance() 21 22 m_pMainWnd = new CHelloWindow(); 23 m_pMainWnd-ShowWindow(m_nCmdShow); 24 m_pMainWnd-U

38、pdateWindow(); 25 return TRUE; 26 2022/7/204527 / The constructor for the window class 28 CHelloWindow:CHelloWindow() 29 30 / Create the window itself 31 Create(NULL, 32 Hello World!, 33 WS_OVERLAPPEDWINDOW, CRect(0,0,200,200); / Create a static label 36 cs = new CStatic(); 37 cs-Create(hello world,

39、 38 WS_CHILD|WS_VISIBLE|SS_CENTER, 39 CRect(50,80,150,150), 40 this); 41 2022/7/2046 把上面的代碼看一遍,以得到一整體印象。該程序由六小部分組成,每一部分都起到很重要的作用。 首先,該程序包含了頭文件 afxwin.h (第 2 行)。該頭文件包含有 MFC 中所使用的所有的類型、類、函數(shù)和變量。它也包含了其它頭文件,如 Windows API 庫等。 第 3 至 8 行從 MFC 說明的標(biāo)準(zhǔn)應(yīng)用程序類 CWinApp 繼承出了新的應(yīng)用程序類 CHelloApp。該新類是為了要重載 CWinApp 中的 Ini

40、tInstance 成員函數(shù)。InitInstance 是一個應(yīng)用程序開始執(zhí)行時要調(diào)用的可重載函數(shù)。2022/7/2047 在第10行中,說明了應(yīng)用程序?qū)嵗鳛橐粋€全局變量。該實例是很重要的,因為它要影響到程序的執(zhí)行。當(dāng)應(yīng)用程序被裝入內(nèi)存并開始執(zhí)行時,全局變量的建立會執(zhí)行 CWinApp 類的缺省構(gòu)造函數(shù)。該構(gòu)造函數(shù)會自動調(diào)用在18至26行定義的 InitInstance 函數(shù)。 在第11至17行中,CHelloWindow 類是從 MFC 中的 CFrameWnd 類繼承來的。CHelloWindow 是作為應(yīng)用程序在屏幕上的窗口。建立新的類以便實現(xiàn)構(gòu)造函數(shù)、析構(gòu)函數(shù)和數(shù)據(jù)成員。 第18至2

41、6行實現(xiàn)了 InitInstance 函數(shù)。該函數(shù)產(chǎn)生一個 CHelloWindow 類的實例,因此會執(zhí)行第27行至41行中類的構(gòu)造函數(shù)。它也會把新窗口放到屏幕上。 第27至41行實現(xiàn)了窗口的構(gòu)造函數(shù)。該構(gòu)造函數(shù)實際是建立了窗口,然后在其中建立一個靜態(tài)文本控制。2022/7/2048要注意的是,在該程序中沒有 main () 或 WinMain() 函數(shù),也沒有事件循環(huán)。然而我們從上一講在執(zhí)行中知道它也處理了事件。窗口可以最大或最小化、移動窗口等等。所有這些操作都隱藏在主應(yīng)用程序類 CWinApp 中,并且我們不必為它的事件處理而操心,它都是自動執(zhí)行、在 MFC 中不可見的。 下一節(jié)中,將詳細(xì)

42、介紹程序的各部分。你可能不能馬上全都理解得很好: 但你最好先讀完它以獲得第一印象。在下一講中,會介紹一些特殊的例子,并會把各片段組合在一起,有助于你能更好的理解。2022/7/2049程序?qū)ο?用 MFC 建立的每個應(yīng)用程序都要包括一個單一從 CWinApp 類繼承來的應(yīng)用程序?qū)ο?。該對象必須被說明成全局的(第10行),并且在你的程序中只能出現(xiàn)一次。 從 CWinApp 類繼承的對象主要是處理應(yīng)用程序的初始化,同時也處理應(yīng)用程序主事件循環(huán)。CWinApp 類有幾個數(shù)據(jù)成員和幾個成員函數(shù)。在上面的程序中,我們只重載了一個 CWinApp 中的虛擬函數(shù) InitInstance。 應(yīng)用程序?qū)ο蟮哪?/p>

43、的是初始化和控制你的程序。因為 Windows 允許同一個應(yīng)用程序的多個實例在同2022/7/2050時執(zhí)行,因此 MFC 把初始化過程分成兩部分并使用兩個函數(shù) InitApplication 和 InitInstance 來處理它。此處,我們只使用了一個 InitInstance 函數(shù),因為我們的程序很簡單。當(dāng)每次調(diào)用應(yīng)用程序時都會調(diào)用一個新的實例。第3至8行的代碼建立了一個稱為 CHelloApp 的類,它是從 CWinApp 繼承來的。它包含一個新的 InitInstance 函數(shù),是從 CWinApp 中已存在的函數(shù)(不做任何事情)重載來的: 3 / Declare the appli

44、cation class 4 class CHelloApp : public CWinApp 5 6 public: 7 virtual BOOL InitInstance(); 8 ;2022/7/2051 在重載的 InitInstance 函數(shù)內(nèi)部,第18至26行,程序使用 CHelloApp 的數(shù)據(jù)成員 m_pMainWnd 來建立并顯示窗口: 18 / The InitInstance function is called each 19 / time the application first executes. 20 BOOL CHelloApp:InitInstance()

45、21 22 m_pMainWnd = new CHelloWindow(); 23 m_pMainWnd-ShowWindow(m_nCmdShow); 24 m_pMainWnd-UpdateWindow(); 25 return TRUE; 26 InitInstance 函數(shù)返回 TRUE 表示初始化已成功的完成。如果返回了FALSE,則表明應(yīng)用程序會立即終止。在下一節(jié)中我們將會看到窗口初始化的詳細(xì)過程。2022/7/2052當(dāng)應(yīng)用程序?qū)ο笤诘?0行建立時,它的數(shù)據(jù)成員(從 CWinApp 繼承來的) 會自動初始化。例如,m_pszAppName、m_lpCmdLine 和 m_nCmd

46、Show 都包含有適當(dāng)?shù)某跏蓟怠D憧蓞⒁?MFC 的幫助文件來獲得更詳細(xì)的信息。我們將使用這些變量中的一個。2022/7/2053窗口對象 MFC 定義了兩個類型的窗口: 1) 框架窗口,它是一個全功能的窗口,可以改變大小、最小化、最大化等等; 2) 對話框窗口,它不能改變大小。 框架窗口是典型的主應(yīng)用程序窗口。 在下面的代碼中,從 CFrameWnd 中繼承了一個新的類 CHelloWindow: 11 / Declare the main window class 12 class CHelloWindow : public CFrameWnd 13 14 CStatic* cs; 15

47、 public: 16 CHelloWindow(); 17 ;2022/7/2054 它包括一個新的構(gòu)造函數(shù) CHelloWindow(),同時還有一個指向程序中所使用的唯一用戶界面控制的數(shù)據(jù)成員 cs 。 你建立的每個應(yīng)用程序在主窗口中都會有唯一的一組控制。因此,繼承類將有一個重載的構(gòu)造函數(shù)以用來在建立主窗口時擁有所需要的一些控制。 典型情況下,該類還會包含有一個析構(gòu)函數(shù)以便在窗口關(guān)閉時來刪除他們。我們這里沒有使用析構(gòu)函數(shù)。 在第四講中,我們將會看到繼承窗口類也會說明一個消息處理函數(shù)來處理這些控制在響應(yīng)用戶事件所產(chǎn)生的消息。2022/7/2055 典型地,一個應(yīng)用程序?qū)⒂幸粋€主應(yīng)用程序窗口

48、。因此,CHelloApp 應(yīng)用程序類定義了一個名為 m_pMainWnd 成員變量來指向主窗口。為了建立該程序的主窗口,InitInstance 函數(shù)(第18至26行)建立了一個 CHelloWindow 實例,并使用 m_pMainWnd 來指向這個新的窗口。我們的 CHelloWindow 對象是在第22行建立的: 18 / The InitInstance function is called each 19 / time the application first executes. 20 BOOL CHelloApp:InitInstance() 21 22 m_pMainWnd

49、= new CHelloWindow(); 23 m_pMainWnd-ShowWindow(m_nCmdShow); 24 m_pMainWnd-UpdateWindow(); 25 return TRUE; 26 2022/7/2056只建立一個簡單的框架窗口是不夠的。還要確保窗口能正確地出現(xiàn)在屏幕上。首先,代碼必須要調(diào)用窗口的 ShowWindow 函數(shù)以使窗口出現(xiàn)在屏幕上(第23行)。其次,程序必須要調(diào)用 UpdateWindow 函數(shù)來確保窗口中的每個控制和輸出能正確地出現(xiàn)在屏幕上(第24行)。 你可能奇怪,ShowWindow 和 UpdateWindow 函數(shù)是在哪兒定義的。例如

50、,如果你要查看以便了解它們,你可能要查看 MFC 的幫助文件中的 CFrameWnd 定義部分。但是 CFrameWnd 中并不包含有這些成員函數(shù)。CFrameWnd 是從 CWnd 類繼承來的。你可以查看 MFC 文檔中的 CWnd,你會發(fā)現(xiàn)它包含有200多個不同的成員函數(shù)。顯然,你不能在幾分鐘內(nèi)掌握這些函數(shù),但是你可以掌握其中的幾個,如 ShowWindow 和UpdateWindow。2022/7/2057現(xiàn)在讓我們花幾分鐘來看一下 MFC 幫助文件中的 CWnd:ShowWindow 函數(shù)。為此,你你可以單擊幫助文件中的 Search 按鈕,并輸入“ShowWindow”。找到后,你會

51、注意到,ShowWindow 只有一個參數(shù),你可以設(shè)置不同的參數(shù)值。 我們把它設(shè)置成我們程序中 CHelloApp 的數(shù)據(jù)成員變量 m_nCmdShow (第23行)。m_nCmdShow 變量是用來說明初始化應(yīng)用程序啟動時的窗口顯示方式。例如,用戶可能在程序管理器中啟動應(yīng)用程序,并可通過應(yīng)用程序?qū)傩詫υ捒騺砀嬷绦蚬芾砥鲬?yīng)用程序在啟動時要保持最小化狀態(tài)。m_nCmdShow 變量將被設(shè)置成 SW_SHOWMINIMIZED,并且應(yīng)用程序會以圖標(biāo)的形式來啟動,也就是說,程序啟動后,是一個代表該程序的圖標(biāo)。m_nCmdShow 變量是一種外界與應(yīng)用程序通訊的方式。如果你愿意,你可以用不同的 m_

52、nCmdShow 值來試驗 ShowWindow 的效果。但要重新編譯程序才能看到效果。2022/7/2058 第22行是初始化窗口。它為調(diào)用 new 函數(shù)分配內(nèi)存。在這一點上,程序在執(zhí)行時會調(diào)用CHelloWindow的構(gòu)造函數(shù)。該構(gòu)造函數(shù)在每次對類的實例被新建分配時都要調(diào)用。在窗口構(gòu)造函數(shù)的內(nèi)部,窗口必須建立它自己。它是通過調(diào)用 CFrameWnd 的 Create 成員函數(shù)來實現(xiàn)的(第31行): 27 / The constructor for the window class 28 CHelloWindow:CHelloWindow() 29 30 / Create the windo

53、w itself 31 Create(NULL, 32 Hello World!, 33 WS_OVERLAPPEDWINDOW, 34 CRect(0,0,200,200);2022/7/2059建立函數(shù)共傳遞了四個參數(shù)。通過查看 MFC 文檔,你可以了解不同類型。NULL 參數(shù)表示使用缺省的類名。第二個參數(shù)為出現(xiàn)在窗口標(biāo)題欄上的標(biāo)題。第三個參數(shù)為窗口的類型屬性。該程序使用了正常的、可覆蓋類型的窗口。在下一講中將詳細(xì)介紹類型屬性。第四個參數(shù)指出窗口應(yīng)該放在屏幕上的位置和大小,左上角為(0,0), 初始化大小為 200200個象素。如果使用了 rectDefault,則 Windows 會為你

54、自動放置窗口及大小。因為我們的程序太簡單了,所以它只在窗口中建立了一個靜態(tài)文本控制。見第35至40行。下面將詳細(xì)介紹。2022/7/2060靜態(tài)文本控制 程序在從 CFrameWnd 類中繼承 CHelloWindow 類時(第11至17行)時,說明了一個成員類型 CStatic及其構(gòu)造函數(shù)。 正如在前面所見到的,CHelloWindow 構(gòu)造函數(shù)主要做兩件事情。第一是通過調(diào)用Create函數(shù)(第31行)來建立應(yīng)用程序的窗口。然后分配和建立屬于窗口的控制。 在我們的程序中,只使用了一個控制。在 MFC 中建一個對象總要經(jīng)過兩步:第一是為類的實例分配內(nèi)存,然后是調(diào)用構(gòu)造函數(shù)來初始化變量。下一步,

55、調(diào)用 Create 函數(shù)來實際建立屏幕上的對象。代碼使用這兩步分配、構(gòu)造和建立了一個靜態(tài)文本對象(第36至40行): 2022/7/206127 / The constructor for the window class 28 CHelloWindow:CHelloWindow() 29 30 / Create the window itself 31 Create(NULL, 32 Hello World!, 33 WS_OVERLAPPEDWINDOW, 34 CRect(0,0,200,200); 35 / Create a static label 36 cs = new CStat

56、ic(); 37 cs-Create(hello world, 38 WS_CHILD|WS_VISIBLE|SS_CENTER, 39 CRect(50,80,150,150), 40 this); 41 2022/7/2062 CStatic 構(gòu)造函數(shù)是在為其分配內(nèi)存時調(diào)用的,然后就調(diào)用了 Create 函數(shù)來建立 CStatic 控制的窗口。 Create 函數(shù)所使用的參數(shù)與窗口建立函數(shù)所使用的參數(shù)是類似的(第31行)。第一個參數(shù)指定了控制中所要顯示的文本內(nèi)容。第二個參數(shù)指定了類型屬性。類型屬性在下一講中將詳細(xì)介紹。在此我們使用的是子窗口類型(即在別的窗口中顯示的窗口),還有它是可見的,

57、還有文本的顯示位置是居中的。第三個參數(shù)決定了控制的大小和位置。第四參數(shù)表示該子窗口的父窗口。 這樣就建立了一個靜態(tài)控制,它將出現(xiàn)在應(yīng)用程序窗口上,并顯示指定的文本。2022/7/2063結(jié)論 第一次瀏覽該代碼,也可能不是很熟悉和有些讓人煩惱。但是不要著急。從程序員的觀點來看,整個程序的主要工作就是建立了 CStatic 控制(36至40行)。在下一節(jié)中,我們詳細(xì)介紹36至40行代碼的含義,并可看到定制 CStatic 控制的幾個選項。2022/7/2064第三部分MFC樣式 控制是用來建立Windows應(yīng)用程序用戶界面的用戶界面對象。你所見到的大部分Windows應(yīng)用程序和對話框只不過是由一些

58、控制所組成的、用來實現(xiàn)程序功能的東西。為了建立有效的應(yīng)用程序,你必須完全理解在Windows應(yīng)用程序中應(yīng)該如何合理地使用控制。 有六個基本的控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15個增強了的控制。你需要理解的是那個控制能做些什么、你應(yīng)該如何控制它的外表和行為以及如何讓控制能響應(yīng)用戶事件。只要掌握了這些,再加上掌握了菜單和對話框,你就可以建立你所想象的任何Windows應(yīng)用程序。你可以象本教程這樣用程序代碼來建立控制,也可以使用資源編輯器通過資源文件來建立。當(dāng)然,對話框編輯器更方便些,在已經(jīng)基本

59、掌握了控制的情況下特別有用。2022/7/2065最簡單的控制是 CStatic, 它是用來顯示靜態(tài)文本的。CStatic類沒有任何數(shù)據(jù)成員,它只有少量的成員函數(shù):構(gòu)造函數(shù)、Create函數(shù)(用于獲取和設(shè)置靜態(tài)控制上的圖標(biāo))等等。它不響應(yīng)用戶事件。因為它的簡單性,所以最好把它作為學(xué)習(xí)Windows控制的開端。 在本節(jié)中,我們從CStatic著手,看一下如何修改和定制控制。在下一節(jié)中,我們將學(xué)習(xí)Cbutton 和 CScrollBar 類,以理解事件處理的概念。一旦你理解和掌握了所有控制及其類,你就可以建立完整的應(yīng)用程序了。2022/7/2066基礎(chǔ) MFC 中的 Cstatic 類是用來顯示靜

60、態(tài)文本信息的。這些信息能夠作為純信息(例如,顯示在信息對話框中的錯誤消息), 或作為小的標(biāo)簽等。在Windows應(yīng)用程序的文件打開對話框中,你會發(fā)現(xiàn)有六個這樣的標(biāo)簽。 CStatic控制還有幾種其它的顯示格式。你可以通過修改標(biāo)簽的樣式來使它表現(xiàn)為矩形、邊框或圖標(biāo)等。 CStatic控制總是作為子窗口的形式出現(xiàn)的。典型情況下,其父窗口是應(yīng)用程序的主窗口或?qū)υ捒?。正如上一?jié)所介紹的,用兩行代碼就可以建立一個靜態(tài)控制:2022/7/2067CStatic * cs; . cs = new CStatic(); cs-Create(hello world, WS_CHILD|WS_VISIBLE|SS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論