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)用程序開發(fā)環(huán)境,使用它你充分利用具有面向?qū)ο筇匦缘?C+ 來開發(fā)出專業(yè)級(jí)的 Windows 應(yīng)用程序。為了能充分利用這些特性,你必須理解 C+ 程序設(shè)計(jì)語言。掌握了C+,你就必須掌握 Microsoft 基本類庫(kù) (MFC) 的層次結(jié)構(gòu)。該層次 結(jié)構(gòu)包容了 Windows API 中的用戶界面部分,并使你能夠很容易地以面向?qū)ο蟮姆绞浇?Windows 應(yīng)用程序。這種層次結(jié)構(gòu)適用于所有版本的 Windows 并彼此兼容。你用 MFC

2、所建立的代碼是完全可移植的。該教程將向你介紹MFC的基本概念和術(shù)語以及事件驅(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)該如何下手?好的開端是從設(shè)計(jì)用戶界面開始。首先,你要決定什么樣的用戶能使用該程序并根據(jù)需要來設(shè)置相應(yīng)的用戶界面對(duì)象。Windows 用戶界面有一些標(biāo)準(zhǔn)的控制,如按鈕、菜單、滾動(dòng)條和列表等,這對(duì)那些 Windows 用戶已經(jīng)是很熟悉了。 要記住的是,作為程序員必須選擇一組控制

3、并決定如何把它們安排到屏幕上。傳統(tǒng)上,你需要在紙上做一下用戶界面的草圖,直到對(duì)各元素感到滿意為止。這對(duì)于一些比較小的項(xiàng)目,以及一些大項(xiàng)目的早期原型階段是可以的。下一步,是要實(shí)現(xiàn)代碼。為任何 Windows 平臺(tái)建立應(yīng)用程序時(shí),程序員都有兩種選擇:C 或 C+。 使用 C,程序員是在 Windows 應(yīng)用程序界面 ( API ) 的水平上編寫代碼。該界面是由幾百個(gè) C 函數(shù)所組成,這些函數(shù)在Windows API 參考手冊(cè)中都有介紹。對(duì)于Windows NT, API 被稱為 “Win32 API”,以區(qū)別于其用于Windows 3.1的16位 API。Microsoft 也提供了 C+ 庫(kù),它

4、位于任何 Windows API 之上,能夠使程序員的工作更容易。它就是Microsoft基本類庫(kù) (MFC),該庫(kù)的主要優(yōu)點(diǎn)是效率高。它減少了大量在建立 Windows 程序時(shí)必須編寫的代碼。同時(shí)它還提供了所有一般 C+ 編程的優(yōu)點(diǎn),例如繼承和封裝。MFC 是可移植的,例如,在 Windows 3.1下編寫的代碼可以很容易地移植到 Windows NT 或 Windows 95 上。因此,MFC 很值得推薦的開發(fā)Windows 應(yīng)用程序的方法,在本教程自始至終使用的都是 MFC。當(dāng)是使用 MFC 時(shí),你編寫的代碼是用來建立必要的用戶界面控制并定制其外觀。同時(shí)你還要編寫用來響應(yīng)用戶操作這些控制

5、的代碼。例如,如果用戶單擊一個(gè)按鈕時(shí),你應(yīng)該有代碼來響應(yīng)。這就是事件驅(qū)動(dòng)代碼,它構(gòu)成了所有應(yīng)用程序。一旦應(yīng)用程序正確的響應(yīng)了所有允許的控制,它的任務(wù)也就完成了。你可以看出,使用 MFC 進(jìn)行 Windows 編程時(shí)是一件比較容易的的過程。本教程的目的是比較詳細(xì)地教你如何快速建立專業(yè)級(jí)的應(yīng)用程序的技術(shù)。Visual C+ 應(yīng)用程序開發(fā)程序環(huán)境特別適合于使用 MFC (也有其它開發(fā)環(huán)境使用MFC,譯者注),所以一起學(xué)習(xí) MFC 和 Visual C+ 能夠增強(qiáng)你的開發(fā)程序的能力。Windows詞匯在 Windows 用戶界面和軟件開發(fā)中所要用到的詞匯都是基本和唯一的。對(duì)于新接觸該環(huán)境的用戶,下面復(fù)

6、習(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)條你可以通過代碼或“資源編輯器”來建立這些控制,在資源編輯器中可以建立對(duì)話框和這些控制。在本教程中,我們將使用代碼來建立它們。Windows支持幾種類型的應(yīng)用程序窗口。一個(gè)典型的應(yīng)用程序應(yīng)該活動(dòng)在稱為“框架窗口”中。一個(gè)框架窗口是一個(gè)全功能的主窗口,用戶可以改變尺寸、最小化、最大化等。Windows也支持兩種類型的對(duì)話框:模式和無模式對(duì)話框。模式對(duì)話框一旦出現(xiàn)在屏幕上,只有當(dāng)它退出時(shí),

7、屏幕上該應(yīng)用程序的其余部分才能響應(yīng)。無模式對(duì)話框出現(xiàn)在屏幕上時(shí),程序的其余部分也可以作出響應(yīng),它就象浮動(dòng)在上面一樣。最簡(jiǎn)單的 Windows 應(yīng)用程序是使用單文檔界面(SDI),只有一個(gè)框架窗口。Windows 的鐘表、PIF 編輯器、記事本等都是 SDI 應(yīng)用程序的例子。Windows 也提供了一種稱為多文檔界面的組織形式,它可用于更復(fù)雜的應(yīng)用程序。MDI 系統(tǒng)允許用戶在同一應(yīng)用程序中同時(shí)可以查看多個(gè)文檔。例如,一個(gè)文本編輯器可以允許用戶同時(shí)打開多個(gè)文本文件。使用 MDI 時(shí),應(yīng)用程序有一個(gè)主窗口,在主窗口中有一些子窗口,每個(gè)子窗口中各自包含有各自的文檔。在MDI框架中,主窗口有一個(gè)主菜單,

8、它對(duì)主框架中最頂端窗口有效。各子窗口都可以縮成圖標(biāo)或展開,MDI主窗口也可以變成桌面上的一個(gè)圖標(biāo)。MDI界面可能會(huì)給你一種第二桌面的感覺,它對(duì)窗口的管理和刪除混亂的窗口有很大的幫助。你所建立的沒一個(gè)應(yīng)用程序都會(huì)使用它自己的一套控制、菜單結(jié)構(gòu)以及對(duì)話框。應(yīng)用程序界面的好壞取決于你如何選擇和組織這些界面對(duì)象。Visual C+ 中的資源編輯器可以使你能容易的建立和定制這些界面對(duì)象。事件驅(qū)動(dòng)軟件和詞匯所有基于窗口的 GUI 都包含相同的基本元素,它們的操作方式都是相同的。在屏幕上,用戶所看到的是一組窗口,每個(gè)窗口都包含有控制、圖標(biāo)、對(duì)象以及一些處理鼠標(biāo)和鍵盤的元素。從用戶角度來看,各系統(tǒng)的界面對(duì)象都

9、是相同的:按鈕、滾動(dòng)條、圖標(biāo)、對(duì)話框以及下拉菜單等等。盡管這些界面元素的“外觀和感覺”可能有些不同,但這些界面對(duì)象的工作方式都是相同的。例如,滾動(dòng)條對(duì)于Windows、Mac和Motif可能有些不同,但他們的作用完全是一樣的。從程序員的角度來看,這些系統(tǒng)在概念上是相似的,盡管它們可能有很大的不同。為了建立 GUI 程序,程序員第一步要把所有需要的用戶界面控制都放到窗口上。例如,如果程序員要建立一個(gè)從攝氏到華氏的轉(zhuǎn)換的簡(jiǎn)單程序,則程序員所選擇的用戶界面對(duì)象來完成并在屏幕上把結(jié)果顯示出來。在這個(gè)簡(jiǎn)單的程序中,程序員可能需要用戶在一個(gè)可編輯的編輯框中輸入溫度值,在一個(gè)不可編輯的編輯框中顯示轉(zhuǎn)換結(jié)果,

10、然后讓用戶可以單擊一個(gè)標(biāo)有“退出”的按鈕來退出應(yīng)用程序。因?yàn)槭怯脩魜聿僮鲬?yīng)用程序的控制,所以程序必須作出響應(yīng)。所做的響應(yīng)依賴于用戶使用鼠標(biāo)或鍵盤在不同控制上的操作。屏幕上的每個(gè)用戶界面對(duì)象對(duì)事件的響應(yīng)是不同的。例如,如果用戶單擊退出按鈕,則該按鈕必須更新屏幕、加亮它自己。然后程序必須響應(yīng)退出。Windows 所用的模式也是類似的。在一個(gè)典型的應(yīng)用程序中,你將建立一個(gè)主窗口,并且在其中放置了一些用戶界面控制。這些控制通常被稱為子窗口它們就象一些在主窗口中的更小更特殊的子窗口。作為程序員,你應(yīng)該通過函數(shù)調(diào)用來發(fā)送信息操作這些控制、通過把信息發(fā)送給你到代碼來響應(yīng)用戶的操作。如果你從未做過事件驅(qū)動(dòng)程序

11、設(shè)計(jì),則所有這些對(duì)你來說可能是很陌生的。但是,事件驅(qū)動(dòng)程序設(shè)計(jì)方式是很容易理解的。具體的細(xì)節(jié)對(duì)不同的系統(tǒng)可能有些不同,但是其基本概念是類似的。在一個(gè)事件驅(qū)動(dòng)界面中,應(yīng)用程序會(huì)在屏幕上繪制幾個(gè)界面對(duì)象,如按鈕、文本區(qū)和菜單。應(yīng)用程序通常通過一段稱為事件循環(huán)的的代碼來響應(yīng)用戶的操作。用戶可以使用鼠標(biāo)或鍵盤來任意操作屏幕上的對(duì)象。例如,用戶用鼠標(biāo)單擊一個(gè)按鈕。用鼠標(biāo)單擊就稱為一個(gè)事件。事件驅(qū)動(dòng)系統(tǒng)把用戶的動(dòng)作如鼠標(biāo)單擊和鍵盤操作定義為事件,也把系統(tǒng)操作如更新屏幕定義為事件。在比較低級(jí)的編程方法中,如用C直接編寫Windows API應(yīng)用程序,代碼量是非常大的,因?yàn)槟闼疹櫟募?xì)節(jié)太多了。例如,你用某

12、種類型的結(jié)構(gòu)來接收單擊鼠標(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í)的方法來進(jìn)行編程,這就是使用MFC。在MFC中,幾乎所有的低級(jí)的細(xì)節(jié)處理都為你代辦了。如果你把某一用戶界面對(duì)象放在屏幕上,你只需要兩行代碼來建立它。如果用戶單擊一個(gè)按鈕,則按鈕自己會(huì)完成一切必要的操作,從更新屏幕上的外觀到調(diào)用你程序中的預(yù)處理函數(shù)。該函數(shù)包含有對(duì)該按鈕作出相應(yīng)操作的代碼。MFC 為你處理所有的細(xì)節(jié):你建立按鈕并告知它特定的

13、處理函數(shù),則當(dāng)它被按下時(shí),它就會(huì)調(diào)用相應(yīng)的函數(shù)。第四部分介紹了怎樣使用消息映射來處理事件。例子理解一個(gè)典型的 MFC 程序的結(jié)構(gòu)和樣式的最好方法是輸入一段小程序,然后編譯和運(yùn)行它。下面的程序是一段簡(jiǎn)單的“hello world”程序。這對(duì)很多C程序員都是很熟悉了,讓我們看一下如何用MFC方法來實(shí)現(xiàn)。如果你是第一次看到這類程序,也許比較難理解。這沒關(guān)系,我們后面會(huì)詳細(xì)介紹?,F(xiàn)在你只要用Visual C+ 環(huán)境中建立、編譯和運(yùn)行它就可以了。/hello.cpp#include / 說明應(yīng)用程序類class CHelloApp : public CWinApp public: virtual BOO

14、L InitInstance();/ 建立應(yīng)用程序類的實(shí)例CHelloApp HelloApp;/ 說明主窗口類class CHelloWindow : public CFrameWnd 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;/ 窗口類的構(gòu)造函數(shù)

15、CHelloWindow:CHelloWindow() / 建立窗口本身 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), this);上面的這段程序如果用C來實(shí)現(xiàn),得需要幾頁(yè)的代碼。這個(gè)簡(jiǎn)單的例子做了三件事。第一,它建立了一個(gè)應(yīng)用程序?qū)ο蟆D闼帉懙拿總€(gè) MFC 程序都有一個(gè)單一的程序?qū)ο?,它是處?

16、MFC 和 Windows 的初始細(xì)節(jié)的。第二,應(yīng)用程序建立了一個(gè)窗口來作為應(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ī)器上使用過了,則所顯示的窗口可能有些不同,因?yàn)?VC+ 會(huì)記憶和自動(dòng)重新打開上次使用后退出時(shí)的項(xiàng)目和文件。我們需要的是它沒有裝如任何項(xiàng)目和代碼。如果程序啟動(dòng)后彈出對(duì)話框指示不能打開某些文件,你只要單擊“No”即可。在“Window”菜單中選取“Close All”選

17、項(xiàng)關(guān)閉所有窗口。在“File”菜單中選取“Close”選項(xiàng)來關(guān)閉其它窗口?,F(xiàn)在,你就處于開始狀態(tài)了。如果你安裝VC+后,第一次運(yùn)行,則屏幕應(yīng)如下所示:如果你以后不希望看到“InfoViewer Topic”窗口,你可以用按鈕把它關(guān)掉。如果以后需要的話,你還可以單擊工具欄上的“主頁(yè)”按鈕來打開該窗口?,F(xiàn)在一切都正常了。正如你所看到的,頂部是菜單和幾個(gè)工具欄。左邊的窗口所顯示的是在線幫助內(nèi)容,你可以雙擊某項(xiàng)標(biāo)題來瀏覽其內(nèi)容。在線幫助的內(nèi)容是十分豐富的。現(xiàn)在該做什么了?你所要做的是輸入上面的程序,然后便宜并運(yùn)行它。開始之前,要檢查以下你的硬盤上至少要留有5MB的剩余空間。建立項(xiàng)目和編譯代碼為了在 V

18、isual C+ 中編譯代碼,你必須要建立一個(gè)項(xiàng)目。為了這么小的程序來建立一個(gè)項(xiàng)目可能有點(diǎn)小題大作,但是,在任何實(shí)際的程序中,項(xiàng)目的概念是非常有用的。一個(gè)項(xiàng)目主要保存著下面三種不同類型的信息:1. 它可以記住建立一個(gè)可執(zhí)行程序所需要的所有源程序代碼文件。在這個(gè)簡(jiǎn)單的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一個(gè)大型的應(yīng)用程序中,為了便于管理和維護(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ù)編譯了頭文件等

19、等。3. 它會(huì)記住你想要建立的項(xiàng)目類型: 一個(gè)控制臺(tái)應(yīng)用程序,或一個(gè)窗口應(yīng)用程序等等。如果你已經(jīng)對(duì)項(xiàng)目文件有所了解,則會(huì)很容易明白作為機(jī)器產(chǎn)生的項(xiàng)目文件的作用。現(xiàn)在,我們來建立一個(gè)簡(jiǎn)單的項(xiàng)目,并用它來編譯 HELLO.CPP。為此,首先從“File”菜單中選擇“New”選項(xiàng)。在“Projects”標(biāo)簽中,加單擊“Win32 Application”。在“Location”域中輸入一個(gè)合適的路徑名或單擊“Browse”按鈕來選擇一個(gè)。在“Project name”中輸入“hello”作為項(xiàng)目名稱。這時(shí)候你會(huì)看到“hello”也會(huì)出現(xiàn)在“Location”域中。單擊“OK”按鈕。Visual C+

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

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

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

23、 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)含有 HELLO.CPP 的窗口處于激活狀態(tài)時(shí)才可)2. Build HELLO.EXE3. Rebuild All第一個(gè)選項(xiàng)只是編譯源文件并形成它們的目標(biāo)文件。該選項(xiàng)不能完成連接任務(wù),所以它只對(duì)快速編譯一些源文件以檢查錯(cuò)誤有用。第二個(gè)選項(xiàng)編譯自上次編譯后所修改的所有源文件,并連接形成可執(zhí)行文件。第三個(gè)選項(xiàng)要

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

25、就可以看到你的第一個(gè)MFC程序了 - 出現(xiàn)一個(gè)帶有“hello world”的窗口。該窗口本身帶有:標(biāo)題欄、尺寸縮放區(qū)、最大和最小按鈕等等。在窗口上,有一個(gè)標(biāo)有“hello world”。請(qǐng)注意,該程序是完整的。你可以移動(dòng)窗口、縮放窗口、最小化等。你只使用了很少的代碼就完成了一個(gè)完整的 Window 應(yīng)用程序。這就是使用 MFC 的優(yōu)點(diǎn)。所有的細(xì)節(jié)問題都有MFC來處理。結(jié)論在本講中,你已經(jīng)成功地編譯和執(zhí)行了你的第一個(gè) MFC 程序。你將來會(huì)用類似的步驟來建立的應(yīng)用程序。你可以為每個(gè)項(xiàng)目建立單獨(dú)的目錄,或建立一個(gè)單獨(dú)的項(xiàng)目文件,然后再添加或刪除不同的源文件。在下一講中,我們將仔細(xì)研究該程序,你會(huì)

26、更完整的理解它的結(jié)構(gòu)。第二部分:一個(gè)簡(jiǎn)單的MFC程序在本將中,我們將一段一段地來研究上一將中提到的 MFC 應(yīng)用程序,以便能理解它的結(jié)構(gòu)和概念框架。我們將先介紹 MFC,然后在介紹如何用 MFC 來建立應(yīng)用程序。MFC簡(jiǎn)介MFC 是一個(gè)很大的、擴(kuò)展了的 C+ 類層次結(jié)構(gòu),它能使開發(fā) Windows 應(yīng)用程序變得更加容易。MFC 是在整個(gè) Windows 家族中都是兼容的,也就是說,無論是 Windows3.x、Windows95 還是 Windows NT,所使用的 MFC 是兼容的。每當(dāng)新的 Windows 版本出現(xiàn)時(shí),MFC 也會(huì)得到修改以便使舊的編譯器和代碼能在新的系統(tǒng)中工作。MFC 也

27、回得到擴(kuò)展,添加新的特性、變得更加容易建立應(yīng)用程序。與傳統(tǒng)上使用 C 語言直接訪問 Windows API相反,使用 MFC 和 C+ 的優(yōu)點(diǎn)是 MFC 已經(jīng)包含和壓縮了所有標(biāo)準(zhǔn)的“樣板文件”代碼,這些代碼是所有用 C 編寫的 Windows 程序所必需的。因此用 MFC 編寫的程序要比用C語言編寫的程序小得多。另外,MFC 所編寫的程序的性能也毫無損失。必要時(shí),你也可以直接調(diào)用標(biāo)準(zhǔn) C 函數(shù),因?yàn)?MFC 不修改也不隱藏 Windows 程序的基本結(jié)構(gòu)。使用 MFC 的最大優(yōu)點(diǎn)是它為你做了所有最難做的事。MFC 中包含了上成千上萬行正確、優(yōu)化和功能強(qiáng)大的 Windows 代碼。你所調(diào)用的很多

28、成員函數(shù)完成了你自己可能很難完成的工作。從這點(diǎn)上將,MFC 極大地加快了你的程序開發(fā)速度。MFC 是很龐大的。例如,版本4.0中包含了大約200個(gè)不同的類。萬幸的是,你在典型的程序中不需要使用所有的函數(shù)。事實(shí)上,你可能只需要使用其中的十多個(gè) MFC 中的不同類就可以建立一個(gè)非常漂亮的程序。該層次結(jié)構(gòu)大約可分為幾種不同的類型的類: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 通用類在本教程中,我們將集中討論可視對(duì)象。下面的列表給出了部分類:l CObject l CCmdTar

29、get l CWinThread l CWinApp l CWnd l CFrameWnd l CDialog l CView l CStatic l CButton l CListBox l CComboBox l CEdit l CscrollBar在上面的列表中,有幾點(diǎn)需要注意。第一,MFC 中的大部分類都是從基類 CObject 中繼承下來的。該類包含有大部分MFC類所通用的數(shù)據(jù)成員和成員函數(shù)。第二,是該列表的簡(jiǎn)單性。CWinApp 類是在你建立應(yīng)用程序是要用到的,并且任何程序中都只用一次。CWnd 類匯集了 Windows 中的所有通用特性、對(duì)話框和控制。CFrameWnd 類是從

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

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

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

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

34、ual BOOL InitInstance();8 ; 9 / Create an instance of the application class10 CHelloApp HelloApp;11 / Declare the main window class12 class CHelloWindow : public CFrameWnd13 14 CStatic* cs;15 public:16 CHelloWindow();17 ; 18 / The InitInstance function is called each19 / time the application first e

35、xecutes.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 class28 CHelloWindow:CHelloWindow()29 30 / Create the window itself31 Create(NULL, 32 Hello World!, 33

36、 WS_OVERLAPPEDWINDOW,34 CRect(0,0,200,200); 35 / Create a static label36 cs = new CStatic();37 cs-Create(hello world,38 WS_CHILD|WS_VISIBLE|SS_CENTER,39 CRect(50,80,150,150),40 this);41 你把上面的代碼看一遍,以得到一整體印象。該程序由六小部分組成,每一部分都起到很重要的作用。首先,該程序包含了頭文件 afxwin.h (第 2 行)。該頭文件包含有 MFC 中所使用的所有的類型、類、函數(shù)和變量。它也包含了其它頭

37、文件,如 Windows API 庫(kù)等。第 3 至 8 行從 MFC 說明的標(biāo)準(zhǔn)應(yīng)用程序類 CWinApp 繼承出了新的應(yīng)用程序類 CHelloApp。該新類是為了要重載 CWinApp 中的 InitInstance 成員函數(shù)。InitInstance 是一個(gè)應(yīng)用程序開始執(zhí)行時(shí)要調(diào)用的可重載函數(shù)。在第10行中,說明了應(yīng)用程序作為全局變量的一個(gè)事例。該實(shí)例是很重要的,因?yàn)樗绊懙匠绦虻膱?zhí)行。當(dāng)應(yīng)用程序被裝入內(nèi)存并開始執(zhí)行時(shí),全局變量的建立會(huì)執(zhí)行 CWinApp 類的缺省構(gòu)造函數(shù)。該構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用在18至26行定義的 InitInstance 函數(shù)。在第11至17中,CHelloWindo

38、w 類是從 MFC 中的 CFrameWnd 類繼承來的。CHelloWindow 是作為應(yīng)用程序在屏幕上的窗口。建立新的類以便實(shí)現(xiàn)構(gòu)造函數(shù)、析構(gòu)函數(shù)和數(shù)據(jù)成員。第18至26行實(shí)現(xiàn)了 InitInstance 函數(shù)。該函數(shù)產(chǎn)生一個(gè) CHelloWindow 類的事例,因此會(huì)執(zhí)行第27行至41行中類的構(gòu)造函數(shù)。它也會(huì)把新窗口放到屏幕上。第27至41實(shí)現(xiàn)了窗口的構(gòu)造函數(shù)。該構(gòu)造函數(shù)實(shí)際是建立了窗口,然后在其中建立一個(gè)靜態(tài)文本控制。要注意的是,在該程序中沒有 main 或 WinMain 函數(shù),也沒有事件循環(huán)。然而我們從上一講在執(zhí)行中知道它也處理了事件。窗口可以最大或最小化、移動(dòng)窗口等等。所有這些操

39、作都隱藏在主應(yīng)用程序類 CWinApp 中,并且我們不必為它的事件處理而操心,它都是自動(dòng)執(zhí)行、在 MFC 中不可見的。下一節(jié)中,將詳細(xì)介紹程序的各部分。你可能不能馬上全都理解得很好: 但你最好先讀完它以獲得第一印象。在下一講中,會(huì)介紹一些特殊的例子,并偶把各片段組合在一起,有助于你能更好的理解。程序?qū)ο笥?MFC 建立的每個(gè)應(yīng)用程序都要包括一個(gè)單一從 CWinApp 類繼承來的應(yīng)用程序?qū)ο蟆T搶?duì)象必須被說明成全局的(第10行),并且在你的程序中只能出現(xiàn)一次。從 CWinApp 類繼承的對(duì)象主要是處理應(yīng)用程序的初始化,同時(shí)也處理應(yīng)用程序主事件循環(huán)。CWinApp 類有幾個(gè)數(shù)據(jù)成員和幾個(gè)成員函數(shù)。

40、在上面的程序中,我們只重載了一個(gè) CWinApp 中的虛擬函數(shù) InitInstance。應(yīng)用程序?qū)ο蟮哪康氖浅跏蓟涂刂颇愕某绦?。因?yàn)?Windows 允許同一個(gè)應(yīng)用程序的多個(gè)事例在同時(shí)執(zhí)行,因此 MFC 把初始化過程分成兩部分并使用兩個(gè)函數(shù) InitApplication 和 InitInstance 來處理它。此處,我們只使用了一個(gè) InitInstance 函數(shù),因?yàn)槲覀兊某绦蚝芎?jiǎn)單。當(dāng)每次調(diào)用應(yīng)用程序時(shí)都會(huì)調(diào)用一個(gè)新的事例。第3至8行的代碼建立了一個(gè)稱為 CHelloApp 的類,它是從 CWinApp 繼承來的。它包含一個(gè)新的 InitInstance 函數(shù),是從 CWinApp

41、中已存在的函數(shù)(不做任何事情)重載來的:3 / Declare the application class4 class CHelloApp : public CWinApp5 6 public:7 virtual BOOL InitInstance();8 ;在重載的 InitInstance 函數(shù)內(nèi)部,第18至26行,程序使用 CHelloApp 的數(shù)據(jù)成員 m_pMainWnd 來建立并顯示窗口:18 / The InitInstance function is called each19 / time the application first executes.20 BOOL CHe

42、lloApp:InitInstance()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)用程序會(huì)立即終止。在下一節(jié)中我們將會(huì)看到窗口初始化的詳細(xì)過程。當(dāng)應(yīng)用程序?qū)ο笤诘?0行建立時(shí),它的數(shù)據(jù)成員(從 CWinApp 繼承來的) 會(huì)自動(dòng)初始化。例如,m_pszAppName、m_lpCmdLine 和

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

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

45、tInstance 函數(shù)(第18至26行)建立了一個(gè) CHelloWindow 事例,并使用 m_pMainWnd 來指向一個(gè)新的窗口。我們的 CHelloWindow 對(duì)象是在第22行建立的:18 / The InitInstance function is called each19 / time the application first executes.20 BOOL CHelloApp:InitInstance()21 22 m_pMainWnd = new CHelloWindow();23 m_pMainWnd-ShowWindow(m_nCmdShow);24 m_pMain

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

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

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

49、的構(gòu)造函數(shù)。該構(gòu)造函數(shù)在每次帶類的事例被分配時(shí)都要調(diào)用。在窗口構(gòu)造函數(shù)的內(nèi)部,窗口必須建立它自己。它是通過調(diào)用 CFrameWnd 的 Create 成員函數(shù)來實(shí)現(xiàn)的(第31行):27 / The constructor for the window class28 CHelloWindow:CHelloWindow()29 30 / Create the window itself31 Create(NULL, 32 Hello World!, 33 WS_OVERLAPPEDWINDOW,34 CRect(0,0,200,200);建立函數(shù)共傳遞了四個(gè)參數(shù)。通過查看 MFC 文檔,你可以了

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

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

52、e the window itself31 Create(NULL, 32 Hello World!, 33 WS_OVERLAPPEDWINDOW,34 CRect(0,0,200,200); 35 / Create a static label36 cs = new CStatic();37 cs-Create(hello world,38 WS_CHILD|WS_VISIBLE|SS_CENTER,39 CRect(50,80,150,150),40 this);41 CStatic 構(gòu)造函數(shù)是在為其分配內(nèi)存時(shí)調(diào)用的,然后就調(diào)用了 Create 函數(shù)來建立 CStatic 控制的窗口。C

53、reate 函數(shù)所使用的參數(shù)與窗口建立函數(shù)所使用的參數(shù)是類似的(第31行)。第一個(gè)參數(shù)指定了控制中所要顯示的文本內(nèi)容。第二個(gè)參數(shù)指定了類型屬性。類型屬性在下一講中將詳細(xì)介紹。在次我們使用的是子窗口類型(既在別的窗口中顯示的窗口),還有它是可見的,還有文本的顯示位置是居中的。第三個(gè)參數(shù)決定了控制的大小和位置。第四參數(shù)表示該子窗口的父窗口。已經(jīng)建立了一個(gè)靜態(tài)控制,它將出現(xiàn)在應(yīng)用程序窗口上,并顯示指定的文本。結(jié)論第一次瀏覽該代碼,也可能不是很熟悉和有些讓人煩惱。但是不要著急。從程序員的觀點(diǎn)來看,整個(gè)程序的主要工作就是建立了 CStatic 控制(36至40行)。在下一講中,我們?cè)敿?xì)向你介紹36至40

54、行代碼的含義,并可看到定制 CStatic 控制的幾個(gè)選項(xiàng)。第三部分:MFC樣式控制是用來建立Windows應(yīng)用程序用戶界面的用戶界面對(duì)象。你所見到的大部分Windows應(yīng)用程序和對(duì)話框只不過是由一些控制所組成的、用來實(shí)現(xiàn)程序功能的東西。為了建立有效的應(yīng)用程序,你必須完全理解在Windows應(yīng)用程序中應(yīng)該如何合理的使用控制。有六個(gè)基本的控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增強(qiáng)了的控制。你需要理解的是那個(gè)控制能做些什么、你應(yīng)該如何控制它的外表和行為以及如何讓控制能響應(yīng)用戶事件。只要掌握了這些

55、,再加上掌握了菜單和對(duì)話框,你就可以建立你所想象的任何Windows應(yīng)用程序。你可以象本教程這樣用程序代碼來建立控制,也可以使用資源編輯器通過資源文件來建立。當(dāng)然,對(duì)話框編輯器更方便些,它對(duì)于已經(jīng)基本掌握了控制的情況下特別有用。最簡(jiǎn)單的控制是CStatic, 它是用來顯示靜態(tài)文本的。CStatic類沒有任何數(shù)據(jù)成員,它只有少量的成員函數(shù):構(gòu)造函數(shù)、Create函數(shù)(用于獲取和設(shè)置靜態(tài)控制上的圖標(biāo))等等。它不響應(yīng)用戶事件。因?yàn)樗暮?jiǎn)單性,所以最好把它作為學(xué)習(xí)Windows控制的開端。在本講中,我們從CStatic著手,看一下如何修改和定制控制。在下一講中,我們將學(xué)習(xí)CButton和CScroll

56、Bar類,以理解事件處理的概念。一旦你理解和掌握了所有控制極其類,你就可以建立完整的應(yīng)用程序了?;?礎(chǔ)MFC中的CStatic類是用來顯示靜態(tài)文本信息的。這些信息能夠可以作為純信息(例如,顯示在信息對(duì)話框中的錯(cuò)誤消息), 或作為小的標(biāo)簽等。在Windows應(yīng)用程序的文件打開對(duì)話框中,你會(huì)發(fā)現(xiàn)有六個(gè)這樣的標(biāo)簽。CStatic控制還有幾種其它的顯示格式。你可以通過修改標(biāo)簽的樣式來使它表現(xiàn)為矩形、邊框或圖標(biāo)等。CStatic控制總是作為子窗口的形式出現(xiàn)的。典型情況下,其父窗口是應(yīng)用程序的主窗口或?qū)υ捒?。正如上一講所介紹的,你用兩行代碼就可以建立一個(gè)靜態(tài)控制:CStatic *cs;.cs = new

57、 CStatic();cs-Create(hello world, WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80, 150, 150), this);這兩行代碼是典型的MFC建立所有控制的代碼。調(diào)用new來為CStatic類的事例分配內(nèi)存,然后調(diào)用類的構(gòu)造函數(shù)。構(gòu)造函數(shù)是用來完成類所需要的初始化功能的。Create函數(shù)建立控制并把它放到屏幕上。Create函數(shù)有五個(gè)參數(shù):lpszText: 指定了要顯示的文本。rect: 控制文本區(qū)域的位置、大小和形狀。pParentWnd: 指明CStatic控制的父窗口。該控制會(huì)出現(xiàn)在其父窗口中,且其位置是相對(duì)于其父

58、窗口的用戶區(qū)域而言的。nID: 整數(shù)值,表示該控制的標(biāo)識(shí)符。dwStyle: 最重要的參數(shù)。它控制著控制的外觀和行為。CStatic樣式所有的控制都有各種顯示樣式。樣式是在用Create函數(shù)建立控制時(shí)傳遞給它的dwStyle參數(shù)所決定的。對(duì)CStatic有效的樣式簡(jiǎn)介如下:從CWnd繼承來的樣式:l WS_CHILD CStatic所必須的。l WS_VISIBLE 表示該控制對(duì)用戶應(yīng)該是可見的。l WS_DISABLED 表示該控制拒絕接受用戶事件。l WS_BORDER 控制的文本區(qū)域帶有邊框。CStatic固有的樣式:l SS_BLACKFRAME 該控制區(qū)域以矩形邊界顯示。顏色與窗口框

59、架相同。l SS_BLACKRECT ? 該控制以填充的矩形顯示。顏色與當(dāng)前的窗口框架相同。l SS_CENTER 文本居中。l SS_GRAYFRAME 控制以矩形邊框方式顯示。顏色與當(dāng)前桌面相同。l SS_GRAYRECT 該控制以填充的矩形顯示。顏色與當(dāng)前的桌面相同。l SS_ICON 控制以圖標(biāo)形式顯示。文本作為圖標(biāo)在資源文件的名稱。rect參數(shù)只控制位置。l SS_LEFT 文本居左顯示。文字可回繞。l SS_LEFTNOWORDWRAP 文本居左顯示。多余的文字被剪裁。l SS_NOPREFIX 表示字符串中的&字符不表示為加速前綴。l SS_RIGHT 文本居右顯示。文字可回繞。

60、l SS_SIMPLE 只簡(jiǎn)單的顯示一行文本。任何CTLCOLOR信息都被其父窗口忽略。l SS_USERITEM 用戶定義項(xiàng)。l SS_WHITEFRAME 控制以矩形邊框方式顯示。顏色與當(dāng)前窗口背景顏色相同。l SS_WHITERECT 控制以填充矩形方式顯示。顏色與當(dāng)前窗口背景顏色相同。這些常數(shù)中,“SS”(Static Style)開頭的表示只能用于CStatic控制。以“WS”(Window Style)開頭的常數(shù)表示可適用于所有窗口,它們定義在CWnd對(duì)象中。CWnd中還有很多以“WS”樣式常數(shù)。你可以在MFC文檔中的CWnd:Create函數(shù)中找到它們。上面的四種是只用于CSta

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

62、clude / Declare the application classclass CTestApp : public CWinApppublic:virtual BOOL InitInstance();/ Create an instance of the application classCTestApp TestApp; / Declare the main window classclass CTestWindow : public CFrameWnd CStatic* cs;public:CTestWindow();/ The InitInstance function is called/ once when the application first executesBOOL CTestApp:InitInstance()m_pMainWnd = new CTestWindow();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-Up

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
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),我們立即給予刪除!