MFC学习笔记(3)

来源:互联网 发布:数据透视表更新数据源 编辑:程序博客网 时间:2024/05/26 07:27

为什么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/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 函数来完成的,这个AfxEndDeferRegisterClassWincore.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

原创粉丝点击