Visual C++ MFC 簡(jiǎn)明教程 0積分

上傳人:小*** 文檔編號(hào):144053398 上傳時(shí)間:2022-08-26 格式:DOC 頁(yè)數(shù):33 大小:152.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
Visual C++ MFC 簡(jiǎn)明教程 0積分_第1頁(yè)
第1頁(yè) / 共33頁(yè)
Visual C++ MFC 簡(jiǎn)明教程 0積分_第2頁(yè)
第2頁(yè) / 共33頁(yè)
Visual C++ MFC 簡(jiǎn)明教程 0積分_第3頁(yè)
第3頁(yè) / 共33頁(yè)

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《Visual C++ MFC 簡(jiǎn)明教程 0積分》由會(huì)員分享,可在線閱讀,更多相關(guān)《Visual C++ MFC 簡(jiǎn)明教程 0積分(33頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、Visual C++ MFC 簡(jiǎn)明教程 原著:Marshall Brain 編譯:張圣華 第一部分:MFC導(dǎo)論 Visual C++ 不僅僅是一個(gè)編譯器。它是一個(gè)全面的應(yīng)用程序開(kāi)發(fā)環(huán)境,使用它你充分利用具有面向?qū)ο筇匦缘?C++ 來(lái)開(kāi)發(fā)出專(zhuān)業(yè)級(jí)的 Windows 應(yīng)用程序。為了能充分利用這些特性,你必須理解 C++ 程序設(shè)計(jì)語(yǔ)言。掌握了C++,你就必須掌握 Microsoft 基本類(lèi)庫(kù) (MFC) 的層次結(jié)構(gòu)。該層次 結(jié)構(gòu)包容了 Windows API 中的用戶界面部分,并使你能夠很容易地

2、以面向?qū)ο蟮姆绞浇?Windows 應(yīng)用程序。這種層次結(jié)構(gòu)適用于所有版本的 Windows 并彼此兼容。你用 MFC 所建立的代碼是完全可移植的。 該教程將向你介紹MFC的基本概念和術(shù)語(yǔ)以及事件驅(qū)動(dòng)程序設(shè)計(jì)方法。在本節(jié)中,你將會(huì)輸入、編譯和運(yùn)行一個(gè)簡(jiǎn)單的MFC程序。下一節(jié)中將向你詳細(xì)解釋這些代碼。第三部分討論了MFC控制和如何定制它們。第四部分將介紹消息映射,你將會(huì)處理MFC的事件。 什么是MFC? 如果你要建立一個(gè) Windows 應(yīng)用程序,應(yīng)該如何下手? 好的開(kāi)端是從設(shè)計(jì)用戶界面開(kāi)始。首先,你要決定什么樣的用戶能使用該程序并根據(jù)需要來(lái)設(shè)置相應(yīng)的用戶界面對(duì)象。Windows 用

3、戶界面有一些標(biāo)準(zhǔn)的控制,如按鈕、菜單、滾動(dòng)條和列表等,這對(duì)那些 Windows 用戶已經(jīng)是很熟悉了。 要記住的是,作為程序員必須選擇一組控制并決定如何把它們安排到屏幕上。傳統(tǒng)上,你需要在紙上做一下用戶界面的草圖,直到對(duì)各元素感到滿意為止。這對(duì)于一些比較小的項(xiàng)目,以及一些大項(xiàng)目的早期原型階段是可以的。 下一步,是要實(shí)現(xiàn)代碼。為任何 Windows 平臺(tái)建立應(yīng)用程序時(shí),程序員都有兩種選擇:C 或 C++。 使用 C,程序員是在 Windows 應(yīng)用程序界面 ( API ) 的水平上編寫(xiě)代碼。該界面是由幾百個(gè) C 函數(shù)所組成,這些函數(shù)在Windows API 參考手冊(cè)中都有介紹。對(duì)于Windows

4、 NT, API 被稱(chēng)為 “Win32 API”,以區(qū)別于其用于Windows 3.1的16位 API。 Microsoft 也提供了 C++ 庫(kù),它位于任何 Windows API 之上,能夠使程序員的工作更容易。它就是Microsoft基本類(lèi)庫(kù) (MFC),該庫(kù)的主要優(yōu)點(diǎn)是效率高。它減少了大量在建立 Windows 程序時(shí)必須編寫(xiě)的代碼。同時(shí)它還提供了所有一般 C++ 編程的優(yōu)點(diǎn),例如繼承和封裝。MFC 是可移植的,例如,在 Windows 3.1下編寫(xiě)的代碼可以很容易地移植到 Windows NT 或 Windows 95 上。因此,MFC 很值得推薦的開(kāi)發(fā)Windows 應(yīng)用程序的方

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

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

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

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

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

10、界面控制都放到窗口上。例如,如果程序員要建立一個(gè)從攝氏到華氏的轉(zhuǎn)換的簡(jiǎn)單程序,則程序員所選擇的用戶界面對(duì)象來(lái)完成并在屏幕上把結(jié)果顯示出來(lái)。在這個(gè)簡(jiǎn)單的程序中,程序員可能需要用戶在一個(gè)可編輯的編輯框中輸入溫度值,在一個(gè)不可編輯的編輯框中顯示轉(zhuǎn)換結(jié)果,然后讓用戶可以單擊一個(gè)標(biāo)有“退出”的按鈕來(lái)退出應(yīng)用程序。 因?yàn)槭怯脩魜?lái)操作應(yīng)用程序的控制,所以程序必須作出響應(yīng)。所做的響應(yīng)依賴(lài)于用戶使用鼠標(biāo)或鍵盤(pán)在不同控制上的操作。屏幕上的每個(gè)用戶界面對(duì)象對(duì)事件的響應(yīng)是不同的。例如,如果用戶單擊退出按鈕,則該按鈕必須更新屏幕、加亮它自己。然后程序必須響應(yīng)退出。 Windows 所用的模式也是類(lèi)似的。在一個(gè)典型的

11、應(yīng)用程序中,你將建立一個(gè)主窗口,并且在其中放置了一些用戶界面控制。這些控制通常被稱(chēng)為子窗口——它們就象一些在主窗口中的更小更特殊的子窗口。作為程序員,你應(yīng)該通過(guò)函數(shù)調(diào)用來(lái)發(fā)送信息操作這些控制、通過(guò)把信息發(fā)送給你到代碼來(lái)響應(yīng)用戶的操作。 如果你從未做過(guò)事件驅(qū)動(dòng)程序設(shè)計(jì),則所有這些對(duì)你來(lái)說(shuō)可能是很陌生的。但是,事件驅(qū)動(dòng)程序設(shè)計(jì)方式是很容易理解的。具體的細(xì)節(jié)對(duì)不同的系統(tǒng)可能有些不同,但是其基本概念是類(lèi)似的。在一個(gè)事件驅(qū)動(dòng)界面中,應(yīng)用程序會(huì)在屏幕上繪制幾個(gè)界面對(duì)象,如按鈕、文本區(qū)和菜單。應(yīng)用程序通常通過(guò)一段稱(chēng)為事件循環(huán)的的代碼來(lái)響應(yīng)用戶的操作。用戶可以使用鼠標(biāo)或鍵盤(pán)來(lái)任意操作屏幕上的對(duì)象。例如,用戶

12、用鼠標(biāo)單擊一個(gè)按鈕。用鼠標(biāo)單擊就稱(chēng)為一個(gè)事件。事件驅(qū)動(dòng)系統(tǒng)把用戶的動(dòng)作如鼠標(biāo)單擊和鍵盤(pán)操作定義為事件,也把系統(tǒng)操作如更新屏幕定義為事件。 在比較低級(jí)的編程方法中,如用C直接編寫(xiě)Windows API應(yīng)用程序,代碼量是非常大的,因?yàn)槟闼疹櫟募?xì)節(jié)太多了。例如,你用某種類(lèi)型的結(jié)構(gòu)來(lái)接收單擊鼠標(biāo)事件。你的事件循環(huán)中的代碼會(huì)查看結(jié)構(gòu)中不同域,以確定哪個(gè)用戶界面對(duì)象受到了影響,然后會(huì)完成相應(yīng)的操作。當(dāng)屏幕上有很多對(duì)象時(shí),應(yīng)用程序會(huì)變得很大。只是簡(jiǎn)單地處理哪個(gè)對(duì)象被單擊和對(duì)它需要做些什么要花費(fèi)大量的代碼。 幸運(yùn)的是,你可以在比較高級(jí)的方法來(lái)進(jìn)行編程,這就是使用MFC。在MFC中,幾乎所有的低級(jí)的細(xì)節(jié)

13、處理都為你代辦了。如果你把某一用戶界面對(duì)象放在屏幕上,你只需要兩行代碼來(lái)建立它。如果用戶單擊一個(gè)按鈕,則按鈕自己會(huì)完成一切必要的操作,從更新屏幕上的外觀到調(diào)用你程序中的預(yù)處理函數(shù)。該函數(shù)包含有對(duì)該按鈕作出相應(yīng)操作的代碼。MFC 為你處理所有的細(xì)節(jié):你建立按鈕并告知它特定的處理函數(shù),則當(dāng)它被按下時(shí),它就會(huì)調(diào)用相應(yīng)的函數(shù)。第四部分介紹了怎樣使用消息映射來(lái)處理事件。 例子 理解一個(gè)典型的 MFC 程序的結(jié)構(gòu)和樣式的最好方法是輸入一段小程序,然后編譯和運(yùn)行它。下面的程序是一段簡(jiǎn)單的“hello world”程序。這對(duì)很多C程序員都是很熟悉了,讓我們看一下如何用MFC方法來(lái)實(shí)現(xiàn)。如果你是第一次看

14、到這類(lèi)程序,也許比較難理解。這沒(méi)關(guān)系,我們后面會(huì)詳細(xì)介紹?,F(xiàn)在你只要用Visual C++ 環(huán)境中建立、編譯和運(yùn)行它就可以了。 //hello.cpp #include // 說(shuō)明應(yīng)用程序類(lèi) class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; // 建立應(yīng)用程序類(lèi)的實(shí)例 CHelloApp HelloApp; // 說(shuō)明主窗口類(lèi) class CHelloWindow : public CFrameWnd {

15、 CStatic* cs; public: CHelloWindow(); }; // 每當(dāng)應(yīng)用程序首次執(zhí)行時(shí)都要調(diào)用的初始化函數(shù) BOOL CHelloApp::InitInstance() { m_pMainWnd = new CHelloWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } // 窗口類(lèi)的構(gòu)造函數(shù) CHelloWindow::CHelloWindow()

16、{ // 建立窗口本身 Create(NULL, "Hello World!", 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),

17、 this); } 上面的這段程序如果用C來(lái)實(shí)現(xiàn),得需要幾頁(yè)的代碼。這個(gè)簡(jiǎn)單的例子做了三件事。第一,它建立了一個(gè)應(yīng)用程序?qū)ο蟆D闼帉?xiě)的每個(gè) MFC 程序都有一個(gè)單一的程序?qū)ο?,它是處?MFC 和 Windows 的初始細(xì)節(jié)的。第二,應(yīng)用程序建立了一個(gè)窗口來(lái)作為應(yīng)用程序的主窗口。最后,在應(yīng)用程序的窗口中建立了一個(gè)靜態(tài)文本標(biāo)簽,它包含有“hello world”幾個(gè)字。在第二部分中我們會(huì)仔細(xì)研究這段程序,以理解其結(jié)構(gòu)。 啟動(dòng) VC++,如果你是剛剛安裝好,則你會(huì)在屏幕上看到一個(gè)帶有工具欄的空窗口。如果 VC++ 已經(jīng)在該機(jī)器上使用過(guò)了,則所顯示的窗口可能有些不同,因?yàn)?VC

18、++ 會(huì)記憶和自動(dòng)重新打開(kāi)上次使用后退出時(shí)的項(xiàng)目和文件。我們需要的是它沒(méi)有裝如任何項(xiàng)目和代碼。如果程序啟動(dòng)后彈出對(duì)話框指示不能打開(kāi)某些文件,你只要單擊“No”即可。在“Window”菜單中選取“Close All”選項(xiàng)關(guān)閉所有窗口。在“File”菜單中選取“Close”選項(xiàng)來(lái)關(guān)閉其它窗口?,F(xiàn)在,你就處于開(kāi)始狀態(tài)了。如果你安裝VC++后,第一次運(yùn)行,則屏幕應(yīng)如下所示: 如果你以后不希望看到“InfoViewer Topic”窗口,你可以用按鈕把它關(guān)掉。如果以后需要的話,你還可以單擊工具欄上的“主頁(yè)”按鈕來(lái)打開(kāi)該窗口。 現(xiàn)在一切都正常了。正如你所看到的,頂部是菜單和幾個(gè)工具欄。左邊的窗口所

19、顯示的是在線幫助內(nèi)容,你可以雙擊某項(xiàng)標(biāo)題來(lái)瀏覽其內(nèi)容。在線幫助的內(nèi)容是十分豐富的。 現(xiàn)在該做什么了?你所要做的是輸入上面的程序,然后便宜并運(yùn)行它。開(kāi)始之前,要檢查以下你的硬盤(pán)上至少要留有5MB的剩余空間。 建立項(xiàng)目和編譯代碼 為了在 Visual C++ 中編譯代碼,你必須要建立一個(gè)項(xiàng)目。為了這么小的程序來(lái)建立一個(gè)項(xiàng)目可能有點(diǎn)小題大作,但是,在任何實(shí)際的程序中,項(xiàng)目的概念是非常有用的。一個(gè)項(xiàng)目主要保存著下面三種不同類(lèi)型的信息: 1. 它可以記住建立一個(gè)可執(zhí)行程序所需要的所有源程序代碼文件。在這個(gè)簡(jiǎn)單的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一個(gè)大型的應(yīng)用程序中,為了

20、便于管理和維護(hù),你可以會(huì)有許多個(gè)不同的源文件。項(xiàng)目會(huì)維護(hù)這些不同文件的列表,并當(dāng)你要建立下一個(gè)新的可執(zhí)行程序時(shí),在必要時(shí)編譯它們。 2. 它會(huì)記住針對(duì)你的應(yīng)用程序所使用的編譯器和連接器選項(xiàng)。例如,它會(huì)記住把哪個(gè)庫(kù)連接到了執(zhí)行程序中,你是否預(yù)編譯了頭文件等等。 3. 它會(huì)記住你想要建立的項(xiàng)目類(lèi)型: 一個(gè)控制臺(tái)應(yīng)用程序,或一個(gè)窗口應(yīng)用程序等等。 如果你已經(jīng)對(duì)項(xiàng)目文件有所了解,則會(huì)很容易明白作為機(jī)器產(chǎn)生的項(xiàng)目文件的作用?,F(xiàn)在,我們來(lái)建立一個(gè)簡(jiǎn)單的項(xiàng)目,并用它來(lái)編譯 HELLO.CPP。 為此,首先從“File”菜單中選擇“New”選項(xiàng)。在“Projects”標(biāo)簽中,加單擊“Win32 App

21、lication”。在“Location”域中輸入一個(gè)合適的路徑名或單擊“Browse”按鈕來(lái)選擇一個(gè)。在“Project name”中輸入“hello”作為項(xiàng)目名稱(chēng)。這時(shí)候你會(huì)看到“hello”也會(huì)出現(xiàn)在“Location”域中。單擊“OK”按鈕。Visual C++ 會(huì)建立一個(gè)新的稱(chēng)為HELLO的目錄,并把所有的項(xiàng)目文件 HELLO.OPT、HELLO.NCB、HELLO.DSP 和 HELLO.DSW 都放到該目錄中。如果你退出,以后再重新打開(kāi)該項(xiàng)目,則可選擇 HELLO.DSW。 現(xiàn)在,在屏幕的左邊,出現(xiàn)了三個(gè)標(biāo)簽。InfoView 標(biāo)簽仍然在,又新出現(xiàn)了 ClassView 和 F

22、ileView 標(biāo)簽。ClassView 標(biāo)簽會(huì)把你程序中所有的類(lèi)都列出來(lái),F(xiàn)ileView 標(biāo)簽給出了項(xiàng)目中文件的列表。 現(xiàn)在可以輸入程序的代碼了。在“File”菜單中選擇“New”選項(xiàng)來(lái)建立一個(gè)編輯窗口。在出現(xiàn)的對(duì)話框中,選擇“Files”標(biāo)簽和“Text File”。則會(huì)出現(xiàn) Visual C++ 的智能編輯器,你可以用它來(lái)輸入上面的程序代碼。輸入代碼時(shí),你會(huì)發(fā)現(xiàn)編輯器會(huì)自動(dòng)把不同類(lèi)型的文本變成不同的顏色,如注釋、關(guān)鍵字字符串等的顏色都不同。如果你要改變其顏色或關(guān)閉顏色功能,可選擇“Tools”菜單中“Options”選項(xiàng),然后選擇“Format”標(biāo)簽和“Source Windows”

23、選項(xiàng)就可以修改。 輸入完代碼后,選擇“File”菜單中的“Save”選項(xiàng)來(lái)保存。在 Visual C++ 新建立的目錄中,把它存成 HELLO.CPP 文件。 現(xiàn)在選擇在“Project”菜單中選擇“Add To Project”選項(xiàng),再選“Files...”。你會(huì)看到一個(gè)對(duì)話框供你選擇要添加的文件。在本例子中,選擇 HELLO.CPP 文件。 在屏幕的左邊,單擊 FileView 標(biāo)簽,并雙擊標(biāo)有 HELLO 的圖標(biāo)。你會(huì)看到名為 HELLO.CPP 的文件。單擊 ClassView 標(biāo)簽,并雙擊文件夾圖標(biāo),你會(huì)看到程序中所有的類(lèi)。任何時(shí)候你都可以使用 FileView 來(lái)刪除項(xiàng)目的文

24、件,你只要單擊該文件,然后按鍵盤(pán)上的 delete 鍵。 后,此時(shí)你必須告訴項(xiàng)目要使用MFC庫(kù)。如果你忽略了這一步,則項(xiàng)目在連接時(shí)會(huì)出錯(cuò),而出錯(cuò)信息對(duì)你毫無(wú)幫助。選擇“Project”菜單的“Settings”。在出現(xiàn)的對(duì)話框中選擇“General”標(biāo)簽。在“Microsoft Foundation Classes”組合框中,選擇“Use MFC in a Shared DLL”。然后關(guān)閉對(duì)話框。 我們已經(jīng)建立了項(xiàng)目文件,并調(diào)整了設(shè)置,你現(xiàn)在可以準(zhǔn)備編譯 HELLO.CPP 程序了。在“Build”菜單中,你會(huì)發(fā)現(xiàn)有三個(gè)不同的編譯選項(xiàng): 1. Compile HELLO.CPP (只有當(dāng)

25、含有 HELLO.CPP 的窗口處于激活狀態(tài)時(shí)才可) 2. Build HELLO.EXE 3. Rebuild All 第一個(gè)選項(xiàng)只是編譯源文件并形成它們的目標(biāo)文件。該選項(xiàng)不能完成連接任務(wù),所以它只對(duì)快速編譯一些源文件以檢查錯(cuò)誤有用。第二個(gè)選項(xiàng)編譯自上次編譯后所修改的所有源文件,并連接形成可執(zhí)行文件。第三個(gè)選項(xiàng)要重新編譯和連接所有的源文件。 我們可以選擇“Build HELLO.EXE”來(lái)編譯和連接代碼。Visual C++ 會(huì)建立一個(gè)名為“Debug”的新子目錄,并把 HELLO.EXE 放在該目錄中。該子目錄的文件都是可以再產(chǎn)生的,所以你可以任意刪除它們。 如果你發(fā)現(xiàn)了編譯錯(cuò)誤

26、,雙擊輸出窗口中的錯(cuò)誤信息。這時(shí)編輯器會(huì)把你帶到出錯(cuò)的位置處。檢查你的代碼是否有問(wèn)題,如果有,就修改之。如果你看到大量的連接錯(cuò)誤,則可能你在建立項(xiàng)目對(duì)話框中所指定的項(xiàng)目類(lèi)型不對(duì)。你可以把該項(xiàng)目所在的子目錄刪除,然后再重新按上面的步驟來(lái)建立。 為了執(zhí)行該程序,你可選則“Build”菜單中的“Execute HELLO.EXE”選項(xiàng)。你就可以看到你的第一個(gè)MFC程序了 -- 出現(xiàn)一個(gè)帶有“hello world”的窗口。該窗口本身帶有:標(biāo)題欄、尺寸縮放區(qū)、最大和最小按鈕等等。在窗口上,有一個(gè)標(biāo)有“hello world”。請(qǐng)注意,該程序是完整的。你可以移動(dòng)窗口、縮放窗口、最小化等。你只使用了很少

27、的代碼就完成了一個(gè)完整的 Window 應(yīng)用程序。這就是使用 MFC 的優(yōu)點(diǎn)。所有的細(xì)節(jié)問(wèn)題都有MFC來(lái)處理。 結(jié)論 在本講中,你已經(jīng)成功地編譯和執(zhí)行了你的第一個(gè) MFC 程序。你將來(lái)會(huì)用類(lèi)似的步驟來(lái)建立的應(yīng)用程序。你可以為每個(gè)項(xiàng)目建立單獨(dú)的目錄,或建立一個(gè)單獨(dú)的項(xiàng)目文件,然后再添加或刪除不同的源文件。 在下一講中,我們將仔細(xì)研究該程序,你會(huì)更完整的理解它的結(jié)構(gòu)。 第二部分:一個(gè)簡(jiǎn)單的MFC程序 在本將中,我們將一段一段地來(lái)研究上一將中提到的 MFC 應(yīng)用程序,以便能理解它的結(jié)構(gòu)和概念框架。我們將先介紹 MFC,然后在介紹如何用 MFC 來(lái)建立應(yīng)用程序。 MFC簡(jiǎn)介

28、MFC 是一個(gè)很大的、擴(kuò)展了的 C++ 類(lèi)層次結(jié)構(gòu),它能使開(kāi)發(fā) Windows 應(yīng)用程序變得更加容易。MFC 是在整個(gè) Windows 家族中都是兼容的,也就是說(shuō),無(wú)論是 Windows3.x、Windows95 還是 Windows NT,所使用的 MFC 是兼容的。每當(dāng)新的 Windows 版本出現(xiàn)時(shí),MFC 也會(huì)得到修改以便使舊的編譯器和代碼能在新的系統(tǒng)中工作。MFC 也回得到擴(kuò)展,添加新的特性、變得更加容易建立應(yīng)用程序。 與傳統(tǒng)上使用 C 語(yǔ)言直接訪問(wèn) Windows API相反,使用 MFC 和 C++ 的優(yōu)點(diǎn)是 MFC 已經(jīng)包含和壓縮了所有標(biāo)準(zhǔn)的“樣板文件”代碼,這些代碼是所有用

29、 C 編寫(xiě)的 Windows 程序所必需的。因此用 MFC 編寫(xiě)的程序要比用C語(yǔ)言編寫(xiě)的程序小得多。另外,MFC 所編寫(xiě)的程序的性能也毫無(wú)損失。必要時(shí),你也可以直接調(diào)用標(biāo)準(zhǔn) C 函數(shù),因?yàn)?MFC 不修改也不隱藏 Windows 程序的基本結(jié)構(gòu)。 使用 MFC 的最大優(yōu)點(diǎn)是它為你做了所有最難做的事。MFC 中包含了上成千上萬(wàn)行正確、優(yōu)化和功能強(qiáng)大的 Windows 代碼。你所調(diào)用的很多成員函數(shù)完成了你自己可能很難完成的工作。從這點(diǎn)上將,MFC 極大地加快了你的程序開(kāi)發(fā)速度。 MFC 是很龐大的。例如,版本4.0中包含了大約200個(gè)不同的類(lèi)。萬(wàn)幸的是,你在典型的程序中不需要使用所有的函數(shù)。事

30、實(shí)上,你可能只需要使用其中的十多個(gè) MFC 中的不同類(lèi)就可以建立一個(gè)非常漂亮的程序。該層次結(jié)構(gòu)大約可分為幾種不同的類(lèi)型的類(lèi): l 應(yīng)用程序框架 l 圖形繪制的繪制對(duì)象 l 文件服務(wù) l 異常處理 l 結(jié)構(gòu) - List、Array 和 Map l Internet 服務(wù) l OLE 2 l 數(shù)據(jù)庫(kù) l 通用類(lèi) 在本教程中,我們將集中討論可視對(duì)象。下面的列表給出了部分類(lèi): l CObject l CCmdTarget l CWinThread l CWinApp l CWnd l CFrameWnd l CDialog l CView l

31、 CStatic l CButton l CListBox l CComboBox l CEdit l CscrollBar 在上面的列表中,有幾點(diǎn)需要注意。第一,MFC 中的大部分類(lèi)都是從基類(lèi) CObject 中繼承下來(lái)的。該類(lèi)包含有大部分MFC類(lèi)所通用的數(shù)據(jù)成員和成員函數(shù)。第二,是該列表的簡(jiǎn)單性。CWinApp 類(lèi)是在你建立應(yīng)用程序是要用到的,并且任何程序中都只用一次。CWnd 類(lèi)匯集了 Windows 中的所有通用特性、對(duì)話框和控制。CFrameWnd 類(lèi)是從 CWnd 繼承來(lái)的,并實(shí)現(xiàn)了標(biāo)準(zhǔn)的框架應(yīng)用程序。CDialog 可分別處理無(wú)模式和有模式兩種類(lèi)型的對(duì)話

32、框。CView 是用于讓用戶通過(guò)窗口來(lái)訪問(wèn)文檔。最后,Windows 支持六種控制類(lèi)型: 靜態(tài)文本框、可編輯文本框、按鈕、滾動(dòng)條、列表框和組合框(一種擴(kuò)展的列表框)。一旦你理解了這些,你也就能更好的理解 MFC 了。MFC 中的其它類(lèi)實(shí)現(xiàn)了其它特性,如內(nèi)存管理、文檔控制等。 為了建立一個(gè)MFC應(yīng)用程序,你既要會(huì)直接使用這些類(lèi),而通常你需要從這些類(lèi)中繼承新的類(lèi)。在繼承的類(lèi)中,你可以建立新的成員函數(shù),這能更適用你自己的需要。你在第一講中的簡(jiǎn)單例子中已經(jīng)看到了這種繼承過(guò)程,下面會(huì)詳細(xì)介紹。CHelloApp 和 CHelloWindow 都是從已有的 MFC 類(lèi)中繼承的。 設(shè)計(jì)一個(gè)程序 在

33、討論代碼本身之前,我們需要花些工夫來(lái)簡(jiǎn)單介紹以下 MFC 中程序設(shè)計(jì)的過(guò)程。例如,假如你要編一個(gè)程序來(lái)向用戶顯示“Hello World”信息。這當(dāng)然是很簡(jiǎn)單的,但仍需要一些考慮。 “hello world”應(yīng)用程序首先需要在屏幕上建立一個(gè)窗口來(lái)顯示“hello world”。然后需要實(shí)際把“hello world”放到窗口上。我們需要但個(gè)對(duì)象來(lái)完成這項(xiàng)任務(wù): 1. 一個(gè)應(yīng)用程序?qū)ο?,用?lái)初始化應(yīng)用程序并把它掛到 Windows 上。該應(yīng)用程序?qū)ο筇幚硭械牡图?jí)事件。 2. 一個(gè)窗口對(duì)象來(lái)作為主窗口。 3. 一個(gè)靜態(tài)文本對(duì)象,用來(lái)顯示“hello world”。 你用 MFC 所建立

34、的每個(gè)程序都會(huì)包含頭兩個(gè)對(duì)象。第三個(gè)對(duì)象是針對(duì)該應(yīng)用程序的。每個(gè)應(yīng)用程序都會(huì)定義它自己的一組用戶界面對(duì)象,以顯示應(yīng)用程序的輸出和收集應(yīng)用的輸入信息。 一旦你完成了界面的設(shè)計(jì),并決定實(shí)現(xiàn)該界面所需要的控制,你就需要編寫(xiě)代碼來(lái)在屏幕上建立這些控制。你還會(huì)編寫(xiě)代碼來(lái)處理用戶操作這些控制所產(chǎn)生的信息。在“hello world”應(yīng)用程序中,只有一個(gè)控制。它用來(lái)輸出“hello world”。復(fù)雜的程序可能在其主窗口和對(duì)話框中需要上百個(gè)控制。 應(yīng)該注意,在應(yīng)用程序中有兩種不同的方法來(lái)建立用戶控制。這里所介紹的是用 C++ 代碼方式來(lái)建立控制。但是,在比較大的應(yīng)用程序中,這種方法是不可行的。因此,在通

35、常情況下要使用資源文件的圖形編輯器來(lái)建立控制。這種方法要方便得多。 理解“hello world”的代碼 下面列出了你在上一講中已經(jīng)輸入、編譯和運(yùn)行的“hello world”程序的代碼。添加行號(hào)是為了討論方便。我們來(lái)一行行地研究它,你會(huì)更好的理解 MFC 建立應(yīng)用程序的方式。 如果你還沒(méi)有編譯和運(yùn)行該代碼,應(yīng)該按上一講的方法去做。 1 //hello.cpp 2 #include 3 // Declare the application class 4 class CHelloApp : public CWinApp 5 { 6 pu

36、blic: 7 virtual BOOL InitInstance(); 8 }; 9 // Create an instance of the application class 10 CHelloApp HelloApp; 11 // Declare the main window class 12 class CHelloWindow : public CFrameWnd 13 { 14 CStatic* cs; 15 public: 16 CHelloWindow(); 17 }; 18 // The InitInstance fun

37、ction 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->UpdateWindow(); 25 return TRUE; 26 } 27 // The constructor for the window class 28 CHelloW

38、indow::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 CStatic(); 37 cs->Create("hello world", 38 WS_CHILD|WS_VISIBLE|SS_CENTER, 39 CRect(50,80,

39、150,150), 40 this); 41 } 你把上面的代碼看一遍,以得到一整體印象。該程序由六小部分組成,每一部分都起到很重要的作用。 首先,該程序包含了頭文件 afxwin.h (第 2 行)。該頭文件包含有 MFC 中所使用的所有的類(lèi)型、類(lèi)、函數(shù)和變量。它也包含了其它頭文件,如 Windows API 庫(kù)等。 第 3 至 8 行從 MFC 說(shuō)明的標(biāo)準(zhǔn)應(yīng)用程序類(lèi) CWinApp 繼承出了新的應(yīng)用程序類(lèi) CHelloApp。該新類(lèi)是為了要重載 CWinApp 中的 InitInstance 成員函數(shù)。InitInstance 是一個(gè)應(yīng)用程序開(kāi)始執(zhí)行時(shí)要調(diào)用的可重載函數(shù)。

40、在第10行中,說(shuō)明了應(yīng)用程序作為全局變量的一個(gè)事例。該實(shí)例是很重要的,因?yàn)樗绊懙匠绦虻膱?zhí)行。當(dāng)應(yīng)用程序被裝入內(nèi)存并開(kāi)始執(zhí)行時(shí),全局變量的建立會(huì)執(zhí)行 CWinApp 類(lèi)的缺省構(gòu)造函數(shù)。該構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用在18至26行定義的 InitInstance 函數(shù)。 在第11至17中,CHelloWindow 類(lèi)是從 MFC 中的 CFrameWnd 類(lèi)繼承來(lái)的。CHelloWindow 是作為應(yīng)用程序在屏幕上的窗口。建立新的類(lèi)以便實(shí)現(xiàn)構(gòu)造函數(shù)、析構(gòu)函數(shù)和數(shù)據(jù)成員。 第18至26行實(shí)現(xiàn)了 InitInstance 函數(shù)。該函數(shù)產(chǎn)生一個(gè) CHelloWindow 類(lèi)的事例,因此會(huì)執(zhí)行第27行至41

41、行中類(lèi)的構(gòu)造函數(shù)。它也會(huì)把新窗口放到屏幕上。 第27至41實(shí)現(xiàn)了窗口的構(gòu)造函數(shù)。該構(gòu)造函數(shù)實(shí)際是建立了窗口,然后在其中建立一個(gè)靜態(tài)文本控制。 要注意的是,在該程序中沒(méi)有 main 或 WinMain 函數(shù),也沒(méi)有事件循環(huán)。然而我們從上一講在執(zhí)行中知道它也處理了事件。窗口可以最大或最小化、移動(dòng)窗口等等。所有這些操作都隱藏在主應(yīng)用程序類(lèi) CWinApp 中,并且我們不必為它的事件處理而操心,它都是自動(dòng)執(zhí)行、在 MFC 中不可見(jiàn)的。 下一節(jié)中,將詳細(xì)介紹程序的各部分。你可能不能馬上全都理解得很好: 但你最好先讀完它以獲得第一印象。在下一講中,會(huì)介紹一些特殊的例子,并偶把各片段組合在一起,有助于

42、你能更好的理解。 程序?qū)ο? 用 MFC 建立的每個(gè)應(yīng)用程序都要包括一個(gè)單一從 CWinApp 類(lèi)繼承來(lái)的應(yīng)用程序?qū)ο蟆T搶?duì)象必須被說(shuō)明成全局的(第10行),并且在你的程序中只能出現(xiàn)一次。 從 CWinApp 類(lèi)繼承的對(duì)象主要是處理應(yīng)用程序的初始化,同時(shí)也處理應(yīng)用程序主事件循環(huán)。CWinApp 類(lèi)有幾個(gè)數(shù)據(jù)成員和幾個(gè)成員函數(shù)。在上面的程序中,我們只重載了一個(gè) CWinApp 中的虛擬函數(shù) InitInstance。 應(yīng)用程序?qū)ο蟮哪康氖浅跏蓟涂刂颇愕某绦颉R驗(yàn)?Windows 允許同一個(gè)應(yīng)用程序的多個(gè)事例在同時(shí)執(zhí)行,因此 MFC 把初始化過(guò)程分成兩部分并使用兩個(gè)函數(shù) InitApp

43、lication 和 InitInstance 來(lái)處理它。此處,我們只使用了一個(gè) InitInstance 函數(shù),因?yàn)槲覀兊某绦蚝芎?jiǎn)單。當(dāng)每次調(diào)用應(yīng)用程序時(shí)都會(huì)調(diào)用一個(gè)新的事例。第3至8行的代碼建立了一個(gè)稱(chēng)為 CHelloApp 的類(lèi),它是從 CWinApp 繼承來(lái)的。它包含一個(gè)新的 InitInstance 函數(shù),是從 CWinApp 中已存在的函數(shù)(不做任何事情)重載來(lái)的: 3 // Declare the application class 4 class CHelloApp : public CWinApp 5 { 6 public: 7 virtual BOOL In

44、itInstance(); 8 }; 在重載的 InitInstance 函數(shù)內(nèi)部,第18至26行,程序使用 CHelloApp 的數(shù)據(jù)成員 m_pMainWnd 來(lái)建立并顯示窗口: 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_nCmdS

45、how); 24 m_pMainWnd->UpdateWindow(); 25 return TRUE; 26 } InitInstance 函數(shù)返回 TRUE 表示初始化已成功的完成。如果返回了FALSE,則表明應(yīng)用程序會(huì)立即終止。在下一節(jié)中我們將會(huì)看到窗口初始化的詳細(xì)過(guò)程。 當(dāng)應(yīng)用程序?qū)ο笤诘?0行建立時(shí),它的數(shù)據(jù)成員(從 CWinApp 繼承來(lái)的) 會(huì)自動(dòng)初始化。例如,m_pszAppName、m_lpCmdLine 和 m_nCmdShow 都包含有適當(dāng)?shù)某跏蓟?。你可參?jiàn) MFC 的幫助文件來(lái)獲得更詳細(xì)的信息。我們將使用這些變量中的一個(gè)。 窗口對(duì)象 MFC 定義

46、了兩個(gè)類(lèi)型的窗口: 1) 框架窗口,它是一個(gè)全功能的窗口,可以改變大小、最小化、最大化等等; 2) 對(duì)話框窗口,它不能改變大小。框架窗口是典型的主應(yīng)用程序窗口。 在下面的代碼中,從 CFrameWnd 中繼承了一個(gè)新的類(lèi) CHelloWindow: 11 // Declare the main window class 12 class CHelloWindow : public CFrameWnd 13 { 14 CStatic* cs; 15 public: 16 CHelloWindow(); 17 }; 它包括一個(gè)新的構(gòu)造函數(shù),同時(shí)還有一個(gè)指向程序中所使用的唯

47、一用戶界面控制的數(shù)據(jù)成員。你多建立的每個(gè)應(yīng)用程序在主窗口中都會(huì)有唯一的一組控制。因此,繼承類(lèi)將有一個(gè)重載的構(gòu)造函數(shù)以用來(lái)建立主窗口所需要的所有控制。典型情況下,該類(lèi)會(huì)包含有一個(gè)析構(gòu)函數(shù)以便在窗口關(guān)閉時(shí)來(lái)刪除他們。我們這里沒(méi)有使用析構(gòu)函數(shù)。在第四講中,我們將會(huì)看到繼承窗口類(lèi)也會(huì)說(shuō)明一個(gè)消息處理函數(shù)來(lái)處理這些控制在響應(yīng)用戶事件所產(chǎn)生的消息。 典型地,一個(gè)應(yīng)用程序?qū)⒂幸粋€(gè)主應(yīng)用程序窗口。因此,CHelloApp 應(yīng)用程序類(lèi)定義了一個(gè)名為 m_pMainWnd 成員變量來(lái)指向主窗口。為了建立該程序的主窗口,InitInstance 函數(shù)(第18至26行)建立了一個(gè) CHelloWindow 事例,并

48、使用 m_pMainWnd 來(lái)指向一個(gè)新的窗口。我們的 CHelloWindow 對(duì)象是在第22行建立的: 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->UpdateWindow();

49、25 return TRUE; 26 } 只建立一個(gè)簡(jiǎn)單的框架窗口是不夠的。還要確保窗口能正確地出現(xiàn)在屏幕上。首先,代碼必須要調(diào)用窗口的 ShowWindow 函數(shù)以使窗口出現(xiàn)在屏幕上(第23行)。其次,程序必須要調(diào)用 UpdateWindow 函數(shù)來(lái)確保窗口中的每個(gè)控制和輸出能正確地出現(xiàn)在屏幕上(第24行)。 你可能奇怪,ShowWindow 和 UpdateWindow 函數(shù)是在哪兒定義的。例如,如果你要查看以便了解它們,你可能要查看 MFC 的幫助文件中的 CFrameWnd 定義部分。但是 CFrameWnd 中并不包含有這些成員函數(shù)。CFrameWnd 是從 CWnd 類(lèi)繼承

50、來(lái)的。你可以查看 MFC 文檔中的 CWnd,你會(huì)發(fā)現(xiàn)它包含有200多個(gè)不同的成員函數(shù)。顯然,你不能在幾分鐘內(nèi)掌握這些函數(shù),但是你可以掌握其中的幾個(gè),如 ShowWindow 和UpdateWindow。 現(xiàn)在讓我們花幾分鐘來(lái)看一下 MFC 幫助文件中的 CWnd::ShowWindow 函數(shù)。為此,你你可以單擊幫助文件中的 Search 按鈕,并輸入“ShowWindow”。找到后,你會(huì)注意到,ShowWindow 只有一個(gè)參數(shù),你可以設(shè)置不同的參數(shù)值。我們把它設(shè)置成我們程序中 CHelloApp 的數(shù)據(jù)成員變量 m_nCmdShow (第23行)。m_nCmdShow 變量是用來(lái)初始化應(yīng)

51、用程序啟動(dòng)的窗口顯示方式的。例如,用戶可能在程序管理器中啟動(dòng)應(yīng)用程序,并可通過(guò)應(yīng)用程序?qū)傩詫?duì)話框來(lái)告知程序管理器應(yīng)用程序在啟動(dòng)時(shí)要保持最小化狀態(tài)。m_nCmdShow 變量將被設(shè)置成 SW_SHOWMINIMIZED,并且應(yīng)用程序會(huì)以圖標(biāo)的形式來(lái)啟動(dòng),也就是說(shuō),程序啟動(dòng)后,是一個(gè)代表該程序的圖標(biāo)。m_nCmdShow 變量是一種外界與應(yīng)用程序通訊的方式。如果你愿意,你可以用不同的 m_nCmdShow 值來(lái)試驗(yàn) ShowWindow 的效果。但要重新編譯程序才能看到效果。 第22行是初始化窗口。它為調(diào)用 new 函數(shù)分配內(nèi)存。在這一點(diǎn)上,程序在執(zhí)行時(shí)會(huì)調(diào)用CHelloWindow的構(gòu)造函數(shù)。

52、該構(gòu)造函數(shù)在每次帶類(lèi)的事例被分配時(shí)都要調(diào)用。在窗口構(gòu)造函數(shù)的內(nèi)部,窗口必須建立它自己。它是通過(guò)調(diào)用 CFrameWnd 的 Create 成員函數(shù)來(lái)實(shí)現(xiàn)的(第31行): 27 // 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)); 建

53、立函數(shù)共傳遞了四個(gè)參數(shù)。通過(guò)查看 MFC 文檔,你可以了解不同類(lèi)型。NULL 參數(shù)表示使用缺省的類(lèi)名。第二個(gè)參數(shù)為出現(xiàn)在窗口標(biāo)題欄上的標(biāo)題。第三個(gè)參數(shù)為窗口的類(lèi)型屬性。該程序使用了正常的、可覆蓋類(lèi)型的窗口。在下一講中將詳細(xì)介紹類(lèi)型屬性。第四個(gè)參數(shù)指出窗口應(yīng)該放在屏幕上的位置和大小,左上角為(0,0), 初始化大小為 200×200個(gè)象素。如果使用了 rectDefault,則 Windows 會(huì)為你自動(dòng)放置窗口及大小。 因?yàn)槲覀兊某绦蛱?jiǎn)單了,所以它只在窗口中建立了一個(gè)靜態(tài)文本控制。見(jiàn)第35至40行。下面將詳細(xì)介紹。 靜態(tài)文本控制 程序在從 CFrameWnd 類(lèi)中繼承 CHello

54、Window 類(lèi)時(shí)(第11至17行)時(shí),說(shuō)明了一個(gè)成員類(lèi)型 CStatic及其構(gòu)造函數(shù)。 正如在前面所見(jiàn)到的,CHelloWindow 構(gòu)造函數(shù)主要做兩件事情。第一是通過(guò)調(diào)用Create函數(shù)(第31行)來(lái)建立應(yīng)用程序的窗口。然后分配和建立屬于窗口的控制。在我們的程序中,只使用了一個(gè)控制。在 MFC 中建一個(gè)對(duì)象總要經(jīng)過(guò)兩步。第一是為類(lèi)的事例分配內(nèi)存,然后是調(diào)用構(gòu)造函數(shù)來(lái)初始化變量。下一步,調(diào)用 Create 函數(shù)來(lái)實(shí)際建立屏幕上的對(duì)象。代碼使用這兩步分配、構(gòu)造和建立了一個(gè)靜態(tài)文本對(duì)象(第36至40行): 27 // The constructor for the window class

55、 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 CStatic(); 37 cs->Create("hello world", 38 WS_CHILD|WS_VISIBLE|SS_CENTER, 39 C

56、Rect(50,80,150,150), 40 this); 41 } CStatic 構(gòu)造函數(shù)是在為其分配內(nèi)存時(shí)調(diào)用的,然后就調(diào)用了 Create 函數(shù)來(lái)建立 CStatic 控制的窗口。Create 函數(shù)所使用的參數(shù)與窗口建立函數(shù)所使用的參數(shù)是類(lèi)似的(第31行)。第一個(gè)參數(shù)指定了控制中所要顯示的文本內(nèi)容。第二個(gè)參數(shù)指定了類(lèi)型屬性。類(lèi)型屬性在下一講中將詳細(xì)介紹。在次我們使用的是子窗口類(lèi)型(既在別的窗口中顯示的窗口),還有它是可見(jiàn)的,還有文本的顯示位置是居中的。第三個(gè)參數(shù)決定了控制的大小和位置。第四參數(shù)表示該子窗口的父窗口。已經(jīng)建立了一個(gè)靜態(tài)控制,它將出現(xiàn)在應(yīng)用程序窗口上,并顯示指定

57、的文本。 結(jié)論 第一次瀏覽該代碼,也可能不是很熟悉和有些讓人煩惱。但是不要著急。從程序員的觀點(diǎn)來(lái)看,整個(gè)程序的主要工作就是建立了 CStatic 控制(36至40行)。在下一講中,我們?cè)敿?xì)向你介紹36至40行代碼的含義,并可看到定制 CStatic 控制的幾個(gè)選項(xiàng)。 第三部分:MFC樣式 控制是用來(lái)建立Windows應(yīng)用程序用戶界面的用戶界面對(duì)象。你所見(jiàn)到的大部分Windows應(yīng)用程序和對(duì)話框只不過(guò)是由一些控制所組成的、用來(lái)實(shí)現(xiàn)程序功能的東西。為了建立有效的應(yīng)用程序,你必須完全理解在Windows應(yīng)用程序中應(yīng)該如何合理的使用控制。有六個(gè)基本的控制:CStatic、CButt

58、on、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增強(qiáng)了的控制。你需要理解的是那個(gè)控制能做些什么、你應(yīng)該如何控制它的外表和行為以及如何讓控制能響應(yīng)用戶事件。只要掌握了這些,再加上掌握了菜單和對(duì)話框,你就可以建立你所想象的任何Windows應(yīng)用程序。你可以象本教程這樣用程序代碼來(lái)建立控制,也可以使用資源編輯器通過(guò)資源文件來(lái)建立。當(dāng)然,對(duì)話框編輯器更方便些,它對(duì)于已經(jīng)基本掌握了控制的情況下特別有用。 最簡(jiǎn)單的控制是CStatic, 它是用來(lái)顯示靜態(tài)文本的。CStatic類(lèi)沒(méi)有任何數(shù)據(jù)成員,它只有少量的成員函數(shù):構(gòu)造函數(shù)、Create函數(shù)

59、(用于獲取和設(shè)置靜態(tài)控制上的圖標(biāo))等等。它不響應(yīng)用戶事件。因?yàn)樗暮?jiǎn)單性,所以最好把它作為學(xué)習(xí)Windows控制的開(kāi)端。 在本講中,我們從CStatic著手,看一下如何修改和定制控制。在下一講中,我們將學(xué)習(xí)CButton和CScrollBar類(lèi),以理解事件處理的概念。一旦你理解和掌握了所有控制極其類(lèi),你就可以建立完整的應(yīng)用程序了。 基 礎(chǔ) MFC中的CStatic類(lèi)是用來(lái)顯示靜態(tài)文本信息的。這些信息能夠可以作為純信息(例如,顯示在信息對(duì)話框中的錯(cuò)誤消息), 或作為小的標(biāo)簽等。在Windows應(yīng)用程序的文件打開(kāi)對(duì)話框中,你會(huì)發(fā)現(xiàn)有六個(gè)這樣的標(biāo)簽。 CStatic控制還有幾種其它的顯

60、示格式。你可以通過(guò)修改標(biāo)簽的樣式來(lái)使它表現(xiàn)為矩形、邊框或圖標(biāo)等。 CStatic控制總是作為子窗口的形式出現(xiàn)的。典型情況下,其父窗口是應(yīng)用程序的主窗口或?qū)υ捒?。正如上一講所介紹的,你用兩行代碼就可以建立一個(gè)靜態(tài)控制: CStatic *cs; ... cs = new CStatic(); cs->Create("hello world", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80, 150, 150), this); 這兩行代碼是典型的MFC建立所有控制的代碼。調(diào)用new來(lái)為CStatic

61、類(lèi)的事例分配內(nèi)存,然后調(diào)用類(lèi)的構(gòu)造函數(shù)。構(gòu)造函數(shù)是用來(lái)完成類(lèi)所需要的初始化功能的。Create函數(shù)建立控制并把它放到屏幕上。 Create函數(shù)有五個(gè)參數(shù): lpszText: 指定了要顯示的文本。 rect: 控制文本區(qū)域的位置、大小和形狀。 pParentWnd: 指明CStatic控制的父窗口。該控制會(huì)出現(xiàn)在其父窗口中,且其位置是相對(duì)于其父窗口的用戶區(qū)域而言的。 nID: 整數(shù)值,表示該控制的標(biāo)識(shí)符。 dwStyle: 最重要的參數(shù)。它控制著控制的外觀和行為。 CStatic樣式 所有的控制都有各種顯示樣式。樣式是在用Create函數(shù)建立控制時(shí)傳遞給它的dw

62、Style參數(shù)所決定的。對(duì)CStatic有效的樣式簡(jiǎn)介如下: 從CWnd繼承來(lái)的樣式: l WS_CHILD CStatic所必須的。 l WS_VISIBLE 表示該控制對(duì)用戶應(yīng)該是可見(jiàn)的。 l WS_DISABLED 表示該控制拒絕接受用戶事件。 l WS_BORDER 控制的文本區(qū)域帶有邊框。 CStatic固有的樣式: l SS_BLACKFRAME 該控制區(qū)域以矩形邊界顯示。顏色與窗口框架相同。 l SS_BLACKRECT ? 該控制以填充的矩形顯示。顏色與當(dāng)前的窗口框架相同。 l SS_CENTER 文本居中。 l SS_GRAYFRAME 控制以矩形

63、邊框方式顯示。顏色與當(dāng)前桌面相同。 l SS_GRAYRECT 該控制以填充的矩形顯示。顏色與當(dāng)前的桌面相同。 l SS_ICON 控制以圖標(biāo)形式顯示。文本作為圖標(biāo)在資源文件的名稱(chēng)。rect參數(shù)只控制位置。 l SS_LEFT 文本居左顯示。文字可回繞。 l SS_LEFTNOWORDWRAP 文本居左顯示。多余的文字被剪裁。 l SS_NOPREFIX 表示字符串中的"&"字符不表示為加速前綴。 l SS_RIGHT 文本居右顯示。文字可回繞。 l SS_SIMPLE 只簡(jiǎn)單的顯示一行文本。任何CTLCOLOR信息都被其父窗口忽略。 l SS_USERITEM 用戶

64、定義項(xiàng)。 l SS_WHITEFRAME 控制以矩形邊框方式顯示。顏色與當(dāng)前窗口背景顏色相同。 l SS_WHITERECT 控制以填充矩形方式顯示。顏色與當(dāng)前窗口背景顏色相同。 這些常數(shù)中,“SS”(Static Style)開(kāi)頭的表示只能用于CStatic控制。以“WS”(Window Style)開(kāi)頭的常數(shù)表示可適用于所有窗口,它們定義在CWnd對(duì)象中。CWnd中還有很多以“WS”樣式常數(shù)。你可以在MFC文檔中的CWnd::Create函數(shù)中找到它們。上面的四種是只用于CStatic對(duì)象的。 CStatic對(duì)象至少要帶有兩個(gè)樣式:WS_CHILD和WS_VISIBLE。該控制必

65、須作為另一窗口的子窗口來(lái)建立。如果不使用WS_VISIBLE,則所建立的控制是看不見(jiàn)的。WS_DISABLED控制著標(biāo)簽對(duì)事件的響應(yīng),因?yàn)镃Static不接收鍵盤(pán)或鼠標(biāo)事件,所以使用該項(xiàng)是多余的。 所有的其它樣式選項(xiàng)都是可選的,它們控制著標(biāo)簽的外觀。在CStatic::Create函數(shù)中使用這些控制,可以控制CStatic在屏幕上的顯示。 CStatic文本的外觀 下面的代碼對(duì)于理解CStatic是有幫助的。它與上一講中介紹的代碼類(lèi)似,但是修改了CStatic的建立部分。 //static1.cpp #include // Declare the a

66、pplication class class CTestApp : public CWinApp { public: virtual BOOL InitInstance(); }; // Create an instance of the application class CTestApp TestApp; // Declare the main window class class CTestWindow : public CFrameWnd { CStatic* cs; public: CTestWindow(); }; // The InitInstance function is called // once when the application first executes BOOL CTestApp::InitInstance() { m_pMainWnd = new CTestWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->Up

展開(kāi)閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!