一个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,结束程序。
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,结束程序。
相关文章推荐
- 一个C&C++程序的生命历程
- 一个C&C++程序的生命历程
- 一个消息提示托盘程序的开发历程(采用socket技术,附源代码)三---客户端源代码
- 终于用VC/MFC做了一个真正的程序
- 终于手动做好了第一个稍微有的形状的MFC程序~一个简陋的图形绘图工具
- 如果不用MFC,直接使用API写一个Windows程序,需哪些步骤?MFC是怎么做到菜单点击后,响应对应的代码的?
- MFC程序只能运行一个实例
- MFC中使用控件CEdit创建一个记事本小程序
- 如何在MFC程序中添加一个登陆框
- mfc创建一个没有文档类的视图程序
- 创建一个 MFC+ATL ComExe, 如同Word一样的带有AppID,Com接口 等混合型程序
- 一个简单的Win32程序(不用MFC)
- 求助:用MFC写一个打包程序
- 一个消息提示托盘程序的开发历程
- 新建一个win32空工程,然后使用MFC创建程序
- 『Visual C++ MFC 简明教程』----第二部分:一个简单的MFC程序
- 一个简单的统计代码行数的程序(基于MFC)
- 一个最简单的MFC程序
- VC的MFC做的一个画图板程序
- 在MFC下使用OpenGL的一个简单的例子(基于单文档程序)