欢迎来到天天文库
浏览记录
ID:24843836
大小:785.51 KB
页数:7页
时间:2018-11-16
《mfc对话框框架研究》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、MFC对话框类的研究这次选择研究MFC对话框类,主要是因为在生活中以及网上的一些应用程序均是以对话框的形式编写的,而且感觉对话框类允许程序员更多的发挥自己的想象,不必拘泥于MFCAppWizard生成代码。首先我们从最开始讲起,使用VC++工具的MFCAppWizard可以帮我们生成一个基于对话框的MFC应用程序。其中包含了三大内容:头文件、源文件、资源文件。(以下假设工程名为“MyDialog”)头文件中包含MyDialog.h,MyDialogDlg.h,Resource.h,stdafx.h,targetver.h。源文件中包含MyDialog.cpp
2、,MyDialogDlg.cpp,stdafx.cpp。targetver.h头文件定义了版本宏,即宏定义要求的最低平台,stdafx.h以及stdafx.cpp文件用于实现预编译。由于使用VC++生成的文件一般都比较多,但是一些文件比较稳定(afxwin.h、afxext.h等),我们可以确定它们在建立项目后一般不会被修改,所以为了提高编译速度,VC++中提出了预编译头文件,VC++默认使用stdafx.h文件包含那些比较稳定文件的头文件,然后结合stdafx.cpp文件在第一次编译项目的时候生成.PCH文件。Resource.h文件中定义了资源ID,使用
3、宏定义,使得程序中使用的是便于理解的标识符ID,而不是生涩难于理解的数字。MyDialog.h以及MyDialog.cpp是关于应用程序类的定义和实现。观察MyDialog.h文件的代码。首先是一个宏“#pragmaonce”,这个宏的意思是在一个文件中多次引用该头文件时该宏指示编译器只包含一次。接下来又是一个宏“#ifndef__AFXWIN_H__#error"在包含此文件之前包含“stdafx.h”以生成PCH文件"#endif”也就是说在其他文件中引用该文件时,必须在“#include“MyDialog.h””前加上“#include“stdafx.
4、h””的文件包含,并且应该位于所有文件的最开始,否则编译器将提示错误。再下来是包含头文件Resource.h。接下来是CMyDialogApp类的声明,在其中“CMyDialogApp();”声明了无参构造函数,“virtualBOOLInitInstance()”声明了重载CWinApp类的InitInstance()函数,“DECLARE_MESSAGE_MAP()”声明了消息映射声明宏。在类的声明之后又有一句“externCMyDialogExp3ApptheApp”声明了一个全局的CMyDialogApp对象。下面我们再看MyDialog.cpp文件
5、。按照前面的要求,该文件应该包含stdafx.h头文件、MyDialog.h头文件,另外就是主窗口类的声明文件MyDialogDlg.h头文件。然后又是一个宏“#ifdef_DEBUG#definenewDEBUG_NEW#endif”即如果是调试版本将把new编译为DEBUG_NEW。接下来是消息映射实现宏以及消息映射结束宏,其中“ON_COMMAND(ID_HELP,&CWinApp::OnHelp)”即为将ID_HELP与基类的OnHelp函数关联。再下来是无参构造函数的实现,全局应用程序类对象的创建。最后是对基类CWinApp类InitInstanc
6、e()函数的重载的实现。我们来逐段解释:“INITCOMMONCONTROLSEXInitCtrls;InitCtrls.dwSize=sizeof(InitCtrls);InitCtrls.dwICC=ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);”这句话总体的作用就是实现了控件的初始化。InitCommonControlsEx()函数的原型为:BOOLInitCommonControlsEx(LPINITCOMMONCONTROLSEXlpInitCtrls);这个函数需要一个指向INITCOMMO
7、NCONTROLSEX类型结构体的指针作为参数来完成MFC通用控件的初始化。而INITCOMMONCONTROLSEX类型的结构体有两个成员变量dwSize以及dwICC。dwSize记录这个结构的大小,dwICC的标志位用来决定那些控件将从DLL中加载,即初始化。dwICC这里为ICC_WIN95_CLASSES,表示注册InitCommonControls函数注册的所有类。“CWinApp::InitInstance();”调用基类的InitInstance()完成必要的初始化。“AfxEnableControlContainer();”即使当我们需要调
8、用OLE控件时,系统会自动调用该函数完成OLE控件的
此文档下载收益归作者所有