MFC学习笔记(3)

为什么Visual Studio 2008 创建的MFC程序里没有 WndProc WinMain 函数?

 

 

看到很多MFC入门教程里都说 WndProc WinMain函数是MFC程序的入口程序。但是用 Visual Studio 2008 创建的MFC程序 里默认找不到这两个函数。 那到底默认程序一开始是从哪个函数进入的呢?

 

这个涉及到MFC对函数的封装,其实MFCWinmain之类的函数都封装在一个类里面了,程序里面有一行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 函数来完成的,这个AfxEndDeferRegisterClassWincore.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值