mfc 執行機制

2021-09-25 02:52:33 字數 3410 閱讀 9352

4:#define __t(x) l ## x ;字串前面加l表示該字串是unicode字串。_t是乙個巨集,如果專案使用了unicode字符集(定義了unicode巨集),則自動在字串前面加上l,否則字串不變。因此,visual c++裡邊定義字串的時候,用_t來保證相容性。vc支援ascii和unicode兩種字元型別,用_t可以保證從ascii編碼型別轉換到unicode編碼型別的時候,程式不需要修改。如 l"我的字串" 表示將ansi字串轉換成unicode的字串,就是每個字元占用兩個位元組。_t巨集可以把乙個引號引起來的字串,根據你的環境設定,使得編譯器會根據編譯目標環境選擇合適的(unicode還是ansi)字元處理方式。如果你定義了unicode,那麼_t巨集會把字串前面加乙個l。這時 _t("abcd") 相當於 l"abcd" ,這是寬字串。text,_text 和_t 一樣的。

5:typedef __w64 int int_ptr, *pint_ptr; __w64 在64位編譯器下,而且開啟了/wp64編輯選項時,編輯器會對使用了__w64的型別進行32位到64位移植性的判斷,比如講將64位的指標賦值給int_ptr編譯器會發出警告,所以原式可寫為:

typedef int int_ptr, *pint_ptr; 用int_ptr表示 int, 用pint_ptr表示 int*

6:cwnd類在標頭檔案afxwin.h中,是mfc視窗的基類,提供了微軟基礎類庫中所有視窗類的基本功能。m_hwnd 指明這個cwmd物件相關聯的hwnd控制代碼,cwnd物件與視窗想關聯時m_hwnd控制代碼有值。

7:彈出對話方塊比較關鍵的乙個函式,就是對話方塊類的domodal()函式。 cdialog::domodal()函式的原型為:virtual int_ptr domodal(); 返回值:整數值,指定了傳遞給cdialog::enddialog(該函式用於關閉對話方塊)的nresult引數值。如果函式不能建立對話方塊,則返回-1;如果出現其它錯誤,則返回idabort。呼叫了它對話方塊就會彈出,返回值是退出對話方塊時所點的按鈕的id,比如,我們點了「退出」按鈕,那麼domodal返回值為idcancel。

9:一般下劃線開頭的東西是編譯器和標準庫內部使用的名字,下劃線開頭的函式一般都是專用的函式,一般用於特定系統相關。一般只有以經廣泛使用的系統庫函式和巨集才有資格使用下劃線開頭(為了移植性一般不使用)

10:物件導向程式設計思想的核心是將程式設計過程中操作的資料作為物件處理

11:mfc程式執行過程剖析

6)在訊息執行結束,使用者按下關閉按鈕後,作業系統向程式傳送wm_close訊息,預設狀況下程式呼叫destorywindow並且傳送wm_destory訊息,應用程式接受到這個訊息以後的預設操作是呼叫postquitmessage函式,由這個函式傳送wm_quit訊息。當程式物件接受到wm_quit訊息後訊息迴圈結束,由afxwinmain函式呼叫afxterm函式清理程式使用過的資源並且結束整個程式。

小結:以上的所有描述涵蓋了乙個程式從開始、執行到結束的所有過程。 相信大家有點暈點了吧,實際程式設計中沒有必要深刻理解這麼多,這些大都是由mfc內部自動幫我們完成的。實際mfc程式設計過程中,其實懂得mfc程式中各個函式的執行流程即可。有時候過於追究mfc細節會白白浪費我們的精力,應該將主要精力放在使用mfc解決實際問題上。

12:vc6中sdi(單文件介面)程式的執行流程

下面以vc6中的sdi工程為例,通過給每個函式前設定斷點後調式執行,可以看出mfc的sdi的執行流程。記錄如下,希望對mfc執行有疑惑的人有幫助。

4)csdidoc::csdidoc()

5)cmainframe::cmainframe()

6)bool cmainframe::precreatewindow(createstruct& cs)

7)int cmainframe::oncreate(lpcreatestruct lpcreatestruct)

8)csdiview::csdiview()

9)bool csdiview::precreatewindow(createstruct& cs)

10)bool csdidoc::onnewdocument()

11) void csdiview::ondraw(cdc* pdc)

// ---------------- 關閉視窗後-------------------------------------

12) csdiview::~csdiview()

13) cmainframe::~cmainframe()

14) csdidoc::~csdidoc()

13:windows應用程式是事件驅動的,一般不會顯式的呼叫函式獲取輸入,而是等待系統將接收到的輸入傳遞給應用程式。系統會將應用程式的輸入傳遞給不同的視窗。每乙個視窗有乙個對應函式,稱為視窗函式,當有對應視窗的輸入時,系統會呼叫此函式。視窗函式會處理輸入,並執行對系統的控制。系統使用訊息的形式將輸入傳遞給視窗函式。以wm開頭的為訊息postmessage()函式將訊息傳送到訊息佇列(滑鼠鍵盤的輸入一般使用這種形式)。sendmessage()函式將訊息直接傳送給視窗大部分指標型別的資料型別都是以p或者lp為字首 。

14:winmain()函式的主要完成三個工作:註冊窗體類(使用registerclas***函式,在系統中註冊對應的窗體類)、建立視窗(使用createwindow函式建立視窗後呼叫showwindow函式顯式視窗)和啟動訊息迴圈。

15:win32程式主體,通過while語句實現訊息迴圈:

winmain(...)

}afx_msg_map

end_message_map()

這裡主要進行訊息對映的實現,把它和訊息處理函式聯絡在一起。其**現三個巨集,第乙個巨集是begin_message_map有兩個引數,分別是擁有訊息**的類及其父類 。第二個巨集是on_command, 指定命令訊息的處理函式名稱,把各種各樣的訊息與特定的處理函式關聯起來。第三個巨集是end_message_map作為結尾符號。mfc通過這三個巨集把所有的訊息一條條填入到afx_msgmap_entry結構中去,形成乙個陣列,該陣列存放了所有的訊息和與它們相關的引數。同時通過afx_msgmap能得到該陣列的首位址,同時得到基類的訊息對映入口位址。這樣,由declare_message_map定義,由begin_message_map、on_command以及end_message_map三個巨集實現的乙個訊息對映表就形成了。

mfc 應用程式框架結構的基石是文件/檢視結構,它定義了一種程式結構, 這種結構依靠文件物件儲存應用程式的資料,並依靠檢視物件控制檢視中顯示的資料。mfc 在 cdocument 和 cview 中為文件和檢視提供基礎結構

16:初始化**在oninitdialog

17:mfc程式流程

winmain() ->afxwinmain()(作用:1註冊窗體類、2呼叫應用程式類的初始化函式initinstance、呼叫應用程式類的run()函式(實際上是父類的父類cwinthread的run(函式)))

3:initinstance()是乙個虛函式,大多數應用程式都要override這個函式啟動訊息機制

三 MFC執行機制分析

2 cdoc類是進行文書處理的類,cview是進行顯示的類 3 cframe是cview的父視窗,在view中獲得view視窗指標就是this指標,獲得父視窗指標就是getparent 4 例如在frame中建立乙個button控制項,那麼就在frame的oncreate方法中加入如下 m btn....

session執行機制

session機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表 的結構 也可能就是使用 雜湊表 來儲存資訊。當程式需要為某個客戶端的請求建立乙個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了乙個session標識 稱為sessionid,如果已包含乙個sessionid則說明...

try catch finally執行機制

finally的執行 如下的程式所示,注釋中是執行的順序 public class test public static string test finally public static string test1 finally其實是僅在return 語句執行前執行,如果return 乙個函式,那...