Visual C++ MFC 簡明教程 0積分
《Visual C++ MFC 簡明教程 0積分》由會員分享,可在線閱讀,更多相關(guān)《Visual C++ MFC 簡明教程 0積分(33頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、Visual C++ MFC 簡明教程 原著:Marshall Brain 編譯:張圣華 第一部分:MFC導論 Visual C++ 不僅僅是一個編譯器。它是一個全面的應用程序開發(fā)環(huán)境,使用它你充分利用具有面向?qū)ο筇匦缘?C++ 來開發(fā)出專業(yè)級的 Windows 應用程序。為了能充分利用這些特性,你必須理解 C++ 程序設(shè)計語言。掌握了C++,你就必須掌握 Microsoft 基本類庫 (MFC) 的層次結(jié)構(gòu)。該層次 結(jié)構(gòu)包容了 Windows API 中的用戶界面部分,并使你能夠很容易地
2、以面向?qū)ο蟮姆绞浇?Windows 應用程序。這種層次結(jié)構(gòu)適用于所有版本的 Windows 并彼此兼容。你用 MFC 所建立的代碼是完全可移植的。 該教程將向你介紹MFC的基本概念和術(shù)語以及事件驅(qū)動程序設(shè)計方法。在本節(jié)中,你將會輸入、編譯和運行一個簡單的MFC程序。下一節(jié)中將向你詳細解釋這些代碼。第三部分討論了MFC控制和如何定制它們。第四部分將介紹消息映射,你將會處理MFC的事件。 什么是MFC? 如果你要建立一個 Windows 應用程序,應該如何下手? 好的開端是從設(shè)計用戶界面開始。首先,你要決定什么樣的用戶能使用該程序并根據(jù)需要來設(shè)置相應的用戶界面對象。Windows 用
3、戶界面有一些標準的控制,如按鈕、菜單、滾動條和列表等,這對那些 Windows 用戶已經(jīng)是很熟悉了。 要記住的是,作為程序員必須選擇一組控制并決定如何把它們安排到屏幕上。傳統(tǒng)上,你需要在紙上做一下用戶界面的草圖,直到對各元素感到滿意為止。這對于一些比較小的項目,以及一些大項目的早期原型階段是可以的。 下一步,是要實現(xiàn)代碼。為任何 Windows 平臺建立應用程序時,程序員都有兩種選擇:C 或 C++。 使用 C,程序員是在 Windows 應用程序界面 ( API ) 的水平上編寫代碼。該界面是由幾百個 C 函數(shù)所組成,這些函數(shù)在Windows API 參考手冊中都有介紹。對于Windows
4、 NT, API 被稱為 “Win32 API”,以區(qū)別于其用于Windows 3.1的16位 API。 Microsoft 也提供了 C++ 庫,它位于任何 Windows API 之上,能夠使程序員的工作更容易。它就是Microsoft基本類庫 (MFC),該庫的主要優(yōu)點是效率高。它減少了大量在建立 Windows 程序時必須編寫的代碼。同時它還提供了所有一般 C++ 編程的優(yōu)點,例如繼承和封裝。MFC 是可移植的,例如,在 Windows 3.1下編寫的代碼可以很容易地移植到 Windows NT 或 Windows 95 上。因此,MFC 很值得推薦的開發(fā)Windows 應用程序的方
5、法,在本教程自始至終使用的都是 MFC。 當是使用 MFC 時,你編寫的代碼是用來建立必要的用戶界面控制并定制其外觀。同時你還要編寫用來響應用戶操作這些控制的代碼。例如,如果用戶單擊一個按鈕時,你應該有代碼來響應。這就是事件驅(qū)動代碼,它構(gòu)成了所有應用程序。一旦應用程序正確的響應了所有允許的控制,它的任務(wù)也就完成了。 你可以看出,使用 MFC 進行 Windows 編程時是一件比較容易的的過程。本教程的目的是比較詳細地教你如何快速建立專業(yè)級的應用程序的技術(shù)。Visual C++ 應用程序開發(fā)程序環(huán)境特別適合于使用 MFC (也有其它開發(fā)環(huán)境使用MFC,譯者注),所以一起學習 MFC 和 Vi
6、sual C++ 能夠增強你的開發(fā)程序的能力。 Windows詞匯 在 Windows 用戶界面和軟件開發(fā)中所要用到的詞匯都是基本和唯一的。對于新接觸該環(huán)境的用戶,下面復習幾個定義以便使我們的討論更加容易。 Windows應用程序使用幾個標準的控制: l 靜態(tài)文本標簽 l 按鈕 l 列表框 l 組合框(一種更高級的列表框) l 單選按鈕 l 檢查按鈕 l 編輯框(單行和多行) l 滾動條 你可以通過代碼或“資源編輯器”來建立這些控制,在資源編輯器中可以建立對話框和這些控制。在本教程中,我們將使用代碼來建立它們。 Windows支持幾種類型的應用程序
7、窗口。一個典型的應用程序應該活動在稱為“框架窗口”中。一個框架窗口是一個全功能的主窗口,用戶可以改變尺寸、最小化、最大化等。Windows也支持兩種類型的對話框:模式和無模式對話框。模式對話框一旦出現(xiàn)在屏幕上,只有當它退出時,屏幕上該應用程序的其余部分才能響應。無模式對話框出現(xiàn)在屏幕上時,程序的其余部分也可以作出響應,它就象浮動在上面一樣。 最簡單的 Windows 應用程序是使用單文檔界面(SDI),只有一個框架窗口。Windows 的鐘表、PIF 編輯器、記事本等都是 SDI 應用程序的例子。Windows 也提供了一種稱為多文檔界面的組織形式,它可用于更復雜的應用程序。MDI 系統(tǒng)允許
8、用戶在同一應用程序中同時可以查看多個文檔。例如,一個文本編輯器可以允許用戶同時打開多個文本文件。使用 MDI 時,應用程序有一個主窗口,在主窗口中有一些子窗口,每個子窗口中各自包含有各自的文檔。在MDI框架中,主窗口有一個主菜單,它對主框架中最頂端窗口有效。各子窗口都可以縮成圖標或展開,MDI主窗口也可以變成桌面上的一個圖標。MDI界面可能會給你一種第二桌面的感覺,它對窗口的管理和刪除混亂的窗口有很大的幫助。 你所建立的沒一個應用程序都會使用它自己的一套控制、菜單結(jié)構(gòu)以及對話框。應用程序界面的好壞取決于你如何選擇和組織這些界面對象。Visual C++ 中的資源編輯器可以使你能容易的建立和定
9、制這些界面對象。 事件驅(qū)動軟件和詞匯 所有基于窗口的 GUI 都包含相同的基本元素,它們的操作方式都是相同的。在屏幕上,用戶所看到的是一組窗口,每個窗口都包含有控制、圖標、對象以及一些處理鼠標和鍵盤的元素。從用戶角度來看,各系統(tǒng)的界面對象都是相同的:按鈕、滾動條、圖標、對話框以及下拉菜單等等。盡管這些界面元素的“外觀和感覺”可能有些不同,但這些界面對象的工作方式都是相同的。例如,滾動條對于Windows、Mac和Motif可能有些不同,但他們的作用完全是一樣的。 從程序員的角度來看,這些系統(tǒng)在概念上是相似的,盡管它們可能有很大的不同。為了建立 GUI 程序,程序員第一步要把所有需要的用戶
10、界面控制都放到窗口上。例如,如果程序員要建立一個從攝氏到華氏的轉(zhuǎn)換的簡單程序,則程序員所選擇的用戶界面對象來完成并在屏幕上把結(jié)果顯示出來。在這個簡單的程序中,程序員可能需要用戶在一個可編輯的編輯框中輸入溫度值,在一個不可編輯的編輯框中顯示轉(zhuǎn)換結(jié)果,然后讓用戶可以單擊一個標有“退出”的按鈕來退出應用程序。 因為是用戶來操作應用程序的控制,所以程序必須作出響應。所做的響應依賴于用戶使用鼠標或鍵盤在不同控制上的操作。屏幕上的每個用戶界面對象對事件的響應是不同的。例如,如果用戶單擊退出按鈕,則該按鈕必須更新屏幕、加亮它自己。然后程序必須響應退出。 Windows 所用的模式也是類似的。在一個典型的
11、應用程序中,你將建立一個主窗口,并且在其中放置了一些用戶界面控制。這些控制通常被稱為子窗口——它們就象一些在主窗口中的更小更特殊的子窗口。作為程序員,你應該通過函數(shù)調(diào)用來發(fā)送信息操作這些控制、通過把信息發(fā)送給你到代碼來響應用戶的操作。 如果你從未做過事件驅(qū)動程序設(shè)計,則所有這些對你來說可能是很陌生的。但是,事件驅(qū)動程序設(shè)計方式是很容易理解的。具體的細節(jié)對不同的系統(tǒng)可能有些不同,但是其基本概念是類似的。在一個事件驅(qū)動界面中,應用程序會在屏幕上繪制幾個界面對象,如按鈕、文本區(qū)和菜單。應用程序通常通過一段稱為事件循環(huán)的的代碼來響應用戶的操作。用戶可以使用鼠標或鍵盤來任意操作屏幕上的對象。例如,用戶
12、用鼠標單擊一個按鈕。用鼠標單擊就稱為一個事件。事件驅(qū)動系統(tǒng)把用戶的動作如鼠標單擊和鍵盤操作定義為事件,也把系統(tǒng)操作如更新屏幕定義為事件。 在比較低級的編程方法中,如用C直接編寫Windows API應用程序,代碼量是非常大的,因為你所要照顧的細節(jié)太多了。例如,你用某種類型的結(jié)構(gòu)來接收單擊鼠標事件。你的事件循環(huán)中的代碼會查看結(jié)構(gòu)中不同域,以確定哪個用戶界面對象受到了影響,然后會完成相應的操作。當屏幕上有很多對象時,應用程序會變得很大。只是簡單地處理哪個對象被單擊和對它需要做些什么要花費大量的代碼。 幸運的是,你可以在比較高級的方法來進行編程,這就是使用MFC。在MFC中,幾乎所有的低級的細節(jié)
13、處理都為你代辦了。如果你把某一用戶界面對象放在屏幕上,你只需要兩行代碼來建立它。如果用戶單擊一個按鈕,則按鈕自己會完成一切必要的操作,從更新屏幕上的外觀到調(diào)用你程序中的預處理函數(shù)。該函數(shù)包含有對該按鈕作出相應操作的代碼。MFC 為你處理所有的細節(jié):你建立按鈕并告知它特定的處理函數(shù),則當它被按下時,它就會調(diào)用相應的函數(shù)。第四部分介紹了怎樣使用消息映射來處理事件。 例子 理解一個典型的 MFC 程序的結(jié)構(gòu)和樣式的最好方法是輸入一段小程序,然后編譯和運行它。下面的程序是一段簡單的“hello world”程序。這對很多C程序員都是很熟悉了,讓我們看一下如何用MFC方法來實現(xiàn)。如果你是第一次看
14、到這類程序,也許比較難理解。這沒關(guān)系,我們后面會詳細介紹?,F(xiàn)在你只要用Visual C++ 環(huán)境中建立、編譯和運行它就可以了。
//hello.cpp
#include
15、 CStatic* cs; public: CHelloWindow(); }; // 每當應用程序首次執(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()
16、{ // 建立窗口本身 Create(NULL, "Hello World!", WS_OVERLAPPEDWINDOW, CRect(0,0,200,200)); // 建立靜態(tài)標簽 cs = new CStatic(); cs->Create("hello world", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80,150,150),
17、 this); } 上面的這段程序如果用C來實現(xiàn),得需要幾頁的代碼。這個簡單的例子做了三件事。第一,它建立了一個應用程序?qū)ο蟆D闼帉懙拿總€ MFC 程序都有一個單一的程序?qū)ο?,它是處?MFC 和 Windows 的初始細節(jié)的。第二,應用程序建立了一個窗口來作為應用程序的主窗口。最后,在應用程序的窗口中建立了一個靜態(tài)文本標簽,它包含有“hello world”幾個字。在第二部分中我們會仔細研究這段程序,以理解其結(jié)構(gòu)。 啟動 VC++,如果你是剛剛安裝好,則你會在屏幕上看到一個帶有工具欄的空窗口。如果 VC++ 已經(jīng)在該機器上使用過了,則所顯示的窗口可能有些不同,因為 VC
18、++ 會記憶和自動重新打開上次使用后退出時的項目和文件。我們需要的是它沒有裝如任何項目和代碼。如果程序啟動后彈出對話框指示不能打開某些文件,你只要單擊“No”即可。在“Window”菜單中選取“Close All”選項關(guān)閉所有窗口。在“File”菜單中選取“Close”選項來關(guān)閉其它窗口。現(xiàn)在,你就處于開始狀態(tài)了。如果你安裝VC++后,第一次運行,則屏幕應如下所示: 如果你以后不希望看到“InfoViewer Topic”窗口,你可以用按鈕把它關(guān)掉。如果以后需要的話,你還可以單擊工具欄上的“主頁”按鈕來打開該窗口。 現(xiàn)在一切都正常了。正如你所看到的,頂部是菜單和幾個工具欄。左邊的窗口所
19、顯示的是在線幫助內(nèi)容,你可以雙擊某項標題來瀏覽其內(nèi)容。在線幫助的內(nèi)容是十分豐富的。 現(xiàn)在該做什么了?你所要做的是輸入上面的程序,然后便宜并運行它。開始之前,要檢查以下你的硬盤上至少要留有5MB的剩余空間。 建立項目和編譯代碼 為了在 Visual C++ 中編譯代碼,你必須要建立一個項目。為了這么小的程序來建立一個項目可能有點小題大作,但是,在任何實際的程序中,項目的概念是非常有用的。一個項目主要保存著下面三種不同類型的信息: 1. 它可以記住建立一個可執(zhí)行程序所需要的所有源程序代碼文件。在這個簡單的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一個大型的應用程序中,為了
20、便于管理和維護,你可以會有許多個不同的源文件。項目會維護這些不同文件的列表,并當你要建立下一個新的可執(zhí)行程序時,在必要時編譯它們。 2. 它會記住針對你的應用程序所使用的編譯器和連接器選項。例如,它會記住把哪個庫連接到了執(zhí)行程序中,你是否預編譯了頭文件等等。 3. 它會記住你想要建立的項目類型: 一個控制臺應用程序,或一個窗口應用程序等等。 如果你已經(jīng)對項目文件有所了解,則會很容易明白作為機器產(chǎn)生的項目文件的作用?,F(xiàn)在,我們來建立一個簡單的項目,并用它來編譯 HELLO.CPP。 為此,首先從“File”菜單中選擇“New”選項。在“Projects”標簽中,加單擊“Win32 App
21、lication”。在“Location”域中輸入一個合適的路徑名或單擊“Browse”按鈕來選擇一個。在“Project name”中輸入“hello”作為項目名稱。這時候你會看到“hello”也會出現(xiàn)在“Location”域中。單擊“OK”按鈕。Visual C++ 會建立一個新的稱為HELLO的目錄,并把所有的項目文件 HELLO.OPT、HELLO.NCB、HELLO.DSP 和 HELLO.DSW 都放到該目錄中。如果你退出,以后再重新打開該項目,則可選擇 HELLO.DSW。 現(xiàn)在,在屏幕的左邊,出現(xiàn)了三個標簽。InfoView 標簽仍然在,又新出現(xiàn)了 ClassView 和 F
22、ileView 標簽。ClassView 標簽會把你程序中所有的類都列出來,F(xiàn)ileView 標簽給出了項目中文件的列表。 現(xiàn)在可以輸入程序的代碼了。在“File”菜單中選擇“New”選項來建立一個編輯窗口。在出現(xiàn)的對話框中,選擇“Files”標簽和“Text File”。則會出現(xiàn) Visual C++ 的智能編輯器,你可以用它來輸入上面的程序代碼。輸入代碼時,你會發(fā)現(xiàn)編輯器會自動把不同類型的文本變成不同的顏色,如注釋、關(guān)鍵字字符串等的顏色都不同。如果你要改變其顏色或關(guān)閉顏色功能,可選擇“Tools”菜單中“Options”選項,然后選擇“Format”標簽和“Source Windows”
23、選項就可以修改。 輸入完代碼后,選擇“File”菜單中的“Save”選項來保存。在 Visual C++ 新建立的目錄中,把它存成 HELLO.CPP 文件。 現(xiàn)在選擇在“Project”菜單中選擇“Add To Project”選項,再選“Files...”。你會看到一個對話框供你選擇要添加的文件。在本例子中,選擇 HELLO.CPP 文件。 在屏幕的左邊,單擊 FileView 標簽,并雙擊標有 HELLO 的圖標。你會看到名為 HELLO.CPP 的文件。單擊 ClassView 標簽,并雙擊文件夾圖標,你會看到程序中所有的類。任何時候你都可以使用 FileView 來刪除項目的文
24、件,你只要單擊該文件,然后按鍵盤上的 delete 鍵。 后,此時你必須告訴項目要使用MFC庫。如果你忽略了這一步,則項目在連接時會出錯,而出錯信息對你毫無幫助。選擇“Project”菜單的“Settings”。在出現(xiàn)的對話框中選擇“General”標簽。在“Microsoft Foundation Classes”組合框中,選擇“Use MFC in a Shared DLL”。然后關(guān)閉對話框。 我們已經(jīng)建立了項目文件,并調(diào)整了設(shè)置,你現(xiàn)在可以準備編譯 HELLO.CPP 程序了。在“Build”菜單中,你會發(fā)現(xiàn)有三個不同的編譯選項: 1. Compile HELLO.CPP (只有當
25、含有 HELLO.CPP 的窗口處于激活狀態(tài)時才可) 2. Build HELLO.EXE 3. Rebuild All 第一個選項只是編譯源文件并形成它們的目標文件。該選項不能完成連接任務(wù),所以它只對快速編譯一些源文件以檢查錯誤有用。第二個選項編譯自上次編譯后所修改的所有源文件,并連接形成可執(zhí)行文件。第三個選項要重新編譯和連接所有的源文件。 我們可以選擇“Build HELLO.EXE”來編譯和連接代碼。Visual C++ 會建立一個名為“Debug”的新子目錄,并把 HELLO.EXE 放在該目錄中。該子目錄的文件都是可以再產(chǎn)生的,所以你可以任意刪除它們。 如果你發(fā)現(xiàn)了編譯錯誤
26、,雙擊輸出窗口中的錯誤信息。這時編輯器會把你帶到出錯的位置處。檢查你的代碼是否有問題,如果有,就修改之。如果你看到大量的連接錯誤,則可能你在建立項目對話框中所指定的項目類型不對。你可以把該項目所在的子目錄刪除,然后再重新按上面的步驟來建立。 為了執(zhí)行該程序,你可選則“Build”菜單中的“Execute HELLO.EXE”選項。你就可以看到你的第一個MFC程序了 -- 出現(xiàn)一個帶有“hello world”的窗口。該窗口本身帶有:標題欄、尺寸縮放區(qū)、最大和最小按鈕等等。在窗口上,有一個標有“hello world”。請注意,該程序是完整的。你可以移動窗口、縮放窗口、最小化等。你只使用了很少
27、的代碼就完成了一個完整的 Window 應用程序。這就是使用 MFC 的優(yōu)點。所有的細節(jié)問題都有MFC來處理。 結(jié)論 在本講中,你已經(jīng)成功地編譯和執(zhí)行了你的第一個 MFC 程序。你將來會用類似的步驟來建立的應用程序。你可以為每個項目建立單獨的目錄,或建立一個單獨的項目文件,然后再添加或刪除不同的源文件。 在下一講中,我們將仔細研究該程序,你會更完整的理解它的結(jié)構(gòu)。 第二部分:一個簡單的MFC程序 在本將中,我們將一段一段地來研究上一將中提到的 MFC 應用程序,以便能理解它的結(jié)構(gòu)和概念框架。我們將先介紹 MFC,然后在介紹如何用 MFC 來建立應用程序。 MFC簡介
28、MFC 是一個很大的、擴展了的 C++ 類層次結(jié)構(gòu),它能使開發(fā) Windows 應用程序變得更加容易。MFC 是在整個 Windows 家族中都是兼容的,也就是說,無論是 Windows3.x、Windows95 還是 Windows NT,所使用的 MFC 是兼容的。每當新的 Windows 版本出現(xiàn)時,MFC 也會得到修改以便使舊的編譯器和代碼能在新的系統(tǒng)中工作。MFC 也回得到擴展,添加新的特性、變得更加容易建立應用程序。 與傳統(tǒng)上使用 C 語言直接訪問 Windows API相反,使用 MFC 和 C++ 的優(yōu)點是 MFC 已經(jīng)包含和壓縮了所有標準的“樣板文件”代碼,這些代碼是所有用
29、 C 編寫的 Windows 程序所必需的。因此用 MFC 編寫的程序要比用C語言編寫的程序小得多。另外,MFC 所編寫的程序的性能也毫無損失。必要時,你也可以直接調(diào)用標準 C 函數(shù),因為 MFC 不修改也不隱藏 Windows 程序的基本結(jié)構(gòu)。 使用 MFC 的最大優(yōu)點是它為你做了所有最難做的事。MFC 中包含了上成千上萬行正確、優(yōu)化和功能強大的 Windows 代碼。你所調(diào)用的很多成員函數(shù)完成了你自己可能很難完成的工作。從這點上將,MFC 極大地加快了你的程序開發(fā)速度。 MFC 是很龐大的。例如,版本4.0中包含了大約200個不同的類。萬幸的是,你在典型的程序中不需要使用所有的函數(shù)。事
30、實上,你可能只需要使用其中的十多個 MFC 中的不同類就可以建立一個非常漂亮的程序。該層次結(jié)構(gòu)大約可分為幾種不同的類型的類: l 應用程序框架 l 圖形繪制的繪制對象 l 文件服務(wù) l 異常處理 l 結(jié)構(gòu) - List、Array 和 Map l Internet 服務(wù) l OLE 2 l 數(shù)據(jù)庫 l 通用類 在本教程中,我們將集中討論可視對象。下面的列表給出了部分類: 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 在上面的列表中,有幾點需要注意。第一,MFC 中的大部分類都是從基類 CObject 中繼承下來的。該類包含有大部分MFC類所通用的數(shù)據(jù)成員和成員函數(shù)。第二,是該列表的簡單性。CWinApp 類是在你建立應用程序是要用到的,并且任何程序中都只用一次。CWnd 類匯集了 Windows 中的所有通用特性、對話框和控制。CFrameWnd 類是從 CWnd 繼承來的,并實現(xiàn)了標準的框架應用程序。CDialog 可分別處理無模式和有模式兩種類型的對話
32、框。CView 是用于讓用戶通過窗口來訪問文檔。最后,Windows 支持六種控制類型: 靜態(tài)文本框、可編輯文本框、按鈕、滾動條、列表框和組合框(一種擴展的列表框)。一旦你理解了這些,你也就能更好的理解 MFC 了。MFC 中的其它類實現(xiàn)了其它特性,如內(nèi)存管理、文檔控制等。 為了建立一個MFC應用程序,你既要會直接使用這些類,而通常你需要從這些類中繼承新的類。在繼承的類中,你可以建立新的成員函數(shù),這能更適用你自己的需要。你在第一講中的簡單例子中已經(jīng)看到了這種繼承過程,下面會詳細介紹。CHelloApp 和 CHelloWindow 都是從已有的 MFC 類中繼承的。 設(shè)計一個程序 在
33、討論代碼本身之前,我們需要花些工夫來簡單介紹以下 MFC 中程序設(shè)計的過程。例如,假如你要編一個程序來向用戶顯示“Hello World”信息。這當然是很簡單的,但仍需要一些考慮。 “hello world”應用程序首先需要在屏幕上建立一個窗口來顯示“hello world”。然后需要實際把“hello world”放到窗口上。我們需要但個對象來完成這項任務(wù): 1. 一個應用程序?qū)ο?,用來初始化應用程序并把它掛?Windows 上。該應用程序?qū)ο筇幚硭械牡图壥录? 2. 一個窗口對象來作為主窗口。 3. 一個靜態(tài)文本對象,用來顯示“hello world”。 你用 MFC 所建立
34、的每個程序都會包含頭兩個對象。第三個對象是針對該應用程序的。每個應用程序都會定義它自己的一組用戶界面對象,以顯示應用程序的輸出和收集應用的輸入信息。 一旦你完成了界面的設(shè)計,并決定實現(xiàn)該界面所需要的控制,你就需要編寫代碼來在屏幕上建立這些控制。你還會編寫代碼來處理用戶操作這些控制所產(chǎn)生的信息。在“hello world”應用程序中,只有一個控制。它用來輸出“hello world”。復雜的程序可能在其主窗口和對話框中需要上百個控制。 應該注意,在應用程序中有兩種不同的方法來建立用戶控制。這里所介紹的是用 C++ 代碼方式來建立控制。但是,在比較大的應用程序中,這種方法是不可行的。因此,在通
35、常情況下要使用資源文件的圖形編輯器來建立控制。這種方法要方便得多。
理解“hello world”的代碼
下面列出了你在上一講中已經(jīng)輸入、編譯和運行的“hello world”程序的代碼。添加行號是為了討論方便。我們來一行行地研究它,你會更好的理解 MFC 建立應用程序的方式。
如果你還沒有編譯和運行該代碼,應該按上一講的方法去做。
1 //hello.cpp
2 #include
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 中所使用的所有的類型、類、函數(shù)和變量。它也包含了其它頭文件,如 Windows API 庫等。 第 3 至 8 行從 MFC 說明的標準應用程序類 CWinApp 繼承出了新的應用程序類 CHelloApp。該新類是為了要重載 CWinApp 中的 InitInstance 成員函數(shù)。InitInstance 是一個應用程序開始執(zhí)行時要調(diào)用的可重載函數(shù)。
40、在第10行中,說明了應用程序作為全局變量的一個事例。該實例是很重要的,因為它要影響到程序的執(zhí)行。當應用程序被裝入內(nèi)存并開始執(zhí)行時,全局變量的建立會執(zhí)行 CWinApp 類的缺省構(gòu)造函數(shù)。該構(gòu)造函數(shù)會自動調(diào)用在18至26行定義的 InitInstance 函數(shù)。 在第11至17中,CHelloWindow 類是從 MFC 中的 CFrameWnd 類繼承來的。CHelloWindow 是作為應用程序在屏幕上的窗口。建立新的類以便實現(xiàn)構(gòu)造函數(shù)、析構(gòu)函數(shù)和數(shù)據(jù)成員。 第18至26行實現(xiàn)了 InitInstance 函數(shù)。該函數(shù)產(chǎn)生一個 CHelloWindow 類的事例,因此會執(zhí)行第27行至41
41、行中類的構(gòu)造函數(shù)。它也會把新窗口放到屏幕上。 第27至41實現(xiàn)了窗口的構(gòu)造函數(shù)。該構(gòu)造函數(shù)實際是建立了窗口,然后在其中建立一個靜態(tài)文本控制。 要注意的是,在該程序中沒有 main 或 WinMain 函數(shù),也沒有事件循環(huán)。然而我們從上一講在執(zhí)行中知道它也處理了事件。窗口可以最大或最小化、移動窗口等等。所有這些操作都隱藏在主應用程序類 CWinApp 中,并且我們不必為它的事件處理而操心,它都是自動執(zhí)行、在 MFC 中不可見的。 下一節(jié)中,將詳細介紹程序的各部分。你可能不能馬上全都理解得很好: 但你最好先讀完它以獲得第一印象。在下一講中,會介紹一些特殊的例子,并偶把各片段組合在一起,有助于
42、你能更好的理解。 程序?qū)ο? 用 MFC 建立的每個應用程序都要包括一個單一從 CWinApp 類繼承來的應用程序?qū)ο蟆T搶ο蟊仨毐徽f明成全局的(第10行),并且在你的程序中只能出現(xiàn)一次。 從 CWinApp 類繼承的對象主要是處理應用程序的初始化,同時也處理應用程序主事件循環(huán)。CWinApp 類有幾個數(shù)據(jù)成員和幾個成員函數(shù)。在上面的程序中,我們只重載了一個 CWinApp 中的虛擬函數(shù) InitInstance。 應用程序?qū)ο蟮哪康氖浅跏蓟涂刂颇愕某绦?。因?Windows 允許同一個應用程序的多個事例在同時執(zhí)行,因此 MFC 把初始化過程分成兩部分并使用兩個函數(shù) InitApp
43、lication 和 InitInstance 來處理它。此處,我們只使用了一個 InitInstance 函數(shù),因為我們的程序很簡單。當每次調(diào)用應用程序時都會調(diào)用一個新的事例。第3至8行的代碼建立了一個稱為 CHelloApp 的類,它是從 CWinApp 繼承來的。它包含一個新的 InitInstance 函數(shù),是從 CWinApp 中已存在的函數(shù)(不做任何事情)重載來的: 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 來建立并顯示窗口: 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,則表明應用程序會立即終止。在下一節(jié)中我們將會看到窗口初始化的詳細過程。 當應用程序?qū)ο笤诘?0行建立時,它的數(shù)據(jù)成員(從 CWinApp 繼承來的) 會自動初始化。例如,m_pszAppName、m_lpCmdLine 和 m_nCmdShow 都包含有適當?shù)某跏蓟?。你可參?MFC 的幫助文件來獲得更詳細的信息。我們將使用這些變量中的一個。 窗口對象 MFC 定義
46、了兩個類型的窗口: 1) 框架窗口,它是一個全功能的窗口,可以改變大小、最小化、最大化等等; 2) 對話框窗口,它不能改變大小??蚣艽翱谑堑湫偷闹鲬贸绦虼翱?。 在下面的代碼中,從 CFrameWnd 中繼承了一個新的類 CHelloWindow: 11 // Declare the main window class 12 class CHelloWindow : public CFrameWnd 13 { 14 CStatic* cs; 15 public: 16 CHelloWindow(); 17 }; 它包括一個新的構(gòu)造函數(shù),同時還有一個指向程序中所使用的唯
47、一用戶界面控制的數(shù)據(jù)成員。你多建立的每個應用程序在主窗口中都會有唯一的一組控制。因此,繼承類將有一個重載的構(gòu)造函數(shù)以用來建立主窗口所需要的所有控制。典型情況下,該類會包含有一個析構(gòu)函數(shù)以便在窗口關(guān)閉時來刪除他們。我們這里沒有使用析構(gòu)函數(shù)。在第四講中,我們將會看到繼承窗口類也會說明一個消息處理函數(shù)來處理這些控制在響應用戶事件所產(chǎn)生的消息。 典型地,一個應用程序?qū)⒂幸粋€主應用程序窗口。因此,CHelloApp 應用程序類定義了一個名為 m_pMainWnd 成員變量來指向主窗口。為了建立該程序的主窗口,InitInstance 函數(shù)(第18至26行)建立了一個 CHelloWindow 事例,并
48、使用 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 = new CHelloWindow(); 23 m_pMainWnd->ShowWindow(m_nCmdShow); 24 m_pMainWnd->UpdateWindow();
49、25 return TRUE; 26 } 只建立一個簡單的框架窗口是不夠的。還要確保窗口能正確地出現(xiàn)在屏幕上。首先,代碼必須要調(diào)用窗口的 ShowWindow 函數(shù)以使窗口出現(xiàn)在屏幕上(第23行)。其次,程序必須要調(diào)用 UpdateWindow 函數(shù)來確保窗口中的每個控制和輸出能正確地出現(xiàn)在屏幕上(第24行)。 你可能奇怪,ShowWindow 和 UpdateWindow 函數(shù)是在哪兒定義的。例如,如果你要查看以便了解它們,你可能要查看 MFC 的幫助文件中的 CFrameWnd 定義部分。但是 CFrameWnd 中并不包含有這些成員函數(shù)。CFrameWnd 是從 CWnd 類繼承
50、來的。你可以查看 MFC 文檔中的 CWnd,你會發(fā)現(xiàn)它包含有200多個不同的成員函數(shù)。顯然,你不能在幾分鐘內(nèi)掌握這些函數(shù),但是你可以掌握其中的幾個,如 ShowWindow 和UpdateWindow。 現(xiàn)在讓我們花幾分鐘來看一下 MFC 幫助文件中的 CWnd::ShowWindow 函數(shù)。為此,你你可以單擊幫助文件中的 Search 按鈕,并輸入“ShowWindow”。找到后,你會注意到,ShowWindow 只有一個參數(shù),你可以設(shè)置不同的參數(shù)值。我們把它設(shè)置成我們程序中 CHelloApp 的數(shù)據(jù)成員變量 m_nCmdShow (第23行)。m_nCmdShow 變量是用來初始化應
51、用程序啟動的窗口顯示方式的。例如,用戶可能在程序管理器中啟動應用程序,并可通過應用程序?qū)傩詫υ捒騺砀嬷绦蚬芾砥鲬贸绦蛟趩訒r要保持最小化狀態(tài)。m_nCmdShow 變量將被設(shè)置成 SW_SHOWMINIMIZED,并且應用程序會以圖標的形式來啟動,也就是說,程序啟動后,是一個代表該程序的圖標。m_nCmdShow 變量是一種外界與應用程序通訊的方式。如果你愿意,你可以用不同的 m_nCmdShow 值來試驗 ShowWindow 的效果。但要重新編譯程序才能看到效果。 第22行是初始化窗口。它為調(diào)用 new 函數(shù)分配內(nèi)存。在這一點上,程序在執(zhí)行時會調(diào)用CHelloWindow的構(gòu)造函數(shù)。
52、該構(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 window itself 31 Create(NULL, 32 "Hello World!", 33 WS_OVERLAPPEDWINDOW, 34 CRect(0,0,200,200)); 建
53、立函數(shù)共傳遞了四個參數(shù)。通過查看 MFC 文檔,你可以了解不同類型。NULL 參數(shù)表示使用缺省的類名。第二個參數(shù)為出現(xiàn)在窗口標題欄上的標題。第三個參數(shù)為窗口的類型屬性。該程序使用了正常的、可覆蓋類型的窗口。在下一講中將詳細介紹類型屬性。第四個參數(shù)指出窗口應該放在屏幕上的位置和大小,左上角為(0,0), 初始化大小為 200×200個象素。如果使用了 rectDefault,則 Windows 會為你自動放置窗口及大小。 因為我們的程序太簡單了,所以它只在窗口中建立了一個靜態(tài)文本控制。見第35至40行。下面將詳細介紹。 靜態(tài)文本控制 程序在從 CFrameWnd 類中繼承 CHello
54、Window 類時(第11至17行)時,說明了一個成員類型 CStatic及其構(gòu)造函數(shù)。 正如在前面所見到的,CHelloWindow 構(gòu)造函數(shù)主要做兩件事情。第一是通過調(diào)用Create函數(shù)(第31行)來建立應用程序的窗口。然后分配和建立屬于窗口的控制。在我們的程序中,只使用了一個控制。在 MFC 中建一個對象總要經(jīng)過兩步。第一是為類的事例分配內(nèi)存,然后是調(diào)用構(gòu)造函數(shù)來初始化變量。下一步,調(diào)用 Create 函數(shù)來實際建立屏幕上的對象。代碼使用這兩步分配、構(gòu)造和建立了一個靜態(tài)文本對象(第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)存時調(diào)用的,然后就調(diào)用了 Create 函數(shù)來建立 CStatic 控制的窗口。Create 函數(shù)所使用的參數(shù)與窗口建立函數(shù)所使用的參數(shù)是類似的(第31行)。第一個參數(shù)指定了控制中所要顯示的文本內(nèi)容。第二個參數(shù)指定了類型屬性。類型屬性在下一講中將詳細介紹。在次我們使用的是子窗口類型(既在別的窗口中顯示的窗口),還有它是可見的,還有文本的顯示位置是居中的。第三個參數(shù)決定了控制的大小和位置。第四參數(shù)表示該子窗口的父窗口。已經(jīng)建立了一個靜態(tài)控制,它將出現(xiàn)在應用程序窗口上,并顯示指定
57、的文本。 結(jié)論 第一次瀏覽該代碼,也可能不是很熟悉和有些讓人煩惱。但是不要著急。從程序員的觀點來看,整個程序的主要工作就是建立了 CStatic 控制(36至40行)。在下一講中,我們詳細向你介紹36至40行代碼的含義,并可看到定制 CStatic 控制的幾個選項。 第三部分:MFC樣式 控制是用來建立Windows應用程序用戶界面的用戶界面對象。你所見到的大部分Windows應用程序和對話框只不過是由一些控制所組成的、用來實現(xiàn)程序功能的東西。為了建立有效的應用程序,你必須完全理解在Windows應用程序中應該如何合理的使用控制。有六個基本的控制:CStatic、CButt
58、on、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增強了的控制。你需要理解的是那個控制能做些什么、你應該如何控制它的外表和行為以及如何讓控制能響應用戶事件。只要掌握了這些,再加上掌握了菜單和對話框,你就可以建立你所想象的任何Windows應用程序。你可以象本教程這樣用程序代碼來建立控制,也可以使用資源編輯器通過資源文件來建立。當然,對話框編輯器更方便些,它對于已經(jīng)基本掌握了控制的情況下特別有用。 最簡單的控制是CStatic, 它是用來顯示靜態(tài)文本的。CStatic類沒有任何數(shù)據(jù)成員,它只有少量的成員函數(shù):構(gòu)造函數(shù)、Create函數(shù)
59、(用于獲取和設(shè)置靜態(tài)控制上的圖標)等等。它不響應用戶事件。因為它的簡單性,所以最好把它作為學習Windows控制的開端。 在本講中,我們從CStatic著手,看一下如何修改和定制控制。在下一講中,我們將學習CButton和CScrollBar類,以理解事件處理的概念。一旦你理解和掌握了所有控制極其類,你就可以建立完整的應用程序了。 基 礎(chǔ) MFC中的CStatic類是用來顯示靜態(tài)文本信息的。這些信息能夠可以作為純信息(例如,顯示在信息對話框中的錯誤消息), 或作為小的標簽等。在Windows應用程序的文件打開對話框中,你會發(fā)現(xiàn)有六個這樣的標簽。 CStatic控制還有幾種其它的顯
60、示格式。你可以通過修改標簽的樣式來使它表現(xiàn)為矩形、邊框或圖標等。 CStatic控制總是作為子窗口的形式出現(xiàn)的。典型情況下,其父窗口是應用程序的主窗口或?qū)υ捒?。正如上一講所介紹的,你用兩行代碼就可以建立一個靜態(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來為CStatic
61、類的事例分配內(nèi)存,然后調(diào)用類的構(gòu)造函數(shù)。構(gòu)造函數(shù)是用來完成類所需要的初始化功能的。Create函數(shù)建立控制并把它放到屏幕上。 Create函數(shù)有五個參數(shù): lpszText: 指定了要顯示的文本。 rect: 控制文本區(qū)域的位置、大小和形狀。 pParentWnd: 指明CStatic控制的父窗口。該控制會出現(xiàn)在其父窗口中,且其位置是相對于其父窗口的用戶區(qū)域而言的。 nID: 整數(shù)值,表示該控制的標識符。 dwStyle: 最重要的參數(shù)。它控制著控制的外觀和行為。 CStatic樣式 所有的控制都有各種顯示樣式。樣式是在用Create函數(shù)建立控制時傳遞給它的dw
62、Style參數(shù)所決定的。對CStatic有效的樣式簡介如下: 從CWnd繼承來的樣式: l WS_CHILD CStatic所必須的。 l WS_VISIBLE 表示該控制對用戶應該是可見的。 l WS_DISABLED 表示該控制拒絕接受用戶事件。 l WS_BORDER 控制的文本區(qū)域帶有邊框。 CStatic固有的樣式: l SS_BLACKFRAME 該控制區(qū)域以矩形邊界顯示。顏色與窗口框架相同。 l SS_BLACKRECT ? 該控制以填充的矩形顯示。顏色與當前的窗口框架相同。 l SS_CENTER 文本居中。 l SS_GRAYFRAME 控制以矩形
63、邊框方式顯示。顏色與當前桌面相同。 l SS_GRAYRECT 該控制以填充的矩形顯示。顏色與當前的桌面相同。 l SS_ICON 控制以圖標形式顯示。文本作為圖標在資源文件的名稱。rect參數(shù)只控制位置。 l SS_LEFT 文本居左顯示。文字可回繞。 l SS_LEFTNOWORDWRAP 文本居左顯示。多余的文字被剪裁。 l SS_NOPREFIX 表示字符串中的"&"字符不表示為加速前綴。 l SS_RIGHT 文本居右顯示。文字可回繞。 l SS_SIMPLE 只簡單的顯示一行文本。任何CTLCOLOR信息都被其父窗口忽略。 l SS_USERITEM 用戶
64、定義項。 l SS_WHITEFRAME 控制以矩形邊框方式顯示。顏色與當前窗口背景顏色相同。 l SS_WHITERECT 控制以填充矩形方式顯示。顏色與當前窗口背景顏色相同。 這些常數(shù)中,“SS”(Static Style)開頭的表示只能用于CStatic控制。以“WS”(Window Style)開頭的常數(shù)表示可適用于所有窗口,它們定義在CWnd對象中。CWnd中還有很多以“WS”樣式常數(shù)。你可以在MFC文檔中的CWnd::Create函數(shù)中找到它們。上面的四種是只用于CStatic對象的。 CStatic對象至少要帶有兩個樣式:WS_CHILD和WS_VISIBLE。該控制必
65、須作為另一窗口的子窗口來建立。如果不使用WS_VISIBLE,則所建立的控制是看不見的。WS_DISABLED控制著標簽對事件的響應,因為CStatic不接收鍵盤或鼠標事件,所以使用該項是多余的。
所有的其它樣式選項都是可選的,它們控制著標簽的外觀。在CStatic::Create函數(shù)中使用這些控制,可以控制CStatic在屏幕上的顯示。
CStatic文本的外觀
下面的代碼對于理解CStatic是有幫助的。它與上一講中介紹的代碼類似,但是修改了CStatic的建立部分。
//static1.cpp
#include
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
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學期初中歷史上冊教研組工作總結(jié)
- 2024年小學高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學期小學語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習整治報告
- 2025年學校元旦迎新盛典活動策劃方案
- 2024年學校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告