首页 > 代码库 > 一个MFC程序的生命历程

一个MFC程序的生命历程

【程序的诞生】
Application object 产生,内存于是获得配置,初值也设立了。
AfxWinMain 执行 AfxWinInit,后者又调用AfxInitThread,把消息队列尽量加大到96.
AfxWinMain 执行 InitApplication。这是CWinApp的虚函数,但我们通常不改写它。
AfxWinMain 执行 InitInstance。这是CWinApp的虚函数,我们必须改写它。
CMyWinApp::InitInstance ‘new‘ 了一个 CMyFrameWnd 对象。
CMyFrameWnd 构造函数调用Create,产生主窗口。我们在Create参数中指定的窗口类是NULL,于是MFC根据窗口种类,自行为我们注册一个名为“AfxFrameOrView42d”的窗口类。
回到 InitInstance 中继续执行 ShowWindow,显示窗口。
执行 UpdateWindow,于是发出 WM_PAINT。
回到 AfxWinMain,执行 Run,进入消息循环。
【程序开始执行】
程序获得 WM_PAINT 消息(经由 CWinApp::Run 中的 ::GetMessage 循环)。
WM_PAINT 经由 ::DispatchMessage送到窗口函数CWnd::DefWindowProc中。
Cwnd::DefWindowProc 将消息传递过消息映射表格(Message Map)。
传递过程中发现有相符项目,于是调用项目中对应的函数。此函数式应用程序利用BEGIN_MESSAGE+MAP 和 END_MESSAGE_MAP 之间的宏设立起来的。
标准消息的处理程序亦有标准命名,例如WM_PAINT必然由OnPaint处理。
【程序的终结】
使用者单击[File/Close],于是发出WM_CLOSE.
CFrameWnd 并没有设置 WM_CLOSE 处理程序,于是交给默认处理程序。
默认函数对于 WM_CLOSE 的处理方式是调用 ""DestroyWindow,并因而发出 WM_DESTROY。
默认的 WM_DESTROY 处理方式是调用 ::PostQuitMessage ,因此发出WM_QUIT。
CWinApp::Run 收到 WM_QUIT 后会结束其内部的消息循环,然后调用ExitInstance,这是CWinApp的一个虚拟函数。
如果 CMyWinApp 改写了 ExitInstance,那么 CWinApp::Run 所调用的就是 CMyWinApp::ExitInstance,否则就是 CWinApp::ExitInstance。
最后回到 AfxWinMain,执行 AfxWinTerm,结束程序。
 

一个MFC程序的生命历程