MFC Windows程序開發究竟是什么?
MFC是一個Application Framework.他是一個完整的程序模型。
什么是MFC?MFC是微軟公司出品一個Application Framework。基本上,我們可以認為Application Framework就是一個完整的程序模型,具備標准軟件所需的一切基本功能,比如文件存取、打印等等。從C++語言層面來看,Application Framework就是有一整套組合好的“對象”構建起來的模型。從C++語法上來說,MFC就是一套微軟提供給我們的類庫。比如,我們在編寫標准C程序的時候,經常會代用各種庫函數來輔助完成某些功能:比如C庫函數printf、scanf、fopen等等。在Windows平台下,Windows操作系統本身提供各種各樣的API。
MFC和Windows 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應用程序就是用MFC的C++庫進行這一系列“窗口”的開發。正如我們掌握printf、fopen進行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_MAO和END_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消息的對應關系,形成了成員函數
程序員只需要關注業務邏輯,把這些邏輯編碼到這些成員函數,完成業務系統。