为什么Visual Studio 2008 创建的MFC程序里没有 WndProc 或 WinMain 函数?
看到很多MFC入门教程里都说 WndProc 和 WinMain函数是MFC程序的入口程序。但是用 Visual Studio 2008 创建的MFC程序 里默认找不到这两个函数。 那到底默认程序一开始是从哪个函数进入的呢?
这个涉及到MFC对函数的封装,其实MFC把Winmain之类的函数都封装在一个类里面了,程序里面有一行C*App theApp,其中*是你工程名,main函数就在这里,你要是非要追究一下的自己断点跟进去看看吧,或者看看孙鑫的 深入浅出MFC,里面有详细的介绍
1 MFC程序里就是没有 WndProc 或 WinMain 函数;
2 选择win32项目中的windows应用程序才有。
是在程序生成时,通过链接器链接到某个函数中。WinMain函数是 在AppModul.cpp里,此文件的路径是: …/Program Files/Microsoft Visual Studio 9.0/VC/atlmfc/src/mfc/。我们看到的是_tWinMain, 在另一个文件里有这样一句:
#define _ tWinMain WinMain
程序开始时,会先创建一个全局对象: CTestApp theApp; 全局对象初始化比WinMain函数运行得更早;
WinMain 函数的实现过程
在AppModul.cpp里,我们看到:
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
这说明,_tWinMain 函数是由AfxWinMain()函数实现的。而AfxWinMain是在文件 WinMain.cpp里实现的。 在WinMain.cpp有一句关键的代码:
CWinApp* pApp = AfxGetApp();
这个就是得到最早创建的全局对象: CTestApp theApp;
CTestApp继承CWinApp,所以作为子类的CTestApp的构造函数在执行前,会调用基类CWinApp的构造函数,而这个CWinApp的构造函数是由微软提供的,所以会让微软给我们完成CTestApp的初始化工作;这是一种通过继承而获得的开放结构;这个CWinApp基类在appCore.cpp里被实现。它的构造函数是带有一个形参的,但有一个缺省值:
CWinApp(LPCTSTR lpszAppName = NULL); // app name defaults to EXE name
问题:MFC程序在哪里注册窗口?
在InitInstance()这个函数运行之后,才注册窗口类?
在孙鑫vc++视频lesson 3中的 00:38 开始讲这个注册窗口类
由一个AfxEndDeferRegisterClass 函数来完成的,这个AfxEndDeferRegisterClass在Wincore.cpp文件实现的。
未经MFC封装的部分
CallWindowProc 和 WindowProc 有何区别?
WNDCLASS
WNDCLASS 是一个数据结构struct ,里面有一个回调函数:
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc; //回调函数
……
}
这个函数要自己写,处理消息的函数,通常就是一个switch/case 语句;
注册窗口
在孙鑫vc++视频lesson 1中的 00:59 分钟的位置有说明这段程序。
创建窗口
!注意:CreateWindow(……) 有一个参数是
LPCTSTR lpClassName, // registered class name
这个name就应该是已注册的lpClassName;