以Windows API開發程序,程序從進入點開始,然後産生窗口類别、窗口、取得消息、分辨消息,然後決定如何處理消息:
以MFC 開發程序開發工具會為你産生一個骨幹程序,一般該有的各種接口一應俱全:
MFC就是用C 語言的類來封裝Windows API:
SDK 程序設計的第一要務是了解最重要的數個API 函數的意義和用法, 像RegisterClass、CreateWindow、GetMessage、DispatchMessage,以及消息的獲得與分配。MFC 程序設計的第一要務則是熟記MFC 的類别階層架構,并清楚知曉其中幾個一定會用到的類别。
一個"Hello MFC" 程序的兩個類别在MFC 的地位如下圖所示:
每一個MFC程序都想從MFC中衍生出适當的類别來用(不然又何必以MFC寫程序呢),其中兩個不可或缺的類别CWinApp和CFrameWnd在Hello程序中會表現出來。
MFC類别中某些函數一定得被應用程序改寫(例如CWinApp::InitInstance)。
Hello 程序的基本文件架構。一般習慣為每個類别準備一個.H( 聲明)和一個.CPP(實作)。
SDK 程序的WinMain 所完成的工作現
在由CWinApp 的三個函數完成:
virtual BOOL InitApplication(); virtual BOOL InitInstance(); virtual int Run();
CFrameWnd::Create 産生主窗口(并先注冊窗口類别)
CWinApp::Run
把消息與處理函數串接在一起:Message Map 機制
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每日頭條,我们将持续为您更新最新资讯!