MFC框架及消息映射

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进行处理。
消息映射是为了节省不为每个消息都保存基类及子类的函数虚表的内存而设置的。

posted @ 2005-12-09 22:57  xiaoyixy  阅读(962)  评论(2编辑  收藏  举报