MFC應用程序框架的啟動,首先定義一個全局的CWinAPP,其為應用程序的一個連接紐
帶,把各部分都連接起來。接下來調用_tWinMain(),其實質是一個Win32的API宏調用;在那里面,它調用了AfxWinMain(),在這
里進行應用程序框架的初始化工作:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,//In WINMAIN.CPP
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();//pThread是一個CWinThread, 它的run重載函數定義了消息循環的啟用
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))//初始化
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())//為與以前版本兼容
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();//執行消息循環和處理, PeekMessage() & PumpMessage()
//
接下來就進入了MFC的消息處理了,這里就開始了消息映射這個話題。
首先在頭文件聲明要使用到的消息映射處理函數,再以DECLARE_MESSAGE_MAP()進行聲明。
然后在實現文件里,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間執行消息處理函數,相應的類會進行調用。
窗口會調用窗口處理函數WindowProc,定義如下:
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// OnWndMsg does most of the work, except for DefWindowProc call
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult))
lResult = DefWindowProc(message, wParam, lParam);
return lResult;
}
這里OnWndMsg()做了大部的工作,進行查找消息類別并調用相應的處理函數。處理機制是由子類不斷向基類傳遞的。剩余的工作則用DefWindowProc進行處理。
消息映射是為了節省不為每個消息都保存基類及子類的函數虛表的內存而設置的。
轉自:http://xiaoyixy.cnblogs.com/archive/2005/12/09/294165.aspx