现在的位置: 首页 > 综合 > 正文

三.MFC框架程序剖析

2014年09月05日 ⁄ 综合 ⁄ 共 2002字 ⁄ 字号 评论关闭

1.Cwnd

Cwnd类是MFC中一个重要的类,它封装了与窗口有关的操作。

2.MFC中的WinMain

MFC中的WinMain函数在APPMODUL.cpp中,在编译的时候才会连接进来。

3.theApp全局对象

在程序入口函数加载前,系统已经为全局变量或全局对象分配了内存空间并为它们赋与了初值。对于全局对象,要先调用构造函数对其进行初始化。调用theApp时会选调用设用其父类CwinApp的构造函数。

4.CWinApp

在文件appcore.cpp

5.AfxWinMain函数

WinMain函数实际上是调用AfxWinMain函数来实现的。AfxWinMain位于WINMAIN.app中。

6.设计和注册窗口

MFC已经为我们预定义了一些默认的标准窗口类,只需要选择所需的窗口类,然后注册就可以了。窗口类的注册是由AfxEndDeferRegisterClass函数完成的。AfxEndDeferRegisterClass函数判断窗口类的类型,然后赋予相应的类名,这些类名都是MFC预定义的。之后计用AfxRegisterClass函数注册窗口类。

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

7.创建窗口

MFC程序中,窗口的创建功能由Cwnd类的CreateEx函数实现,该函数的声明位于AFXWin.h文件中。实现代码位于WINCORE.CPP文件中。如果在子类的PreCreateWindow函数中修改了CREATESTRUCT结构体的值,那么,接下来调用CreateWindowEx函数时,其参数就会发生相应的改变,从而就会创建一个符合我们要求的窗口。

8.显示及更新窗口

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

CtestApp类的InitInstance函数内部有如下代码。

m_pMainWnd->ShowWindow(SW_SHOW);

m_pMainWnd->UpdateWindow();

这两行代码的功能是显示应用程序框架窗口和更新这个窗口。

9.消息循环

CwinThread类的Run函数就是完成消息循五常这一任务的,该函数是在AfxWinMain函数中调用的。

调用形式如下

pThread->Run();

10.窗口过程函数

AfxEndDeferRegisterClass函数有这样一句代码。

wndcls.lpfnWndProc=DefWindowProc;这行代码的作用指定一个默认的窗口过程DefWindowProc。但实际上,MFC程序并不是把所有消息都交给DefiWindowProc这一默认的窗口过程来处理的,而是采用一种称之为消息映射的机制来处理各种消息的。

11.MFC程序运行过程

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

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

进入WinMain函数。在AfxWinMain函数中可以获取子类(Test程序来说,就是CtestApp)的指针,利用此指针调用虚函数:InitInstance,根据多态性原理,实际上调用的是子类(CTestApp)InitInstance函数。后者完成应用程序的一些初始化工作,包括窗口类的注册、创建、窗口的显示和更新。期间会多次调用CreateEx函数,因为一个单文档MFC应用程序有多个窗口,包括框架窗口、工具条、状态条等。

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

12.文档视类结构

MFC程序除了主框架窗口外,还有一个窗口视类窗口,对应的类是Cview类,Cview类也派生于CWnd类。

CtestDoc类派生于Cdocument类。其基类是CcmdTarget,后者又派生于Cobject类,CtestDoc不是一个窗口类,是一个文档类。

13.窗口类、窗口类对象与窗口

C++窗口类对象与窗口并不是一回事,它们之间惟一的关系就是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个C++窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束,但C++窗口类对象销毁时,与之相关的窗口也将销毁。

 

抱歉!评论已关闭.