MFC学习笔记(3)
来源:互联网 发布:数据透视表更新数据源 编辑:程序博客网 时间:2024/05/26 07:27
为什么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/MicrosoftVisual Studio 9.0/VC/atlmfc/src/mfc/。我们看到的是_tWinMain, 在另一个文件里有这样一句:
#define _ tWinMain WinMain
程序开始时,会先创建一个全局对象:CTestApp theApp; 全局对象初始化比WinMain函数运行得更早;
WinMain 函数的实现过程
在AppModul.cpp里,我们看到:
_tWinMain(HINSTANCE hInstance, HINSTANCEhPrevInstance,
_In_LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
//call shared/exported WinMain
returnAfxWinMain(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(LPCTSTRlpszAppName = NULL); // app namedefaults 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(……) 有一个参数是
LPCTSTRlpClassName, // registered class name
这个name就应该是已注册的lpClassName;
- MFC学习笔记(3)
- MFC学习笔记(3)
- 【MFC】第3课 MFC程序框架学习笔记
- 深入浅出MFC学习笔记3--MFC程序流程
- MFC的 CString 学习笔记 -3
- MFC的 CString 学习笔记 -3
- VC++ MFC编程学习笔记(3)
- MFC学习笔记3_消息对话框
- MFC rtti 学习笔记
- 《深入浅出mfc》学习笔记
- MFC学习笔记
- MFC学习笔记一
- MFC学习笔记
- MFC学习笔记
- VC/MFC学习笔记
- 《深入浅出mfc》学习笔记
- MFC学习笔记基础
- MFC学习笔记(1)
- hdu 3499 最短路变形
- 游戏开发日记一
- ubuntu 正确输入用户名和密码后重复登录界面(环境变量作祟)
- 调色板工作原理
- Google开始测试语音搜索功能
- MFC学习笔记(3)
- 基于Xen虚拟机的设计与实验
- hdu 1698 线段树(区间成段修改)
- 分析“关联”需仔细
- Eclipse打开Android应用工程的错误提示:invalid project description
- POJ 3509 Rotating Rings
- DropDownList不能选中的问题
- 一道C++面试题的误区
- TechCrunch:人人不是中国的Facebook