《深入浅出MFC》第六章 MFC程序的生死因果
SDK程序設(shè)計的第一要務(wù)是理解最重要的數(shù)個API函數(shù)的意義和用法,MFC程序設(shè)計的第一要務(wù)則是理解幾個最重要的類,最基本的兩個類為CWin App和CFrameWnd。
開發(fā)MFC程序需要的函數(shù)庫:Windows C Runtime函數(shù)庫(LIBC.LIB靜態(tài)鏈接版本,MSVCRT.LIB,MSVCRTD.LIB)。DLL Import函數(shù)庫(GDI32.LIB,USER32.LIB,KERNEL32.LIB等)。MFC函數(shù)庫(AFX函數(shù)庫)(MFC42.LIB等)。
STDAFX.h是作為預(yù)編譯頭文件的,由開發(fā)環(huán)境自動生成。
MFC程序的兩個主要的類,CFrameWnd代表主裝口,CWinApp是一個全局對象,代表整個Application。
在通常的SDK程序中,程序主體在于WinMain和WndProc。在MFC中CWinApp取代WinMain,CFrameWnd取代WndProc。CWinAPP用來處理程序進(jìn)入點并啟動消息循環(huán),CFrameWnd用來處理消息循環(huán)與消息映射。CWinApp中保存由CWnd指針,CWnd表示一個窗口,是CFrameWnd的父類。
CWinApp中的成員變量因為theApp這個全局對象而獲得配置與初始化,并且該全局對象一定存在并且是唯一的。App初始化完成后,WinMain登場,WinMain的引入點并不需要程序員添加,而是由鏈接器直接添加到程序代碼中。WinMain的引入點在MFC的WINMAIN.cpp程序代碼中。
在MFC的WinMain中通過全局函數(shù)AfxGetApp獲取全局唯一的Application對象。在獲取全局Application后調(diào)用全局函數(shù)AfxWinInit函數(shù)進(jìn)一步初始化Application對象并設(shè)置線程相關(guān)設(shè)置。繼續(xù)調(diào)用全局Application對象的InitApplication函數(shù),這些操作為MFC內(nèi)部管理。AfxWinMain之后調(diào)用Application->InitInstance函數(shù),注意應(yīng)用程序一定要改寫InitInstance虛函數(shù),因為它在父類中是一個空函數(shù),而通常不需要改寫InitApplication和Run。在InitInstance中實例化CFrameWnd對象,這會生成一個窗口,在生成窗口之前會執(zhí)行窗口注冊動作。通過調(diào)用類的PreCreateWindow函數(shù)進(jìn)行窗口注冊,因此不同的類將使用不同的窗口類。而后InitInstance通過調(diào)用ShowWindow顯示窗口,通過調(diào)用UpdateWindow()發(fā)送WM_Paint消息。運(yùn)行Application->Run以后將啟動消息循環(huán),在消息循環(huán)中把消息送往MFC全局函數(shù)AfxWinProc中,在改函數(shù)中MFC采用Messagep map機(jī)制進(jìn)行消息映射。通過MFC特定的消息映射宏,程序員可以很方便的進(jìn)行消息與處理函數(shù)的映射。MFC主要把消息分為三大類,標(biāo)準(zhǔn)Windows消息(WM_xxx形式)的消息處理函數(shù)使用系統(tǒng)默認(rèn)的名稱,如OnPaint,OnClose等,因此在Message map機(jī)制中不需要指定具體的處理函數(shù),只需調(diào)用相應(yīng)的宏如ON_WM_PAINT()。命令消息的一般形式為ON_COMMAND(IDM_ABOUT,OnAbout)。Notification消息,由控件產(chǎn)生,一般形式為ON_BN_CLICKED(<id>,<memberFxn>)。各個消息的處理函數(shù)均應(yīng)以afx_msg void為函數(shù)原型。如果某個消息在MessageMap中沒有找到對應(yīng)的映射記錄,則消息會向基類流竄,這稱為消息路由,如果一直找不到處理程序,消息將由默認(rèn)函數(shù)來處理。MFC中派生自CCmdTarget的類都可以設(shè)定自己的Message Map,因為他們都可以接收到消息。
?可以通過調(diào)用PostQuitMessage函數(shù)發(fā)出WM_QUIT消息結(jié)束程序,消息循環(huán)收到WM_QUIT消息后結(jié)束循環(huán),然后調(diào)用Application->ExitInstance,然后返回到AfxWinMain結(jié)束程序。
注意,如果類的成員函數(shù)是一個callback函數(shù),必須使用static修飾。凡聲明為static的函數(shù)或變量,都不和對象結(jié)合在一起,他們屬于類的一部分而不屬于對象。
通過重寫CWinApp的OnIdle函數(shù)可以處理空閑時間,重寫OnIdle時要Return True。
構(gòu)造CDialog對話框時,傳遞對話框的模板資源名稱和對話框的Master,然后調(diào)用CDialog::DoModal即可顯示對話框。MFC提供了多種通用對話框,使用這些對話框非常簡單,調(diào)用DoModal即可顯示對話框,根據(jù)DoModal的返回結(jié)果獲取相應(yīng)的用戶操作結(jié)果。
?
轉(zhuǎn)載于:https://www.cnblogs.com/jefflee/p/6414937.html
總結(jié)
以上是生活随笔為你收集整理的《深入浅出MFC》第六章 MFC程序的生死因果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。