❶ 關於自學C語言
Visual C++ MFC 簡明教程
原著:Marshall Brain 編譯:張聖華
第一部分:MFC導論
Visual C++ 不僅僅是一個編譯器。它是一個全面的應用程序開發環境,使用它你充分利用具有面向對象特性的 C++ 來開發出專業級的 Windows 應用程序。為了能充分利用這些特性,你必須理解 C++ 程序設計語言。掌握了C++,你就必須掌握 Microsoft 基本類庫 (MFC) 的層次結構。該層次 結構包容了 Windows API 中的用戶界面部分,並使你能夠很容易地以面向對象的方式建立 Windows 應用程序。這種層次結構適用於所有版本的 Windows 並彼此兼容。你用 MFC 所建立的代碼是完全可移植的。
該教程將向你介紹MFC的基本概念和術語以及事件驅動程序設計方法。在本節中,你將會輸入、編譯和運行一個簡單的MFC程序。下一節中將向你詳細解釋這些代碼。第三部分討論了MFC控制和如何定製它們。第四部分將介紹消息映射,你將會處理MFC的事件。
什麼是MFC?
如果你要建立一個 Windows 應用程序,應該如何下手?
好的開端是從設計用戶界面開始。首先,你要決定什麼樣的用戶能使用該程序並根據需要來設置相應的用戶界面對象。Windows 用戶界面有一些標準的控制,如按鈕、菜單、滾動條和列表等,這對那些 Windows 用戶已經是很熟悉了。 要記住的是,作為程序員必須選擇一組控制並決定如何把它們安排到屏幕上。傳統上,你需要在紙上做一下用戶界面的草圖,直到對各元素感到滿意為止。這對於一些比較小的項目,以及一些大項目的早期原型階段是可以的。
下一步,是要實現代碼。為任何 Windows 平台建立應用程序時,程序員都有兩種選擇:C 或 C++。 使用 C,程序員是在 Windows 應用程序界面 ( API ) 的水平上編寫代碼。該界面是由幾百個 C 函數所組成,這些函數在Windows API 參考手冊中都有介紹。對於Windows NT, API 被稱為 「Win32 API」,以區別於其用於Windows 3.1的16位 API。
Microsoft 也提供了 C++ 庫,它位於任何 Windows API 之上,能夠使程序員的工作更容易。它就是Microsoft基本類庫 (MFC),該庫的主要優點是效率高。它減少了大量在建立 Windows 程序時必須編寫的代碼。同時它還提供了所有一般 C++ 編程的優點,例如繼承和封裝。MFC 是可移植的,例如,在 Windows 3.1下編寫的代碼可以很容易地移植到 Windows NT 或 Windows 95 上。因此,MFC 很值得推薦的開發Windows 應用程序的方法,在本教程自始至終使用的都是 MFC。
當是使用 MFC 時,你編寫的代碼是用來建立必要的用戶界面控制並定製其外觀。同時你還要編寫用來響應用戶操作這些控制的代碼。例如,如果用戶單擊一個按鈕時,你應該有代碼來響應。這就是事件驅動代碼,它構成了所有應用程序。一旦應用程序正確的響應了所有允許的控制,它的任務也就完成了。
你可以看出,使用 MFC 進行 Windows 編程時是一件比較容易的的過程。本教程的目的是比較詳細地教你如何快速建立專業級的應用程序的技術。Visual C++ 應用程序開發程序環境特別適合於使用 MFC (也有其它開發環境使用MFC,譯者注),所以一起學習 MFC 和 Visual C++ 能夠增強你的開發程序的能力。
Windows詞彙
在 Windows 用戶界面和軟體開發中所要用到的詞彙都是基本和唯一的。對於新接觸該環境的用戶,下面復習幾個定義以便使我們的討論更加容易。
Windows應用程序使用幾個標準的控制:
靜態文本標簽
按鈕
列表框
組合框(一種更高級的列表框)
單選按鈕
檢查按鈕
編輯框(單行和多行)
滾動條
你可以通過代碼或「資源編輯器」來建立這些控制,在資源編輯器中可以建立對話框和這些控制。在本教程中,我們將使用代碼來建立它們。
Windows支持幾種類型的應用程序窗口。一個典型的應用程序應該活動在稱為「框架窗口」中。一個框架窗口是一個全功能的主窗口,用戶可以改變尺寸、最小化、最大化等。Windows也支持兩種類型的對話框:模式和無模式對話框。模式對話框一旦出現在屏幕上,只有當它退出時,屏幕上該應用程序的其餘部分才能響應。無模式對話框出現在屏幕上時,程序的其餘部分也可以作出響應,它就象浮動在上面一樣。
最簡單的 Windows 應用程序是使用單文檔界面(SDI),只有一個框架窗口。Windows 的鍾表、PIF 編輯器、記事本等都是 SDI 應用程序的例子。Windows 也提供了一種稱為多文檔界面的組織形式,它可用於更復雜的應用程序。MDI 系統允許用戶在同一應用程序中同時可以查看多個文檔。例如,一個文本編輯器可以允許用戶同時打開多個文本文件。使用 MDI 時,應用程序有一個主窗口,在主窗口中有一些子窗口,每個子窗口中各自包含有各自的文檔。在MDI框架中,主窗口有一個主菜單,它對主框架中最頂端窗口有效。各子窗口都可以縮成圖標或展開,MDI主窗口也可以變成桌面上的一個圖標。MDI界面可能會給你一種第二桌面的感覺,它對窗口的管理和刪除混亂的窗口有很大的幫助。
你所建立的沒一個應用程序都會使用它自己的一套控制、菜單結構以及對話框。應用程序界面的好壞取決於你如何選擇和組織這些界面對象。Visual C++ 中的資源編輯器可以使你能容易的建立和定製這些界面對象。
事件驅動軟體和詞彙
所有基於窗口的 GUI 都包含相同的基本元素,它們的操作方式都是相同的。在屏幕上,用戶所看到的是一組窗口,每個窗口都包含有控制、圖標、對象以及一些處理滑鼠和鍵盤的元素。從用戶角度來看,各系統的界面對象都是相同的:按鈕、滾動條、圖標、對話框以及下拉菜單等等。盡管這些界面元素的「外觀和感覺」可能有些不同,但這些界面對象的工作方式都是相同的。例如,滾動條對於Windows、Mac和Motif可能有些不同,但他們的作用完全是一樣的。
從程序員的角度來看,這些系統在概念上是相似的,盡管它們可能有很大的不同。為了建立 GUI 程序,程序員第一步要把所有需要的用戶界面控制都放到窗口上。例如,如果程序員要建立一個從攝氏到華氏的轉換的簡單程序,則程序員所選擇的用戶界面對象來完成並在屏幕上把結果顯示出來。在這個簡單的程序中,程序員可能需要用戶在一個可編輯的編輯框中輸入溫度值,在一個不可編輯的編輯框中顯示轉換結果,然後讓用戶可以單擊一個標有「退出」的按鈕來退出應用程序。
因為是用戶來操作應用程序的控制,所以程序必須作出響應。所做的響應依賴於用戶使用滑鼠或鍵盤在不同控制上的操作。屏幕上的每個用戶界面對象對事件的響應是不同的。例如,如果用戶單擊退出按鈕,則該按鈕必須更新屏幕、加亮它自己。然後程序必須響應退出。
Windows 所用的模式也是類似的。在一個典型的應用程序中,你將建立一個主窗口,並且在其中放置了一些用戶界面控制。這些控制通常被稱為子窗口——它們就象一些在主窗口中的更小更特殊的子窗口。作為程序員,你應該通過函數調用來發送信息操作這些控制、通過把信息發送給你到代碼來響應用戶的操作。
如果你從未做過事件驅動程序設計,則所有這些對你來說可能是很陌生的。但是,事件驅動程序設計方式是很容易理解的。具體的細節對不同的系統可能有些不同,但是其基本概念是類似的。在一個事件驅動界面中,應用程序會在屏幕上繪制幾個界面對象,如按鈕、文本區和菜單。應用程序通常通過一段稱為事件循環的的代碼來響應用戶的操作。用戶可以使用滑鼠或鍵盤來任意操作屏幕上的對象。例如,用戶用滑鼠單擊一個按鈕。用滑鼠單擊就稱為一個事件。事件驅動系統把用戶的動作如滑鼠單擊和鍵盤操作定義為事件,也把系統操作如更新屏幕定義為事件。
在比較低級的編程方法中,如用C直接編寫Windows API應用程序,代碼量是非常大的,因為你所要照顧的細節太多了。例如,你用某種類型的結構來接收單擊滑鼠事件。你的事件循環中的代碼會查看結構中不同域,以確定哪個用戶界面對象受到了影響,然後會完成相應的操作。當屏幕上有很多對象時,應用程序會變得很大。只是簡單地處理哪個對象被單擊和對它需要做些什麼要花費大量的代碼。
幸運的是,你可以在比較高級的方法來進行編程,這就是使用MFC。在MFC中,幾乎所有的低級的細節處理都為你代辦了。如果你把某一用戶界面對象放在屏幕上,你只需要兩行代碼來建立它。如果用戶單擊一個按鈕,則按鈕自己會完成一切必要的操作,從更新屏幕上的外觀到調用你程序中的預處理函數。該函數包含有對該按鈕作出相應操作的代碼。MFC 為你處理所有的細節:你建立按鈕並告知它特定的處理函數,則當它被按下時,它就會調用相應的函數。第四部分介紹了怎樣使用消息映射來處理事件。
例子
理解一個典型的 MFC 程序的結構和樣式的最好方法是輸入一段小程序,然後編譯和運行它。下面的程序是一段簡單的「hello world」程序。這對很多C程序員都是很熟悉了,讓我們看一下如何用MFC方法來實現。如果你是第一次看到這類程序,也許比較難理解。這沒關系,我們後面會詳細介紹。現在你只要用Visual C++ 環境中建立、編譯和運行它就可以了。
//hello.cpp
#include <afxwin.h>
// 說明應用程序類
class CHelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
// 建立應用程序類的實例
CHelloApp HelloApp;
// 說明主窗口類
class CHelloWindow : public CFrameWnd
{
CStatic* cs;
public:
CHelloWindow();
};
// 每當應用程序首次執行時都要調用的初始化函數
BOOL CHelloApp::InitInstance()
{
m_pMainWnd = new CHelloWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
// 窗口類的構造函數
CHelloWindow::CHelloWindow()
{
// 建立窗口本身
Create(NULL,
"Hello World!",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// 建立靜態標簽
cs = new CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(50,80,150,150),
this);
}
上面的這段程序如果用C來實現,得需要幾頁的代碼。這個簡單的例子做了三件事。第一,它建立了一個應用程序對象。你所編寫的每個 MFC 程序都有一個單一的程序對象,它是處理 MFC 和 Windows 的初始細節的。第二,應用程序建立了一個窗口來作為應用程序的主窗口。最後,在應用程序的窗口中建立了一個靜態文本標簽,它包含有「hello world」幾個字。在第二部分中我們會仔細研究這段程序,以理解其結構。
啟動 VC++,如果你是剛剛安裝好,則你會在屏幕上看到一個帶有工具欄的空窗口。如果 VC++ 已經在該機器上使用過了,則所顯示的窗口可能有些不同,因為 VC++ 會記憶和自動重新打開上次使用後退出時的項目和文件。我們需要的是它沒有裝如任何項目和代碼。如果程序啟動後彈出對話框指示不能打開某些文件,你只要單擊「No」即可。在「Window」菜單中選取「Close All」選項關閉所有窗口。在「File」菜單中選取「Close」選項來關閉其它窗口。現在,你就處於開始狀態了。如果你安裝VC++後,第一次運行,則屏幕應如下所示:
如果你以後不希望看到「InfoViewer Topic」窗口,你可以用按鈕把它關掉。如果以後需要的話,你還可以單擊工具欄上的「主頁」按鈕來打開該窗口。
現在一切都正常了。正如你所看到的,頂部是菜單和幾個工具欄。左邊的窗口所顯示的是在線幫助內容,你可以雙擊某項標題來瀏覽其內容。在線幫助的內容是十分豐富的。
現在該做什麼了?你所要做的是輸入上面的程序,然後便宜並運行它。開始之前,要檢查以下你的硬碟上至少要留有5MB的剩餘空間。
建立項目和編譯代碼
為了在 Visual C++ 中編譯代碼,你必須要建立一個項目。為了這么小的程序來建立一個項目可能有點小題大作,但是,在任何實際的程序中,項目的概念是非常有用的。一個項目主要保存著下面三種不同類型的信息:
1. 它可以記住建立一個可執行程序所需要的所有源程序代碼文件。在這個簡單的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一個大型的應用程序中,為了便於管理和維護,你可以會有許多個不同的源文件。項目會維護這些不同文件的列表,並當你要建立下一個新的可執行程序時,在必要時編譯它們。
2. 它會記住針對你的應用程序所使用的編譯器和連接器選項。例如,它會記住把哪個庫連接到了執行程序中,你是否預編譯了頭文件等等。
3. 它會記住你想要建立的項目類型: 一個控制台應用程序,或一個窗口應用程序等等。
如果你已經對項目文件有所了解,則會很容易明白作為機器產生的項目文件的作用。現在,我們來建立一個簡單的項目,並用它來編譯 HELLO.CPP。
為此,首先從「File」菜單中選擇「New」選項。在「Projects」標簽中,加單擊「Win32 Application」。在「Location」域中輸入一個合適的路徑名或單擊「Browse」按鈕來選擇一個。在「Project name」中輸入「hello」作為項目名稱。這時候你會看到「hello」也會出現在「Location」域中。單擊「OK」按鈕。Visual C++ 會建立一個新的稱為HELLO的目錄,並把所有的項目文件 HELLO.OPT、HELLO.NCB、HELLO.DSP 和 HELLO.DSW 都放到該目錄中。如果你退出,以後再重新打開該項目,則可選擇 HELLO.DSW。
現在,在屏幕的左邊,出現了三個標簽。InfoView 標簽仍然在,又新出現了 ClassView 和 FileView 標簽。ClassView 標簽會把你程序中所有的類都列出來,FileView 標簽給出了項目中文件的列表。
現在可以輸入程序的代碼了。在「File」菜單中選擇「New」選項來建立一個編輯窗口。在出現的對話框中,選擇「Files」標簽和「Text File」。則會出現 Visual C++ 的智能編輯器,你可以用它來輸入上面的程序代碼。輸入代碼時,你會發現編輯器會自動把不同類型的文本變成不同的顏色,如注釋、關鍵字字元串等的顏色都不同。如果你要改變其顏色或關閉顏色功能,可選擇「Tools」菜單中「Options」選項,然後選擇「Format」標簽和「Source Windows」選項就可以修改。
輸入完代碼後,選擇「File」菜單中的「Save」選項來保存。在 Visual C++ 新建立的目錄中,把它存成 HELLO.CPP 文件。
現在選擇在「Project」菜單中選擇「Add To Project」選項,再選「Files...」。你會看到一個對話框供你選擇要添加的文件。在本例子中,選擇 HELLO.CPP 文件。
在屏幕的左邊,單擊 FileView 標簽,並雙擊標有 HELLO 的圖標。你會看到名為 HELLO.CPP 的文件。單擊 ClassView 標簽,並雙擊文件夾圖標,你會看到程序中所有的類。任何時候你都可以使用 FileView 來刪除項目的文件,你只要單擊該文件,然後按鍵盤上的 delete 鍵。
後,此時你必須告訴項目要使用MFC庫。如果你忽略了這一步,則項目在連接時會出錯,而出錯信息對你毫無幫助。選擇「Project」菜單的「Settings」。在出現的對話框中選擇「General」標簽。在「Microsoft Foundation Classes」組合框中,選擇「Use MFC in a Shared DLL」。然後關閉對話框。
我們已經建立了項目文件,並調整了設置,你現在可以准備編譯 HELLO.CPP 程序了。在「Build」菜單中,你會發現有三個不同的編譯選項:
1. Compile HELLO.CPP (只有當含有 HELLO.CPP 的窗口處於激活狀態時才可)
2. Build HELLO.EXE
3. Rebuild All
第一個選項只是編譯源文件並形成它們的目標文件。該選項不能完成連接任務,所以它只對快速編譯一些源文件以檢查錯誤有用。第二個選項編譯自上次編譯後所修改的所有源文件,並連接形成可執行文件。第三個選項要重新編譯和連接所有的源文件。
我們可以選擇「Build HELLO.EXE」來編譯和連接代碼。Visual C++ 會建立一個名為「Debug」的新子目錄,並把 HELLO.EXE 放在該目錄中。該子目錄的文件都是可以再產生的,所以你可以任意刪除它們。
如果你發現了編譯錯誤,雙擊輸出窗口中的錯誤信息。這時編輯器會把你帶到出錯的位置處。檢查你的代碼是否有問題,如果有,就修改之。如果你看到大量的連接錯誤,則可能你在建立項目對話框中所指定的項目類型不對。你可以把該項目所在的子目錄刪除,然後再重新按上面的步驟來建立。
為了執行該程序,你可選則「Build」菜單中的「Execute HELLO.EXE」選項。你就可以看到你的第一個MFC程序了 -- 出現一個帶有「hello world」的窗口。該窗口本身帶有:標題欄、尺寸縮放區、最大和最小按鈕等等。在窗口上,有一個標有「hello world」。請注意,該程序是完整的。你可以移動窗口、縮放窗口、最小化等。你只使用了很少的代碼就完成了一個完整的 Window 應用程序。這就是使用 MFC 的優點。所有的細節問題都有MFC來處理。
結論
在本講中,你已經成功地編譯和執行了你的第一個 MFC 程序。你將來會用類似的步驟來建立的應用程序。你可以為每個項目建立單獨的目錄,或建立一個單獨的項目文件,然後再添加或刪除不同的源文件。
在下一講中,我們將仔細研究該程序,你會更完整的理解它的結構。
第二部分:一個簡單的MFC程序
在本將中,我們將一段一段地來研究上一將中提到的 MFC 應用程序,以便能理解它的結構和概念框架。我們將先介紹 MFC,然後在介紹如何用 MFC 來建立應用程序。
MFC簡介
MFC 是一個很大的、擴展了的 C++ 類層次結構,它能使開發 Windows 應用程序變得更加容易。MFC 是在整個 Windows 家族中都是兼容的,也就是說,無論是 Windows3.x、Windows95 還是 Windows NT,所使用的 MFC 是兼容的。每當新的 Windows 版本出現時,MFC 也會得到修改以便使舊的編譯器和代碼能在新的系統中工作。MFC 也回得到擴展,添加新的特性、變得更加容易建立應用程序。
與傳統上使用 C 語言直接訪問 Windows API相反,使用 MFC 和 C++ 的優點是 MFC 已經包含和壓縮了所有標準的「樣板文件」代碼,這些代碼是所有用 C 編寫的 Windows 程序所必需的。因此用 MFC 編寫的程序要比用C語言編寫的程序小得多。另外,MFC 所編寫的程序的性能也毫無損失。必要時,你也可以直接調用標准 C 函數,因為 MFC 不修改也不隱藏 Windows 程序的基本結構。
使用 MFC 的最大優點是它為你做了所有最難做的事。MFC 中包含了上成千上萬行正確、優化和功能強大的 Windows 代碼。你所調用的很多成員函數完成了你自己可能很難完成的工作。從這點上將,MFC 極大地加快了你的程序開發速度。
MFC 是很龐大的。例如,版本4.0中包含了大約200個不同的類。萬幸的是,你在典型的程序中不需要使用所有的函數。事實上,你可能只需要使用其中的十多個 MFC 中的不同類就可以建立一個非常漂亮的程序。該層次結構大約可分為幾種不同的類型的類:
應用程序框架
圖形繪制的繪制對象
文件服務
異常處理
結構 - List、Array 和 Map
Internet 服務
OLE 2
資料庫
通用類
在本教程中,我們將集中討論可視對象。下面的列表給出了部分類:
CObject
CCmdTarget
CWinThread
CWinApp
CWnd
CFrameWnd
CDialog
CView
CStatic
CButton
CListBox
CComboBox
CEdit
CscrollBar
在上面的列表中,有幾點需要注意。第一,MFC 中的大部分類都是從基類 CObject 中繼承下來的。該類包含有大部分MFC類所通用的數據成員和成員函數。第二,是該列表的簡單性。CWinApp 類是在你建立應用程序是要用到的,並且任何程序中都只用一次。CWnd 類匯集了 Windows 中的所有通用特性、對話框和控制。CFrameWnd 類是從 CWnd 繼承來的,並實現了標準的框架應用程序。CDialog 可分別處理無模式和有模式兩種類型的對話框。CView 是用於讓用戶通過窗口來訪問文檔。最後,Windows 支持六種控制類型: 靜態文本框、可編輯文本框、按鈕、滾動條、列表框和組合框(一種擴展的列表框)。一旦你理解了這些,你也就能更好的理解 MFC 了。MFC 中的其它類實現了其它特性,如內存管理、文檔控制等。
為了建立一個MFC應用程序,你既要會直接使用這些類,而通常你需要從這些類中繼承新的類。在繼承的類中,你可以建立新的成員函數,這能更適用你自己的需要。你在第一講中的簡單例子中已經看到了這種繼承過程,下面會詳細介紹。CHelloApp 和 CHelloWindow 都是從已有的 MFC 類中繼承的。
設計一個程序
在討論代碼本身之前,我們需要花些工夫來簡單介紹以下 MFC 中程序設計的過程。例如,假如你要編一個程序來向用戶顯示「Hello World」信息。這當然是很簡單的,但仍需要一些考慮。
「hello world」應用程序首先需要在屏幕上建立一個窗口來顯示「hello world」。然後需要實際把「hello world」放到窗口上。我們需要但個對象來完成這項任務:
1. 一個應用程序對象,用來初始化應用程序並把它掛到 Windows 上。該應用程序對象處理所有的低級事件。
2. 一個窗口對象來作為主窗口。
3. 一個靜態文本對象,用來顯示「hello world」。
你用 MFC 所建立的每個程序都會包含頭兩個對象。第三個對象是針對該應用程序的。每個應用程序都會定義它自己的一組用戶界面對象,以顯示應用程序的輸出和收集應用的輸入信息。
一旦你完成了界面的設計,並決定實現該界面所需要的控制,你就需要編寫代碼來在屏幕上建立這些控制。你還會編寫代碼來處理用戶操作這些控制所產生的信息。在「hello world」應用程序中,只有一個控制。它用來輸出「hello world」。復雜的程序可能在其主窗口和對話框中需要上百個控制。
應該注意,在應用程序中有兩種不同的方法來建立用戶控制。這里所介紹的是用 C++ 代碼方式來建立控制。但是,在比較大的應用程序中,這種方法是不可行的。因此,在通常情況下要使用資源文件的圖形編輯器來建立控制。這種方法要方便得多。
理解「hello world」的代碼
下面列出了你在上一講中已經輸入、編譯和運行的「hello world」程序的代碼。添加行號是為了討論方便。我們來一行行地研究它,你會更好的理解 MFC 建立應用程序的方式。
如果你還沒有編譯和運行該代碼,應該按上一講的方法去做。
1 //hello.cpp
2 #include <afxwin.h>
3 // Declare the application class
4 class CHelloApp : public CWinApp
5 {
6 public:
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 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();
25 return TRUE;
26 }
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));
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,150,150),
40 this);
41 }
你把上面的代碼看一遍,以得到一整體印象。該程序由六小部分組成,每一部分都起到很重要的作用。
首先,該程序包含了頭文件 afxwin.h (第 2 行)。該頭文件包含有 MFC 中所使用的所有的類型、類、函數和變數。它也包含了其它頭文件,如 Windows API 庫等。
第 3 至 8 行從 MFC 說明的標准應用程序類 CWinApp 繼承出了新的應用程序類 CHelloApp。該新類是為了要重載 CWinApp 中的 InitInstance 成員函數。InitInstance 是一個應用程序開始執行時要調用的可重載函數。
在第10行中,說明了應用程序作為全局變數的一個事例。該實例是很重要的,因為它要影響到程序的執行。當應用程序被裝入內存並開始執行時,全局變數的建立會執行 CWinApp 類的預設構造函數。該構造函數會自動調用在18至26行定義的 InitInstance 函數。
在第11至17中,CHelloWindow 類是從 MFC 中的 CFrameWnd 類繼承來的。CHelloWindow 是作為應用程序在屏幕上的窗口。建立新的類以便實現構造函數、析構函數和數據成員。
第18至26行實現了 InitInstance 函數。該函數產生一個 CHelloWindow 類的事例,因此會執行第27行至41行中類的構造函數。它也會把新窗口放到屏幕上。
第27至41實現了窗口的構造函數。該構造函數實際是建立了窗口,然後在其中建立一個靜態文本控制。
要注意的是,在該程序中沒有 main 或 WinMain 函數,也沒有事件循環。然而我們從上一講在執行中知道它也處理了事件。窗口可以最大或最小化、移動窗口等等。所有這些操作都
❷ 什麼是MFC編程
MFC(Microsoft Foundation class)微軟基本類(庫),它是一個面向對象的應用程序架構。程序員利用它可以很方便搭建應用程序框架。
MFC結合了面向對象的編程技術和WINDOWS消息驅動的編程技術,並封裝了WIN32API,其設計好處是:消除了WIN32API的復雜性,封裝了WIN32API,統一了程序的概念,而且可擴展。
MFC實際上是微軟提供的,用於在C++環境下編寫應用程序的一個框架和引擎。VC++是Windows下開發人員使用的專業C++SDK,MFC就是掛在它之上的一個輔助軟體開發包。
(2)mfc應用程序主要事件驅動程序流程圖擴展閱讀
MFC編程優勢
面對底層程序,它能很輕松的與Windows API或驅動程序結合,就是在自己的代碼中直接使用API函數,而API和驅動程序的資料都是以C語言為基礎的,這使得VC程序員能夠更輕松的使用Windows API。
這樣造成了一個很有意思的現象,即入門時VC程序員要付出更多的努力來學習,但是一旦掌握後,開發其他領域的程序或使用第三方軟體時,如工業控制類的程序,由於底層的程序都是用C語言編寫,反倒是VC程序員能夠更快的掌握該領域的編程技術。而很多其他的編程語言甚至找不到相關的資料。
這就說明VC(MFC)實際上是一種入門困難,但是擴展學習卻很輕松的語言框架。
❸ MFC是什麼
MFC,微軟基礎類(Microsoft Foundation Classes),實際上是微軟提供的,用於在C++環境下編寫應用程序的一個框架和引擎,VC++是WinOS下開發人員使用的專業C++ SDK(SDK,Standard SoftWare Develop Kit,專業軟體開發平台),MFC就是掛在它之上的一個輔助軟體開發包,MFC作為與VC++血肉相連的部分(注意C++和VC++的區別:C++是一種程序設計語言,是一種大家都承認的軟體編制的通用規范,而VC++只是一個編譯器,或者說是一種編譯器+源程序編輯器的IDE,WS,PlatForm,這跟Pascal和Dephi的關系一個道理,Pascal是Dephi的語言基礎,Dephi使用Pascal規范來進行Win下應用程序的開發和編譯,卻不同於Basic語言和VB的關系,Basic語言在VB開發出來被應用的年代已經成了Basic語言的新規范,VB新加的Basic語言要素,如面向對象程序設計的要素,是一種性質上的飛躍,使VB既是一個IDE,又成長成一個新的程序設計語言),MFC同BC++集成的VCL一樣是一個非外掛式的軟體包,類庫,只不過MFC類是微軟為VC++專配的..
MFC是Win API與C++的結合,API,即微軟提供的WinOS下應用程序的編程語言介面,是一種軟體編程的規范,但不是一種程序開發語言本身,可以允許用戶使用各種各樣的第三方(如我是一方,微軟是一方,Borland就是第三方)的編程語言來進行對Win OS下應用程序的開發,使這些被開發出來的應用程序能在WinOS下運行,比如VB,VC++,Java,Dehpi編程語言函數本質上全部源於API,因此用它們開發出來的應用程序都能工作在WinOS的消息機制和繪圖里,遵守WinOS作為一個操作系統的內部實現,這其實也是一種必要,微軟如果不提供API,這個世上對Win編程的工作就不會存在,微軟的產品就會迅速從時尚變成垃圾,上面說到MFC是微軟對API函數的專用C++封裝,這種結合一方面讓用戶使用微軟的專業C++ SDK來進行Win下應用程序的開發變得容易,因為MFC是對API的封裝,微軟做了大量的工作,隱藏了好多程序開發人員在Win下用C++ & MFC編制軟體時的大量內節,如應用程序實現消息的處理,設備環境繪圖,這種結合是以方便為目的的,必定要付出一定代價(這是微軟的一向作風),因此就造成了MFC對類封裝中的一定程度的的冗餘和迂迴,但這是可以接受的..
最後要明白MFC不只是一個功能單純的界面開發系統,它提供的類絕大部分用來進行界面開發,關聯一個窗口的動作,但它提供的類中有好多類不與一個窗口關聯,即類的作用不是一個界面類,不實現對一個窗口對象的控制(如創建,銷毀),而是一些在WinOS(用MFC編寫的程序絕大部分都在WinOS中運行)中實現內部處理的類,如資料庫的管理類等,學習中最應花費時間的是消息和設備環境,對C++和MFC的學習中最難的部分是指針,C++面向對像程序設計的其它部分,如數據類型,流程式控制制都不難,建議學習數據結構C++版..