MFC学习日记一:MFC内部运行原理

来源:互联网 发布:php初级程序员要求 编辑:程序博客网 时间:2024/04/30 03:49

Windows编程主线:

设计窗口类

注册窗口类

产生窗口

显示窗口

更新窗口

做消息循环

将消息路由到窗口中去处理

WinMain函数是所有程序的入口函数

MfcWinMain函数是当我们编译链接的时候编译器将WinMain链接到程序当中了

WinMain函数是在Msdn安装的位置的MFC文件夹下SRC目录下APPMODUL.CPP里就有_tWinMain它是一个宏右击它选择Gotodefinition就可以看到(对应我自己的电脑是在E:\vc6.0辅助\MFC\SRC\APPMODUL.CPP

测试MFC程序运行主线:

1、先在 APPMODUL.CPP里的_tWinMain函数里设置一个断点(这里测试程序首先是从这个函数进入的)-‚2、在CTestApp类中的构造函数CTestApp()里设置断点(红色代表是自己工程名字)-3在这个构造函数紧接着的下边的实例对象CTestApp theApp;这里加上断点;

调试运行上述过程,程序是先到3-2-》1 (释:先实例化这个全局对象theApp,然后会调用CTestApp 的构造函数

这个theApp是一个应用程序对象,表示了应用程序本身,每一个MFC程序当中有且仅有一个从CWinApp所派生出来的类,也有且仅有一个应用程序类所实例化的一个对象,它就表示了应用程序本身。

//*************为什么程序会先实例化theApp这个全局对象的解释,看了下面这个程序就懂了#include <iostream.h>int a=6;void main(){//在这里加上断点,有鼠标放在上面的a上看看a的值cout<<a<<endl;} //****************在执行main函数之前就为a分配好了内存空间,这里在进入main之前a的值已经是6了。

Afx(Application framework (x)没有含义)前缀的函数是应用程序框架类的函数;

因为C++不是完全面向对象的语言,为了让各个类能有机的组织在一起,定义了一些全局的函数,这些全局的函数就是应用程序框架类的函数,这些函数在每个类中都能调用。

WinMain函数中调用AfxWinMain(在SRC目录下的WINMAIN.cpp中)函数,在这个里面CWinApp* pApp = AfxGetApp();这一句来获取CWinApp指针,这个指针就是在CWinApp这个底层的构造函数中pThreadState->m_pCurrentWinThread = this;这个this指针,指向的是CTestApp对象的指针;

AfxWinMain函数里有pApp->InitApplication()是做一些内部初始化管理用的;

AfxWinMain函数里有pThread->InitInstance(),他调用的是子类CTestApp里的InitInstance(),因为它是一个虚函数。

AfxWinMain函数里有nReturnCode = pThread->Run();完成了消息循环

应用程序已经帮我们设计好了几种窗口类,我们只需要运行的时候注册一下就好了,注册窗口类是AfxEndDeferRegisterClass(在SRC目录下的WINCORE.cpp中)函数里进行注册,它会根据不同的窗口类选择不同的窗口进行注册

凡是从CWnd派生出来的类都叫窗口类

CMainFrame窗口叫框架窗口,是整个应用程序外边的大窗口,CTestView类是中间纯白的窗口

注册窗口AfxDeferRegisterClass是一个宏,定义在SR目录下的AFXIMPL.H文件中定义的是AfxEndDeferRegisterClass

应用程序进入WinMain函数后是在创建窗口之前PreCreateWindow注册窗口

凡是带Ex的函数都是扩展的函数

定义CreateStruct是为了可以在创建窗口之前有机会去修改窗口的外观

CTestApp里的

m_pMainWnd->ShowWindow(SW_SHOW);//*************显示窗口

m_pMainWnd->UpdateWindow();         //*************更新窗口

SRC目录下的WINMAIN.cpp文件中执行

nReturnCode = pThread->Run();//************************消息循环

它调用的是CWinThread::Run函数(在SR目录下的THRDCORE.cpp中)调用PumpMessage进行do{}while的消息循环

要知后事如何,请见下回分解


原创粉丝点击