注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

深入解析MFC -- CWinApp的故事  

2007-07-19 14:18:30|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一个Windows应用程序至少由两部分组成:消息处理和窗口过程。在MFC中,由CWinApp和CWnd来分别处理这些操作。
CWinApp负责初始化,创建一个或多个窗口。CWinApp由CWinThread派生。CWinThread的成员函数Run,维护GetMessage() ... DispatchMessage()等消息循环。
每个MFC模块都必须写一个类CYourApp,这个类从CWinApp派生,它具体实现了此模块要做的事情。
每个模块都拥有一个CYourApp的实例,但是CYourApp的实例theApp不是_tWinMain中被创建的。在进入主程序之前,实例就已经创建出来。MFC中有非常多的全局变量,theApp就是一个全局变量。为什么theApp会成为全局变量呢?我想是微软希望掩盖_tWinMain函数的细节,那么_tWinMain自然不会知道每个项目的CWinApp的派生类的名称,也就无从生成此对象的实例了。

其实,在MFC中,最大、最重要的一个全局变量是一个无文档说明的_afxBaseModuleState,其类型是结构体_AFX_BASE_MODULE_STATE。_AFX_BASE_MODULE_STATE的所有秘密在于其基类AFX_MODULE_STATE。AFX_MODULE_STATE包括很多关于模块的核心信息,比如模块实例句柄,资源模块实例,CYourApp的指针、应用程序的名字、指向应用程序的运行时类信息结构链表中的第一个节点的指针。当theApp被生成后,就会被记录到AFX_MODULE_STATE中。当然,做为MFC的使用者,是不需要了解AFX_MODULE_STATE的具体细节的。MFC很体贴的提供了很多AfxXXX的全局函数,通过这些全局函数,我们就能获得AFX_MODULE_STATE中的小秘密了。比如AfxGetApp()可以获得theApp实例,AfxGetInstanceHandle获得模块实例句柄等。

CYourApp(即CWinApp)被创建后,将在_tWinMain中被初始化。_tWinMain首先会调用CWinApp的InitApplication,在此函数中初始化CWinApp的某些成员变量,比如CDocManager对象等。然后调用InitInstance,通常CYourApp会重载这些函数,在此函数中我们会初始化COM环境等东西,然后创建文档视图模型,创建并显示主窗口。最后会调用CWinApp的Run,开始我们的消息之旅。当用户选择退出应用程序后,程序控制权从Run中返回到_tWinMain中,函数会做一些对象清理之类的工作,最后成功退出。

 
  评论这张
 
阅读(15)| 评论(8)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017