MFC框架简介

MFC框架简介

一、MFC框架

        MFC库是开发Windows应用程序的C++接口。MFC提供了面向对象的框架,采用面向对象技术,将大部分的Windows API 封装到C++类中,以类成员函数的形式提供给程序开发人员调用。

        MFC框架简介_第1张图片

        CWnd类是MFC中一个非常重要的类,它封装了与窗口相关的操作。

在前面中,曾经有构建一个Windwos程序的几个部分:

http://blog.163.com/zhoumhan_0351/blog/static/3995422720103401415721
       MFC中的WinMain函数实际上是调用AfxWinMain函数来实现的。在VC给我们MFC向导生成的代码中,我们发现,在AfxWinMain函数中,调用了三个函数:

1、pApp->InitApplication()//完成内存管理方面的工作

2、pApp->InitInstance()//此函数是虚函数,调用派生类的InitInstance函数,完成窗口类的创建,注册,更新等操作。窗口类的注册是由AfxEndDeferRegisterClass完成。如果该窗口类已经注册,则直接返回一个真值;如果尚未注册,就调用RegisterClass函数注册该窗口类。

        其中,函数PreCreateWindow是为程序员修改窗口类参数准备的。其参数是CREATESTRUCT的引用,如果其值发生了变化,在调用CreateWindowEx函数时,其参数会发生相应的改变。

       在MFC中,窗口的创建功能由Cwnd类的CreateEx函数实现(从父类继承来的,调用CWnd::CreateEx())。

3、pApp->Run()//完成消息循环。

默认的窗口过程函数采用消息映射机制来处理各种消息的。

二、MFC程序的运行过程如下:

1)利用全局应用程序对象theApp启动应用程序。

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

3)进入WinMain函数。在AfxWinMain函数中获取子类的指针,利用指针实现上述的三个函数,从而完成窗口的创建注册等工作。

4)进入消息循环,一直到WM_QUIT。

说明:

1、this指针

在CWinApp::CWinApp函数的代码时,有:

pThreadState->m_pCurrentWinThread = this;那么this到底是什么?

我们先看看MSDN中this的定义:

        The this pointer is a pointer accessible onlywithin the member functions of a class, struct, or union type. It points to theobject for which the member function is called. Static member functions do nothave a this pointer. When a nonstatic member function is called for an object,the address of the object is passed as a hidden argument to the function. Forexample, the following function call.

     (译文:this指针是仅在类,结构或联合类型的成员函数访问的指针。它指向该成员函数被调用的对象。静态成员函数没有this指针。当一个非静态成员函数被调用的对象,该对象的地址被作为隐藏的参数传递给函数。例如,下面的函数调用。

      由上定义可见,this指针所指的应当是对象,而与类没有必然的关联关系。也就是说,在调用对象的成员函数时,将指向当前对象的指针一起传递给了成员函数,如

myDate.setMonth( 3 );//can be interpreted this way:setMonth( &myDate, 3 );

       而不管是在基类中(通过指针)调用子类的成员函数,还是在派生类中调用其成员函数。这样,如果是定义了派生类的对象,而通过基类的构造函数进行初始化与基类相关的部分时,实质上是派生类对象调用基类的构造函数在初始化,很明显的,会将派生类对象的指针传给基类。

       而在举例当时,很明显的,定义的是派生类对象:

CTestApp theApp;

       所以,在调用基类的构造函数初始化基类时,传给基类的指针是指向派生类的;而如果定义的是基类的对象,那么this指针就应当是指向基类对象了。

2、无论是全局变量,还是全局对象,程序在运行时,在加载main函数之前,就已经为全局变量或全局对象分配了内存空间。

3、对MFC程序来说,通过产生一个应用程序类的对象来惟一标识应用程序的实例。每一个MFC程序有且仅有一个从应用程序类(CWinApp)派生的类。每一个MFC程序实例有且仅有一个该派生类的实例化对象,也就是theApp全局对象。该对象就表示了应用程序本身。

4、Afx前缀的函数代表应用程序框架(Application Framework)函数。应用程序框架(Application Framework)辅助我们生成应用程序的框架模型,该模型把多个类进行了有机的集成。在MFC中,以Afx为前缀的函数都是全局函数。后缀Ex的函数都是扩展函数。

5、MicroSoft在设计类库时,采用文档/视结构。数据的存储和加载由文档类来完成,数据的显示和修改由视类来完成。

6、::开始表示全局方法。

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

8、文件存放

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

2)CWinApp在文件appcore.cpp中。

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

4)在MFC程序中,窗口的创建功能由Cwnd类的CreateEx函数实现(被位于WINFRM.CPP当中的Create调用,注意CreateEx不是虚函数),该函数的声明位于AFXWin.h文件中。实现代码位于WINCORE.CPP文件中。注册函数AfxEndDeferRegisterClass也在这个文件里。

5)CWinThread类的Run函数定义位于THRDCORE.CPP中。

6)CFrameWnd的PreCreateWindow函数位于WINFRM.CPP中。

 

你可能感兴趣的:(C++,C/C++/C#开发实战365)