MFC Windows程序開發究竟是什么?


MFC Windows程序開發究竟是什么?

MFC是一個Application Framework.他是一個完整的程序模型。

什么是MFCMFC是微軟公司出品一個Application Framework。基本上,我們可以認為Application Framework就是一個完整的程序模型,具備標准軟件所需的一切基本功能,比如文件存取、打印等等。從C++語言層面來看,Application Framework就是有一整套組合好的“對象”構建起來的模型。從C++語法上來說,MFC就是一套微軟提供給我們的類庫。比如,我們在編寫標准C程序的時候,經常會代用各種庫函數來輔助完成某些功能:比如C庫函數printfscanffopen等等。在Windows平台下,Windows操作系統本身提供各種各樣的API

MFCWindows API

API函數:Windows操作系統提供給應用程序編程的接口(Application Programming Interface

Windows應用程序API函數是通過C語言實現的。Windows操作系統提供了1000多種API函數。我們使用Windows API是可以開發出Windows應用程序的。

MFC就是一組類庫,在程序運行的時候就已經規划好了一堆有活力的對象。同時,這些對象之間的關聯關系已經建立好了,不需要我們程序員在操心。比如當我們按下文件菜單,選擇文件的對話框就會自動跳出等等。

GUI設計快速上手MFC

窗口是Windows應用程序中一個非常重要的元素,一個Windows應用程序至少要有一個窗口,成為主窗口。窗口是屏幕上的一塊矩形區域,是Windows應用程序與用戶進行交互的接口。

建立一個Win32空項目,顯示窗口

#include <afxwin.h>

// 應用程序類
class MyFstApp : public CWinApp { // 一個實例,Windows應用程序實例
public:
    virtual BOOL InitInstance();  // 多態創建實例
};

// 框架窗口類
class MainWindow : public CFrameWnd { // 這是一個用C++對象表明的Windows窗口
public:
    MainWindow(); // 公有的構造函數
};
 
MyFstApp theApp; // 構建全局對象

BOOL MyFstApp::InitInstance() {
    // 創建一個框架窗口
    MainWindow *pMain = new MainWindow();
    // 顯示
    pMain->ShowWindow(m_nCmdShow);
    pMain->UpdateWindow();  // 刷新
    this->m_pMainWnd = pMain;  // 建立Window對象與App對象的關聯關系
    return TRUE;
}

MainWindow::MainWindow(){
    Create(NULL, TEXT("我的第一個MFC程序"));
}

 

通過代碼逐項對比MFC對象與Windows對象的概念

GUI快速入手MFC

Windows操作系統顧名思義就是視窗的意思,開發Windows引用程序,就是組織一個又一個“窗口”。

MFC應用程序就是用MFCC++庫進行這一系列“窗口”的開發。正如我們掌握printffopen進行C語言開發一樣,我們需要知道MFC為我們提供哪些針對這些“窗口”的對象。

句柄:MFC Windows應用程序開發的核心概念

Windows應用程序中,窗口是通過窗口句柄(HWND)來標識的。我們要對某個窗口進行操作,首先就要得到這個窗口的句柄。在Windows程序中,有各種各樣的資源(窗口、圖標、光標、畫刷等),系統在創建這些資源時會為他們分配內存,並返回這些資源的標識號,即句柄。句柄時Windows對象的身份證。

MFC開發Windows應用就是對一個個MFC對象的熟悉、改造的過程----MFC對象就是把一個個零散的Windows對象變成易於標准化程序開發的C++對象。

CButton案例

#include <afxwin.h>

// 應用程序類
class MyFstApp : public CWinApp { // 一個實例,Windows應用程序實例
public:
    virtual BOOL InitInstance();  // 多態創建實例
};

// 框架窗口類
class MainWindow : public CFrameWnd { // 這是一個用C++對象表明的Windows窗口
public:
    MainWindow(); // 公有的構造函數
};

MyFstApp theApp; // 構建全局對象

BOOL MyFstApp::InitInstance() {
    // 創建一個框架窗口
    MainWindow *pMain = new MainWindow();
    // 顯示
    pMain->ShowWindow(m_nCmdShow);
    pMain->UpdateWindow();  // 刷新
    this->m_pMainWnd = pMain;  // 建立Window對象與App對象的關聯關系
    return TRUE;
}

MainWindow::MainWindow(){
    Create(NULL, TEXT("我的第一個MFC程序"));
    HWND hBtn = ::CreateWindow(TEXT("Button"),  // 創建一個button        按鈕
    TEXT("按鈕"),
    WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
    150, 45,
    160, 65,
    this->m_hWnd,
    (HMENU)10001,  // 標識
    AfxGetInstanceHandle(),  // 獲取實例句柄
    NULL);
}

Windows對象到MFC對象,成員變量與函數的辨析-CButton為例

消息映射:從Windows對象到MFC對象

消息映射從語義上看就是事件驅動編程,從語法上是一個將消息和成員函數相互關聯的表。比如,框架窗口接收到一個窗口繪制消息,MFC將搜索該窗口的消息映射,如果存在一個處理WM_PAINT消息的處理程序,然后就調用OnPaint

 

#include <afxwin.h>

// 應用程序類
class MyFstApp : public CWinApp { // 一個實例,Windows應用程序實例
public:
    virtual BOOL InitInstance();  // 多態創建實例
};

// 框架窗口類
class MainWindow : public CFrameWnd { // 這是一個用C++對象表明的Windows窗口
public:
    CButton *pBtn;
public:
    MainWindow(); // 公有的構造函數
};

MyFstApp theApp; // 構建全局對象

BOOL MyFstApp::InitInstance() {
    // 創建一個框架窗口
    MainWindow *pMain = new MainWindow();
    // 顯示
    pMain->ShowWindow(m_nCmdShow);
    pMain->UpdateWindow();  // 刷新
    this->m_pMainWnd = pMain;  // 建立Window對象與App對象的關聯關系
    return TRUE;
}

MainWindow::MainWindow(){
    Create(NULL, TEXT("我的第一個MFC程序"));
HWND hBtn
= ::CreateWindow(TEXT("Button"), // 創建一個button按鈕 TEXT("按鈕"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 150, 45, 160, 65, this->m_hWnd, (HMENU)10001, // 標識 AfxGetInstanceHandle(), // 獲取實例句柄 NULL); CRect rect(300, 450, 500, 600);
pBtn
= new CButton(); pBtn->Create(TEXT("Button"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, 10002); // 創建一個Button按鈕 }

消息映射與Windows事件驅動編程

消息映射:從Windows對象到MFC對象

MFC為執行消息映射在內部所做的總做隱藏在某些十分復雜的宏。實現過程如下:

1、通過將DECLARE_MESSAGE_MAP添加到類聲明中,聲明消息映射

2、通過防止標識消息的宏來執行消息映射,相應的類將在對BEGIN_MESSAGE_MAOEND_MESSAGE_MAP的調用之間處理消息。

3、添加成員函數來處理消息。

#include <afxwin.h>

// 應用程序類
class MyFstApp : public CWinApp { // 一個實例,Windows應用程序實例
public:
    virtual BOOL InitInstance();  // 多態創建實例
};

// 框架窗口類
class MainWindow : public CFrameWnd { // 這是一個用C++對象表明的Windows窗口
public:
    CButton *pBtn;
public:
    MainWindow(); // 公有的構造函數

    afx_msg void HandleButton();
    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(MainWindow,CFrameWnd)  // 消息映射
    ON_BN_CLICKED(10002,HandleButton)
END_MESSAGE_MAP()

MyFstApp theApp; // 構建全局對象

BOOL MyFstApp::InitInstance() {
    // 創建一個框架窗口
    MainWindow *pMain = new MainWindow();
    // 顯示
    pMain->ShowWindow(m_nCmdShow);
    pMain->UpdateWindow();  // 刷新
    this->m_pMainWnd = pMain;  // 建立Window對象與App對象的關聯關系
    return TRUE;
}

MainWindow::MainWindow(){
    Create(NULL, TEXT("我的第一個MFC程序"));

    HWND hBtn = ::CreateWindow(TEXT("Button"),  // 創建一個button按鈕
        TEXT("按鈕"),
        WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
        150, 45,
        160, 65,
        this->m_hWnd,
        (HMENU)10001,             // 標識
        AfxGetInstanceHandle(),  // 獲取實例句柄
        NULL);

    CRect rect(300, 450, 500, 600);
    pBtn = new CButton();
    pBtn->Create(TEXT("Button"),
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        rect,
        this,
        10002); // 創建一個Button按鈕
}

void MainWindow::HandleButton(){
    ::MessageBox(NULL, TEXT("hello"), TEXT("MFC"), MB_OK);
}

MFC的概要小結

MFC封裝了Windows對象形成一個個C++對象

消息映射完成了這些C++對象與Windows消息的對應關系,形成了成員函數

程序員只需要關注業務邏輯,把這些邏輯編碼到這些成員函數,完成業務系統。

 


免責聲明!

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



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