MFC簡介以及基礎使用

2020-10-12 11:00:02

一、Windows訊息機制

視窗

一個Windows應用程式中至少有一個視窗,稱為主視窗。我們在客戶區進行圖案的繪製。

控制程式碼

一個Windows應用程式是包含圖示、遊標等許多部件(資源),系統在為這些部件(資源)分配記憶體後會返回他們的標識號,也就是所謂的控制程式碼。比如在Windows應用程式中,使用視窗控制程式碼來標識每一個視窗。對視窗進行操作時候,首先就是得到這個視窗的標識。

訊息與訊息佇列

Windows是事件驅動方式的程式設計,當一個Windows應用程式開始執行的時候,系統會產生一個訊息佇列,用於儲存這個視窗的訊息。eg:當你自己在一個視窗中按下鍵盤時候(事件),系統會收集到這個按下鍵盤事情(事件),然後包裝成訊息,放到這個視窗的訊息佇列中(視窗過程)。因為佇列的先進先出的特點,這時候視窗會一個一個的讀取訊息,然後進行相應的執行處理。

WinMain函數

控制檯DOS中的入口是mian函數,而WinMain函數就是Windows程式的入口函數。啟動一個應用程式時候就開始先呼叫WinMain函數

Windows程式設計模型

一個應用程式的功能是:建立一個視窗,然後響應鍵盤或者滑鼠訊息。

  • WinMain函數的定義
  • 建立視窗
  • 訊息迴圈
  • 視窗過程

二、MFC簡單介紹和使用

MFC簡介

MFC是微軟基礎類庫,以C++類的形式封裝了Windows API,並且包含一個應用程式框架。類中包含了大量的windows控制程式碼封裝類和很多windows的元件和內建控制元件的封裝類。MFC把Windows SDK API函數包裝成了幾百個類,MFC給Windows系統提供物件導向的介面,支援可重用性、自包含性以及OPP原則。

MFC程式入口

MFC.h

//mfc標頭檔案
#include<afxwin.h>

//1、應用程式類CWinApp,MyAPP派生類
class MyApp : public CWinApp{
public:
    //父類別的虛擬函式,需要派生類進行重寫
    //也是MFC函數的入口函數
    virtual BOOL InitInstance();
};

//2、框架類CFrameWnd,MyFrame派生類
class MyFrame : public CFrameWnd{
public:
    //建構函式
    MyFrame();
}

MFC.cpp

//對應類的標頭檔案
#include "mfc.h"

//有且只有一個的全域性應用程式類的物件
MyApp app;

//程式入口
BOOL MyApp::InitInstance(){
    //1、建立類框架
    MyFrame *frame = new MyFrame;
    //2、顯示視窗
    frame -> ShowWindow(SW_SHOWNORMAL);
    //3、更新視窗
    frame -> UpdateWindow();
    //4、儲存框架類物件指標
    m_pMainWnd = frame;
    return TRUE;
}

//重寫建構函式
MyFrame::MyFrame(){
    //建立視窗
    Create(NULL,TEXT("mfc"));
}

MFC的訊息對映

息對映就是將訊息和成員函數相互關聯的表。比如,Windows將一個滑鼠左擊訊息放到一個框架視窗訊息佇列中,然後這個視窗取到這個訊息時候,MFC將搜尋該視窗的訊息對映,如果存在一個處理滑鼠左擊訊息(WM_LBUTTONDOWN)的處理程式,就呼叫。

下面是如何在一個類中編寫一個訊息對映

  • 在操作的類中宣告訊息宏
  • 通過放置標識訊息的宏來執行訊息對映,相應的類將對BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的呼叫之間處理訊息

mfc.h

class MyFrame : public CFrameWnd{
public:
    MyFrame();

    //宣告訊息宏
    DECLARE_MESSAGE_MAP()
}

mfc.cpp

//定義訊息宏,在類中實現(派生類,父類別)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()

//重寫建構函式
MyFrame::MyFrame(){
    //建立視窗
    Create(NULL,TEXT("mfc"));
}

對應的處理常式分別在類中宣告,類外定義

mfc.h

//框架類CFrameWnd,MyFrame派生類
class MyFrame : public CFrameWnd{
public:
    //建構函式
    MyFrame();
    //宣告訊息宏
    DECLARE_MESSAGE_MAP()
    //函數宣告
    dfx_msg void OnLButtonDown(UINT,CPoint);
}

mfc.cpp

//定義訊息宏,在類中實現(派生類,父類別)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()

//重寫建構函式
MyFrame::MyFrame(){
    //建立視窗
    Create(NULL,TEXT("mfc"));
}

//定義具體函數的實現
void OnLButtonDown(UINT,CPoint){
    .......
    .......
}