山寨:不是最好的,是最适合我们的!欢迎体验山寨 中文版MSDN

Blog @ Blog

当华美的叶片落尽,生命的脉络才历历可见。 -- 聂鲁达

常用链接

统计

积分与排名

BBS

Blog

Web

最新评论

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

转自:http://xiaoyixy.cnblogs.com/archive/2005/12/09/294165.aspx

posted on 2008-02-20 22:04 isabc 阅读(432) 评论(0)  编辑 收藏 引用 所属分类: VC Function


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


广告信息(免费广告联系)

中文版MSDN:
欢迎体验