(整理)MFC对话框框架研究..docxVIP

  • 5
  • 0
  • 约7.63千字
  • 约 7页
  • 2022-10-16 发布于山东
  • 举报
精品文档 MFC对话框类的研究 这次选择研究MFC对话框类,主若是因为在生活中以及网上的一些应用程序均是以对 话框的形式编写的,而且感觉对话框类允许程序员更多的发挥自己的想象,不必拘泥于MFC AppWizard生成代码。 首先我们从最开始讲起,使用VC++工具的MFCAppWizard可以帮我们生成一个基于对话框的MFC应用程序。其中包含了三大内容:头文件、源文件、资源文件。 (以下假设工程名为“MyDialog”) 头文件中包含MyDialog.h,MyDialogDlg.h,Resource.h,stdafx.h,targetver.h。源文 件中包含MyDialog.cpp,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,使用宏定义,使得程序中使用的是便于理解的表记符ID,而不是生涩难于理解的数字。 MyDialog.h以及MyDialog.cpp是关于应用程序类的定义和实现。察看MyDialog.h文 件的代码。首先是一个宏“#pragmaonce”,这个宏的意思是在一个文件中多次引用该头文件时该宏指示编译器只包含一次。 接下来又是一个宏 “#ifndef__AFXWIN_H__ #error在包含此文件从前包含“stdafx.h”以生成PCH文件 #endif” 也就是说在其他文件中引用该文件时,必须在“#include“MyDialog.h””前加上“#include “stdafx.h””的文件包含,并且应该位于所有文件的最开始,否则编译器将提示错误。 再下来是包含头文件Resource.h。 接下来是CMyDialogApp类的声明,在其中“CMyDialogApp( );”声了然无参构 造函数,“virtualBOOLInitInstance( )”声了然重载CWinApp类的InitInstance( )函数,“DECLARE_MESSAGE_MAP( )”声了然消息映射声明宏。在类的声明之后又有一句“externCMyDialogExp3ApptheApp”声了然一个全局的CMyDialogApp对象。 下面我们再看MyDialog.cpp文件。按照前面的要求,该文件应该包含stdafx.h头文件、 MyDialog.h头文件,别的就是主窗口类的声明文件MyDialogDlg.h头文件。 然后又是一个宏 “#ifdef_DEBUG #definenewDEBUG_NEW #endif” 即如果是调试版本将把new编译为DEBUG_NEW。 接下来是消息映射实现宏以及消息映射结束宏,其中“ON_COMMAND(ID_HELP,CWinApp::OnHelp)”即为将ID_HELP与基类的OnHelp函数关系。 再下来是无参构造函数的实现,全局应用程序类对象的创办。 最后是对基类CWinApp类InitInstance( )函数的重载的实现。我们来逐段解释: 精品文档 精品文档 “INITCOMMONCONTROLSEXInitCtrls; InitCtrls.dwSize=sizeof(InitCtrls); InitCtrls.dwICC=ICC_WIN95_CLASSES; InitCommonControlsEx(InitCtrls);”这句话总体的作用就是实现了控件的初始化。 InitCommonControlsEx( )函数的原型为: BOOLInitCommonControlsEx(LPINITCOMMONCONTROLSEXlpInitCtrls); 这个函数需要一个指向INITCOMMONCONTROLSEX种类构造体的指针作为参数来完成 MFC通用控件的初始化。而INITCOMMONCONTROLSEX种类的构造体有两个成员变量 dwSize以及dwICC。dwSize记录这个构造的大小,dwICC的标志位用来决定那些控件将 从DLL中加载,即初始化。dwICC这里为ICC_WIN95_CLASSES,表示注册 InitCommonControls函数注册的所有类。 “CWinApp::InitInstance( );”调用基类的InitInstance( )完成必要的初

文档评论(0)

1亿VIP精品文档

相关文档