大家都知道,Windows API編程以及其消息處理,其過程都清晰可見,大體步驟如下:
1)聲明消息窗口類
2)注冊窗口類
3)createWindows
4)消息獲得以及分派(Windows procedure)。
但是,對於MFC同樣是Windows程序,其流程卻顯得灰暗不明。先具體分析(備錄)如下:
在MFC中有兩個重要的類,CWinApp,CFrameWnd,它們兩個的存在在某種意義上來說代替了WinMain 和 WinProc的存在。
對於任何一個MFC程序,都存在一個Application Object(theApp),由於它是一個全局對象,因此是一個程序的入口點,當TheApp構造完了以後,由鏈接器將WinMain加入到應用程序中,它調用了AfxWinMain()函數。之後在AfxWinMain中,執行了AfxWinInit(),pApp->InitApplication(),pApp->InitInstance(), pApp->Run();AfxWinTerm();完成程序的整個過程。
關於 InitInstance: 首先,它會new一個CFrameWnd成員,其構造函數調用了Create();create()裡面調用了createEx(),CreateEx()調用了PreCreateWindows();這裡面MFC默認注冊了5種類型的窗口類型(Wnd,controlbar, mdiframe, FrameOrVIEw, OleControl)。
消息過程的流程:主要是調用AfxWndProc-〉AfxCallWndProc-> Wnd.WindowProc().這裡其實是程序真正的處理過程,首先判斷是否為WM_COMMAND消息;不是就按照通常的方法,進行處理(查找消息映射表,由宏建立起來的內存表),是就按照MFC規定的路線進行處理。CWnd::OnCommand()調用的是OnCmdMsg(),這裡MFC規定了其消息的路線(vIEw ,document,framewnd,winapp)。