您的位置:首页 > 其它

一个MFC程序的生命历程

2014-11-01 14:25 211 查看
【程序的诞生】

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,结束程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: