MFC---簡介、編碼、結構和消息響應


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之后,編譯並執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM