Windows编程主线:
设计窗口类
注册窗口类
产生窗口
显示窗口
更新窗口
做消息循环
将消息路由到窗口中去处理
WinMain函数是所有程序的入口函数
Mfc的WinMain函数是当我们编译链接的时候编译器将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的消息循环
要知后事如何,请见下回分解