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

小哲

从今以后,你会是所有幸福的理由!

 
 
 

日志

 
 

MFC消息映射机制(1)  

2013-02-07 16:27:20|  分类: MFC初级 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

顺序

theApp全局对象定义出、TestApp构造函数,然后才是WinMain函数

入口函数

_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow)

{

// call shared/exported WinMain

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

}

AFxWinMain首先调用AFxGetThread函数获得一个CWinThread类型的指针,接着调用AFxGetApp函数获得一个CWinApp类型的指针。

MFC窗口框架

1、WinMain函数

2、theApp全局对象

当一个子类在构造之前会先调用其父类的构造函数。因此theApp对象的构造函数CTestApp之前,会调用其父类CWinApp的构造函数,从而就把我们程序自己创建的类与关联起来

3、AfxWinMain函数

当程序调用了CWinApp类的构造函数,并执行了CTestApp类的构造函数,且产生了theApp对象之后,接下来就进入WinMain函数

AfxWinMain首先调用了AfxGetThread函数获得一个CWinThread类型的指针pThread,节诶这调用AfxGetApp函数获得一个CWinApp类型的指针pApp

4、Initlnstance函数

pThread和平pApp调用了三个函数,这三个函数完成了Win32程序所需要的几个步骤:设计窗口类、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环、以及窗口过程函数。

pApp首先调用InitApplication函数,该函数完成MFC内部管理方面的工作。

接着调用pThreadInitInstance函数。

InitInstance函数是一个虚函数。根据类的多态性原理,可以知道AfxWinMain函数这里实际上是调用的是子类CTestAppInitInstance函数

1、设计和注册窗口类

窗口类的注册由AfxEndDeferRegisterClass函数完成的,AfxEndDeferRegisterClass函数首先获得窗口类信息,如果该窗口类已经注册,则直接返回一个真值;如果尚未注册,就调用RegisterClass函数注册该窗口类。

2、创建窗口

设计窗口类并注册窗口类之后,应该是创建窗口类了,在MFC程序中,窗口的创建功能是由CWnd类的CreateEx函数实现的。

3、显示窗口和更新窗口

Test程序的应用程序类中间那个有一个名为m_pMainWnd的成员变量,该变量是一个CWnd类型的指针,它保存了应用程序框架类窗口对象的指针,也就是说,是指向CMainFrame对象的指针。

4、消息循环

进入消息循环,CWinThread类的Run函数就是完成消息循环这一任务的,该函数是在AfxWinMain函数中调用的

5、窗口过程函数

wndcls.lpfnWndProc = DefWindowProc;

这行代码的作用是设置窗口过程函数,这里指定的是一个默认的窗口过程DefWindowProc

总结:

MFC的整个运行机制,实际上与Win32 SDK 程序是一致的,它同样也需要经过:设计窗口类,注册窗口类,创建窗口,显示并更新窗口,消息循环

1、首先利用全局应用程序对象theApp启动应用程序,正是产生了这个全局对象,基于CWinApp中的this指针才能指向这个对象。如果没有这个全局对象,程序在编译时不会出错,但在运行时就会出错。

2、调用全局对象程序的构造函数,从而就会先调用其基类CWinApp的构造函数后者完成应用程序的初始化工作,并将应用程序对象的指针保存起来

3、进入WinMain函数,在AfxWinMain函数中可以获取子类的指针,利用此指针调用虚函数InitInstance,完成应用程序的初始化工作。包括窗口类的注册、创建、窗口的显示和更新。期间会多次调用CreateEx函数,因为一个单文档MFC应用程序有多个窗口,包括框架窗口、工具条、状态条等

4、进入消息循环。虽然也是指了默认的窗口过程函数,但MFC应用程序实际上是采用消息映射机制来处理各种消息的。当收到WM_QUIT消息时,退出消息循环,程序结束。

  评论这张
 
阅读(303)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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