MFC 学习笔记 <0>

在学习MFC(Microsoft基础类库)之前。要懂得C/C++基础知识。了解使用WIN32 API面向过程开发窗口的流程。

MFC是对WIN32 API函数面向对象化的封装,完全采用的面向对象的编程手法。所以必须对类的概念有深刻的认识。

开发工具:Microsoft Visual C++ 6.0 。使用AppWizard向导创建一个工程名为MyWnd的基于对话框的MFC。我们可以看到在整个工程文件中找不到程序的入口点函数WinMain。难道MFC抛弃了此函数?采用了别的什么机制来启动程序?在这里我们必须要确定及肯定一点:任何基于WIN32 API程序开发的入口点函数必须是WinMain或main(此为控制台应用的入口点),不然程序无法启动。既然MFC是基于WIN32 API的,那它必然有这样的函数。这个函数在哪呢?我们可以通过步步跟踪程序执行过程来查找。按F11调试运行,程序首先定位到APPMODUL.CPP文件中的_tWinMain函数体。这个函数名是不是跟WinMain很像啊。转到_tWinMain定义的TCHAR.H文件中看到下面语句:

#define _tmain main
#define _tWinMain WinMain

此定义为宏定义,将_tWinMain替代WinMain,其执行结果是一样的。MFC通常把一些代码固定,通用的函数体封装到类库里,通过包含头文件的方式来引用这些功能。我们查看工程中的StdAfx.h文件。里面包含了许多头文件:

#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
..........

在这些头文件里,MFC早已经为我们定义了_tWinMain入口点函数和其他一些功能,在工程中只要做好对这些定义文件的引用就行了。

无论是WIN32 API或MFC,一个窗口的产生都要经历:注册窗口类—>创建窗口—>显示窗口—>更新窗口—>进入窗口消息循环。但在工程中我们找不到任何这些流程的缩影。我们只看到了在MyWnd.cpp里定义了一个唯一的全局变量:

CMyWndApp theApp;

如果去掉这个变量,程序就会出现错误。我们知道整个程序的运行都是在WinMain函数体内,跳出这个函数体也就意味着程序的终止。既然不能去掉,那么我们假设theApp在WinMain函数体内被引用,那它又是怎么知道theApp变量名的呢?如果不知道变量名的话,就无法对其引用。而且我们并没有实际操作WinMain函数体或传入一个变量引用的参数进去。这时候我们或许会认为在WinMain函数体类早已经使用了theApp这个变量名,所以全局定义的变量名也只能是theApp 。带着这种不确定因素我们更改下全局变量名theApp 为 tapp或其他字符。按照目前的理解,程序肯定会出错。但是事实上它正常运行表示无压力。
在进入WinMain函数之前,程序会对全局变量进程初始化,对象CMyWndApp theApp初始化会调用其构造函数,在构造函数里将其指针赋值给一个全局变量保存。在WinMain函数体对全局变量的引用就是对全局变量的引用。因为他们是通过传址。

赞(0) 打赏
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

    暂无评论...