tft每日頭條

 > 生活

 > mfc開發參考手冊

mfc開發參考手冊

生活 更新时间:2024-11-25 15:23:42

以Windows API開發程序,程序從進入點開始,然後産生窗口類别、窗口、取得消息、分辨消息,然後決定如何處理消息:

mfc開發參考手冊(抽絲剝繭理解一個MFC)1

以MFC 開發程序開發工具會為你産生一個骨幹程序,一般該有的各種接口一應俱全:

mfc開發參考手冊(抽絲剝繭理解一個MFC)2

MFC就是用C 語言的類來封裝Windows API:

mfc開發參考手冊(抽絲剝繭理解一個MFC)3

SDK 程序設計的第一要務是了解最重要的數個API 函數的意義和用法, 像RegisterClass、CreateWindow、GetMessage、DispatchMessage,以及消息的獲得與分配。MFC 程序設計的第一要務則是熟記MFC 的類别階層架構,并清楚知曉其中幾個一定會用到的類别。

mfc開發參考手冊(抽絲剝繭理解一個MFC)4

一個"Hello MFC" 程序的兩個類别在MFC 的地位如下圖所示:

mfc開發參考手冊(抽絲剝繭理解一個MFC)5

每一個MFC程序都想從MFC中衍生出适當的類别來用(不然又何必以MFC寫程序呢),其中兩個不可或缺的類别CWinApp和CFrameWnd在Hello程序中會表現出來。

MFC類别中某些函數一定得被應用程序改寫(例如CWinApp::InitInstance)。

mfc開發參考手冊(抽絲剝繭理解一個MFC)6

Hello 程序的基本文件架構。一般習慣為每個類别準備一個.H( 聲明)和一個.CPP(實作)。

mfc開發參考手冊(抽絲剝繭理解一個MFC)7

SDK 程序的WinMain 所完成的工作現

在由CWinApp 的三個函數完成:

virtual BOOL InitApplication(); virtual BOOL InitInstance(); virtual int Run();

mfc開發參考手冊(抽絲剝繭理解一個MFC)8

CFrameWnd::Create 産生主窗口(并先注冊窗口類别)

mfc開發參考手冊(抽絲剝繭理解一個MFC)9

CWinApp::Run

mfc開發參考手冊(抽絲剝繭理解一個MFC)10

把消息與處理函數串接在一起:Message Map 機制

mfc開發參考手冊(抽絲剝繭理解一個MFC)11

MFC 應用程序代碼一開始是一個衍生自CWinApp 的全域對象application object,然後是一個隐藏的WinMain 函數,調用application object 的InitInstance 函數,将程序初始化。初始化動作包括構造一個窗口對象(CFrameWnd 物件),而其構造式又調用CFrameWnd::Create 産生真正的窗口(并在産生之前要求MFC注冊窗口類别)。窗口産生後WinMain 又調用Run 激活消息循環,将WM_COMMAND(IDM_ABOUT)和WM_PAINT 分别交給成員函數OnAbout 和OnPaint 處理。

MFC 應用程序的誕生:

■ Application object 産生,内存于是獲得配置,初值亦設立了。

■ Afx WinMain 執行AfxWinInit,後者又調用AfxInitThread,把消息隊列盡量加大。

■ Afx WinMain 執行InitApplication。這是CWinApp 的虛拟函數,但我們通常不改寫它。

■ AfxWinMain 執行InitInstance。這是CWinApp 的虛拟函數,我們必須改寫它。

■ CMyWinApp::InitInstance 'new' 一個CMyFrameWnd 對象。

■ CMyFrameWnd 構造式調用Create,産生主窗口。我們在Create 參數中指定的窗口類别是NULL, 于是MFC 根據窗口種類, 自行為我們注冊一個名為"AfxFrameOrView42d" 的窗口類别。

■ 回到InitInstance 中繼續執行ShowWindow,顯示窗口。

■ 執行UpdateWindow,于是發出WM_PAINT。

■ 回到AfxWinMain,執行Run,進入消息循環。

MFC 應用程序開始運作:

■ 程序獲得WM_PAINT 消息(藉由CWinApp::Run 中的::GetMessage 循環)。

■ WM_PAINT 經由::DispatchMessage 送到窗口函數CWnd::DefWindowProc 中。

■ CWnd::DefWindowProc 将消息繞行過消息映射表格(Message Map)。

■ 繞行過程中發現有吻合項目,于是調用項目中對應的函數。此函數是應用程序利用BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之間的宏設立起來的。

( 标準消息的處理例程亦有标準命名,例如WM_PAINT 必然由OnPaint 處理。)

MFC 應用程序的死亡:

■ 使用者選按【File/Close】,于是發出WM_CLOSE。

■ CMyFrameWnd 并沒有設置WM_CLOSE 處理例程,于是交給預設之處理例程。

■ 預設函數對于WM_CLOSE 的處理方式是調用::DestroyWindow, 并因而發出WM_DESTROY。

■ 預設之WM_DESTROY 處理方式是調用::PostQuitMessage,因此發出WM_QUIT。

■ CWinApp::Run 收到WM_QUIT 後會結束其内部之消息循環, 然後調用ExitInstance,這是CWinApp 的一個虛拟函數。

■ 如果CMyWinApp 改寫了ExitInstance , 那麼CWinApp::Run 所調用的就是CMyWinApp::ExitInstance,否則就是CWinApp::ExitInstance。

■ 最後回到AfxWinMain,執行AfxWinTerm,結束程序。

附:VC中可調用的函數大緻可分三類

1、類自己的函數,隻對類自己的數據成員有作用。例如MFC中 MessageBox的原型,它是屬于 CWnd 類的成員函數,隻能在 CWnd 和CWnd的派生類的對象中調用;當然,也可以直接調用類中的其他成員函數;

2、AFX小組在設計Application Framworks 時設計的全局函數,多冠在Afx前綴,在包含了MFC庫/框架的工程中可用。例如AfxMessageBox可在任何地方調用。

3、Windows API的全局函數。對所有Windows平台下的程序設計都可以調用,如Vb,Vc,Dephi等等。

參考:《深入淺出MFC》

-End-

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved