MFC應(yīng)用程序框架的啟動(dòng),首先定義一個(gè)全局的CWinAPP,其為應(yīng)用程序的一個(gè)連接紐
帶,把各部分都連接起來。接下來調(diào)用_tWinMain(),其實(shí)質(zhì)是一個(gè)Win32的API宏調(diào)用;在那里面,它調(diào)用了AfxWinMain(),在這
里進(jìn)行應(yīng)用程序框架的初始化工作:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,//In WINMAIN.CPP
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();//pThread是一個(gè)CWinThread, 它的run重載函數(shù)定義了消息循環(huán)的啟用
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();//執(zhí)行消息循環(huán)和處理, PeekMessage() & PumpMessage()
//
接下來就進(jìn)入了MFC的消息處理了,這里就開始了消息映射這個(gè)話題。
首先在頭文件聲明要使用到的消息映射處理函數(shù),再以DECLARE_MESSAGE_MAP()進(jìn)行聲明。
然后在實(shí)現(xiàn)文件里,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間執(zhí)行消息處理函數(shù),相應(yīng)的類會(huì)進(jìn)行調(diào)用。
窗口會(huì)調(diào)用窗口處理函數(shù)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()做了大部的工作,進(jìn)行查找消息類別并調(diào)用相應(yīng)的處理函數(shù)。處理機(jī)制是由子類不斷向基類傳遞的。剩余的工作則用DefWindowProc進(jìn)行處理。
消息映射是為了節(jié)省不為每個(gè)消息都保存基類及子類的函數(shù)虛表的內(nèi)存而設(shè)置的。
轉(zhuǎn)自:http://xiaoyixy.cnblogs.com/archive/2005/12/09/294165.aspx