MFC簡介
- MFC是微軟基礎類庫的簡稱,是微軟公司實現的一個c++類庫,主要封裝了大部分的windows API函數
- 在MFC中,可以直接調用 windows API,同時需要引用對應的頭文件或庫文件
- MFC除了是一個類庫以外,還是一個框架,在vc++里新建一個MFC的工程,開發環境會自動幫你產生許多文件,同時它使用了mfcxx.dll。xx是版本,它封裝了mfc內核,在代碼中看不到原本的SDK編程中的消息循環等等東西,因為MFC框架已經封裝好了,這樣程序員就可以專心地考慮程序的邏輯,而不是每次編程都要重復的東西。
- 由於是通用框架,沒有最好的針對性,當然也就喪失了一些靈活性和效率,但是MFC的封裝很淺,所以在靈活性以及效率上損失不大,可以忽略不計。
- MFC程序就是基於MFC編譯出來的可執行程序,是一種GUI程序。
MFC編碼
- 字符編碼是一個復雜的過程。簡單地講,就是將機器語言(0和1組成的字符串)轉換成我們能識別的信息的一個過程。MFC有兩種編碼方式,Unicode和多字節並且可以設置切換。切換方法是打開項目屬性頁,常規項對應的字符集中可切換編碼方式。Visual C++6.0用的是多字節編碼;Virtual Studio 2010 默認使用的是Unicode編碼。
- 在代碼移植的時候經常會提示很多編碼方式相關的錯誤,解決方法是將Unicode編碼改為多字節編碼即可。值得注意的是,使用 _T 宏有條件地編寫字符串的代碼,使之可移植到 Unicode。這一招可以解決大多數編碼方式不匹配引發的問題。
MFC項目結構
- 主要有4個部分組成:
- 資源文件Resource.h:主要是定義資源的ID。
- 預編譯頭文件stdafx.h:用來解決頭文件包含沖突的問題,定義一些需要全局性包含的文件。
- 應用程序類對應文件:項目名稱是TestOne,對應類名為CTestOneApp。
- 對話框類:項目名稱是TestOne,對應類名為CTestOneDlg。
應用程序類
- MFC定義了一個應用程序基類CWinApp,所有基於MFC的應用程序都會繼承這個類。TestOne項目也不例外,此時的應用程序類是CTestOneApp,定義如下:
class CTestOneApp : public CWinApp
{
public:
CTestOneApp();
public:
// 重寫
virtual BOOL InitInstance();
// 實現
DECLARE_MESSAGE_MAP()
};
- 這個類的定義很簡單,重點來看一下InitInstance函數。
BOOL CTestOneApp::InitInstance()
{
//初始化應用程序環境包控件等操作,省略部分代碼.
CWinApp::InitInstance();
//省略部分代碼...
//定義對話框對象
CTestOneDlg dlg;
//保存對話框到全局變量
m_pMainWnd = &dlg;
//顯示對話框
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
//“確定”來關閉對話框的代碼
}
else if (nResponse == IDCANCEL)
{
//“取消”來關閉對話框的代碼
}
// 由於對話框已關閉,所以將返回 FALSE 以便退出應用程序, 而不是啟動應用程序的消息泵。
return FALSE;
}
-
這個函數可以看作MFC程序的入口函數,main函數隱藏在這個函數中。
-
在實際的開發中,一般不需要對這個類進行操作,但如果需要在建立主對話框之前處理一些數據或者准備工作,就可以把代碼添加到這個函數中,主對話框顯示之前。
-
這里有兩個比較典型的應用。
- 啟動界面之前彈出登陸界面,需要正確輸入用戶名和密碼才能彈出主界面;
- 啟動界面之前,彈出一個項目配置界面,例如操作員,設備編號,項目名稱,批次等信息,同時這些信息需要傳遞到主界面中,主界面根據項目和批次決定某種操作方式。
-
第一個需求不涉及數據傳遞,可以在代碼中將用戶名和密碼固定,如果輸入的結果與設定的結果一致,那么就開放此軟件的使用權限;稍微復雜一點的,可以比較輸入的結果與數據庫中存儲的用戶名和密碼是否匹配,如果匹配,才開放此軟件的使用權限;再稍微復雜一點的,還可以將界面輸入結果與服務器中的信息比較,查看當前用戶是否有此軟件的使用權限,當然這個還涉及到服務端的處理,與網絡通信有關。
-
第二個需求涉及不同對話框之間的數據傳遞,應用也比較廣泛。
對話框類
- MFC主對話框類,主對話框是指與項目名稱一致的那個類對應的對話框,CTestOneDlg繼承CDialogEx類,CDialogEx又繼承CDialog類,這個可以通過類轉到定義查看,對話框類負責與用戶交互,處理用戶消息,接受用戶輸入。類的定義如下:
// CTestOneDlg 對話框
class CTestOneDlg : public CDialogEx
{
public:
// 標准構造函數
CTestOneDlg(CWnd* pParent = NULL);
// 對話框數據
enum { IDD = IDD_TESTONE_DIALOG };
protected:
// 動態數據交換,負責控件與變量之間的關聯
virtual void DoDataExchange(CDataExchange* pDX);
protected:
//應用程序句柄
HICON m_hIcon;
//重載初始化對話框
virtual BOOL OnInitDialog();
//定義消息WM_SYSCOMMAND處理函數
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
//定義消息WM_PAINT處理函數
afx_msg void OnPaint();
//定義消息ON_WM_QUERYDRAGICON處理函數
afx_msg HCURSOR OnQueryDragIcon();
//消息映射
DECLARE_MESSAGE_MAP()
};
- 從這個類的定義可以看出以下幾點:
- 控件與數據關聯,可以簡單地交給框架來實現;
- 在MFC框架上開發主要是針對消息處理機制。
MFC消息響應
-
MFC消息響應機制過程比較復雜,這里只是基礎部分,做一個簡單的過程演示,在界面中添加一個按鈕的消息響應。
-
首先把工作區間切換到資源視圖,如果工作區間沒有顯示資源視圖,在菜單中的視圖中查找資源視圖並點擊。切換到資源視圖后,找到Dialog文件夾找到IDD_TESTONE_DIALOG。
-
雙擊對話框ID就會顯示這個對話框窗口,從工具欄中選擇Button按鈕后,可以直接將按鈕拖至顯示的這個對話框窗口中。工具欄只有當主工作區間顯示對話框時才會顯示。用鼠標右鍵點擊按鈕,選擇屬性切換到屬性頁,修改按鈕的名稱(對應Caption)“Test”,同時修改按鈕的ID為IDC_BTN_TEST。
-
有兩種方式可以完成添加按鈕的消息處理函數。
-
直接雙擊按鈕;
-
右鍵選中按鈕,點擊“添加事件處理程序”;
-
兩種方式區別在於,第一種方式添加的消息響應函數名稱是默認的,第二種方式添加的消息響應函數名稱是可以編輯的。
-
代碼如下所示:
//添加按鈕IDC_BTN_TEST的單擊消息處理函數 void CTestOneDlg::OnBtnTest() { AfxMessageBox(_T("測試成功!")); }
-
添加一個MessageBox之后,編譯並執行。
-