• 2005-12-16

    MFC程序框架

    Tag:C++

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://wolfkiller.blogbus.com/logs/1712327.html

    程序的诞生

    1. 生成应用程序对象,进行对象初始化。

    CMyWinApp  theApp;

    2. 进入WinMain程序(WinMain程序由MFC早已准备好并由连接器直接加到应用程序代码中,在WinMain程序中调用MFC函数AfxWinMain)。

    3.  AfxWinMain执行AfxWinInit,后者又调用了AfxInitThread,把消息对列尽量加大到96

            AfxWinInit(…);

    4.  AfxWinMain执行InitApplication。这是CWinApp的虚函数,我们通常不改写它。

            CwinApp*  pApp = AfxGetApp();

            pApp->InitApplication();

    5.  AfxWinMain执行InitInstance,这是这是CWinApp的虚函数,我们必须改写它。

            pApp->InitInstance();

    1 AfxWinMain::InitInstance  ‘New’了一个CMyFrameWnd对象。

                    m_pMainWnd = new CMyFrameWnd( );

    CMyFrameWnd构造函数调用Create, 产生主窗口。Create(…)调用CreateEx,后者调用PreCreateWindow)与API  ::CreateWindowEx(…)PreCreateWindow)完成注册窗口类工作。

        2) 执行CMyFrameWnd类的ShowWindow(…)    , 显示窗口。                                    m_pMainWnd->ShowWindow(m_nCmdShow);

    3) 执行CMyFrameWnd类的UpdateWindow(…), 发出W  M_PAINT 消息,调用OnPaint()消息处理虚函数。

    6.  AfxWinMain执行Run,处理消息循环。

              nReturnCode = pApp->Run();

    程序的运行

       

    1.  程序获得 WM_PAINT 消息(藉由 CwinApp::Run ::GetMessage 循环)。

    2.  WM_PAINT 经由::DispatchMessage 送到窗口函数CWnd::DefWindowProc

    3.  CWnd::DefWindowProc 将消息传递过消息映射表格(Message Map)。

    4.  传递过程中发现有相符项目,于是调用项目中对应的函数。此函数时应用程序

    利用BEGIN_MESSAGE_MAP END_MESSAGE_MAP 之间的宏设立起来的。

    5.  标准消息的处理常程序亦有标准命名,例如WM_PAINT 必然由OnPaint 处理。

     

    程序的死亡:

     

        1.  使用者单击菜单的【File/Close】,于是发出 WM_CLOSE 消息。

    2.  CMyFrameWnd 並沒有设置WM_CLOSE 消息处理函数,于是交给基类默认的消息处理函数。

    3.  默认消息处理函数对于WM_CLOSE 的处理方式是调用 ::DestroyWindow 並因而发出 WM_DESTROY 消息。

    4.  默认的 WM_DESTROY 消息处理方式是调用 ::PostQuitMessage,因此发出WM_QUIT 消息。

    5.  CWinApp::Run 收到WM_QUIT 后会退出其內部的消息循环, 然后调用

    ExitInstance(),這是CWinApp 一个虚拟函数

    6.  如果CMyWinApp 改写了ExitInstance  那么CWinApp::Run 所调用的就是 CMyWinApp::ExitInstance,否则就是CWinApp::ExitInstance

    7.  最后回到 AfxWinMain,执行 AfxWinTerm,结束程序。


    历史上的今天:

    Windows APIs 2005-12-16

    收藏到:Del.icio.us




    引用地址: