MFC对话框框架研究

上传人:豆浆 文档编号:111847583 上传时间:2022-06-21 格式:DOC 页数:18 大小:781KB
收藏 版权申诉 举报 下载
MFC对话框框架研究_第1页
第1页 / 共18页
MFC对话框框架研究_第2页
第2页 / 共18页
MFC对话框框架研究_第3页
第3页 / 共18页
资源描述:

《MFC对话框框架研究》由会员分享,可在线阅读,更多相关《MFC对话框框架研究(18页珍藏版)》请在装配图网上搜索。

1、.MFC对话框类的研究这次选择研究MFC对话框类,主要是因为在生活中以及网上的一些应用程序均是以对话框的形式编写的,而且感觉对话框类允许程序员更多的发挥自己的想象,不必拘泥于MFCAppWizard生成代码。首先我们从最开始讲起,使用VC+工具的MFCAppWizard可以帮我们生成一个基于对话框的MFC应用程序。其中包含了三大内容:头文件、源文件、资源文件。(以下假设工程名为“MyDialog”)头文件中包含MyDialog.h,MyDialogDlg.h,Resource.h,stdafx.h,targetver.h。源文件中包含MyDialog.cpp,MyDialogDlg.cpp,s

2、tdafx.cpp。targetver.h头文件定义了版本宏,即宏定义要求的最低平台,stdafx.h以及stdafx.cpp文件用于实现预编译。由于使用VC+生成的文件一般都比较多,但是一些文件比较稳定(afxwin.h、afxext.h等),我们可以确定它们在建立项目后一般不会被修改,所以为了提高编译速度,VC+中提出了预编译头文件,VC+默认使用stdafx.h文件包含那些比较稳定文件的头文件,然后结合stdafx.cpp文件在第一次编译项目的时候生成.PCH文件。Resource.h文件中定义了资源ID,使用宏定义,使得程序中使用的是便于理解的标识符ID,而不是生涩难于理解的数字。My

3、Dialog.h以及MyDialog.cpp是关于应用程序类的定义和实现。观察MyDialog.h文件的代码。首先是一个宏“#pragmaonce”,这个宏的意思是在一个文件中多次引用该头文件时该宏指示编译器只包含一次。接下来又是一个宏“#ifndef_AFXWIN_H_#error在包含此文件之前包含“stdafx.h”以生成PCH文件#endif”也就是说在其他文件中引用该文件时,必须在“#include“MyDialog.h”前加上“#include“stdafx.h”的文件包含,并且应该位于所有文件的最开始,否则编译器将提示错误。再下来是包含头文件Resource.h。接下来是CMyD

4、ialogApp类的声明,在其中“CMyDialogApp();”声明了无参构造函数,“virtualBOOLInitInstance()”声明了重载CWinApp类的InitInstance()函数,“DECLARE_MESSAGE_MAP()”声明了消息映射声明宏。在类的声明之后又有一句“externCMyDialogExp3ApptheApp”声明了一个全局的CMyDialogApp对象。下面我们再看MyDialog.cpp文件。按照前面的要求,该文件应该包含stdafx.h头文件、MyDialog.h头文件,另外就是主窗口类的声明文件MyDialogDlg.h头文件。然后又是一个宏“#

5、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.dwIC

6、C=ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);”这句话总体的作用就是实现了控件的初始化。InitCommonControlsEx()函数的原型为:BOOLInitCommonControlsEx(LPINITCOMMONCONTROLSEXlpInitCtrls);这个函数需要一个指向INITCOMMONCONTROLSEX类型结构体的指针作为参数来完成MFC通用控件的初始化。而INITCOMMONCONTROLSEX类型的结构体有两个成员变量dwSize以及dwICC。dwSize记录这个结构的大小,dwICC的标志位用来决定那些控

7、件将从DLL中加载,即初始化。dwICC这里为ICC_WIN95_CLASSES,表示注册InitCommonControls函数注册的所有类。“CWinApp:InitInstance();”调用基类的InitInstance()完成必要的初始化。“AfxEnableControlContainer();”即使当我们需要调用OLE控件时,系统会自动调用该函数完成OLE控件的初始化。并且在有些情况下需要自己添加OLE控件的初始化函数。“SetRegistryKey(_T(应用程序向导生成的本地应用程序);”SetRegistryKey()函数的功能是设置MFC程序的注册表访问键,并把读写ini

8、文件的成员函数映射到读写注册表,只要调用一下SetRegistryKey并指定注册表键值,那么WriteProfileBianry()、WriteProfileInt()、WriteProfileString()、GetProfileBinary()、GetProfileInt()、GetProfileString()这些函数就被映射到注册表读取了。“CMyDialogDlgdlg;m_pMainWnd=&dlg;INT_PTRnResponse=dlg.DoModal();if(nResponse=IDOK)/TODO:在此放置处理何时用/“确定”来关闭对话框的代码elseif(nRespo

9、nse=IDCANCEL)/TODO:在此放置处理何时用/“取消”来关闭对话框的代码”这段代码实现了将CMyDialogDlg对话框设为主对话框并显示的功能,最后对CMyDialogDlg的返回值做相关的处理。最后返回false从中可以看出这个应用程序类可以管理主窗口类,做一些全局性的工作。看完应用程序类的声明以及实现文件,我们接着看主窗口类的声明以及实现文件CMyDialogDlg.h和CMyDialogDlg.cpp文件。CMyDialogDlg.h文件:“#pragmaonce”同上面的作用一样,防止重复包含。接下来是CMyDialogDlg类的声明,从中可以看出该窗口类派生自CDial

10、og类,并且几乎所有的窗口类都派生自CDialog类。“CMyDialogDlg(CWnd*pParent=NULL);”标准构造函数,参数为父窗口的句柄,默认为空。“enumIDD=IDD_DIALOG_FIRST;”定义了一个枚举类型数据,几乎所有窗口类都有这样一句,这样使得通过统一的标志“IDD”可以访问窗口各自的ID。“virtualvoidDoDataExchange(CDataExchange*pDX);”重载基类的DoDataExchange()函数。“HICONm_hIcon;”图标句柄变量m_hIcon“virtualBOOLOnInitDialog()”重载基类的OnIni

11、tDialog函数“afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);afx_msgvoidOnPaint();afx_msgHCURSOROnQueryDragIcon();”三个消息处理函数,由系统调用“DECLARE_MESSAGE_MAP()”消息映射声明宏下面主要讲解CMyDialogDlg类的实现,以便于我们定制属于我们自己的窗口。CMyDialogDlg.cpp文件:“#includestdafx.h”“#includeMyDialogDlg.h”“#ifdef_DEBUG#definenewDEBUG_NEW#endif”这三段代码的意

12、义与上面的相同其中又插入了一段CAboutDlg类的声明和实现,其中的意义可以参考CMyDialogDlg类。“CMyDialogDlg:CMyDialogDlg(CWnd*pParent/*=NULL*/):CDialog(CMyDialogDlg:IDD,pParent)m_hIcon=AfxGetApp()-LoadIcon(IDI_ICON_FIRST);”这是CMyDialogDlg类的构造函数的实现,其中调用了基类的构造函数(以CMyDialogDlg的ID以及父窗口句柄为参数),其后通过AfxGetApp()函数获得全局的唯一的应用程序对象(即theApp),然后调用theApp

13、对象的LoadIcon函数获得指定图标的句柄。LoadIcon函数的函数原型:HICONLoadIcon(LPCTSTRlpszResourceName)constHICONLoadIcon(UINTnIDResource)const;“voidCMyDialogExp3Dlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);”DoDataExchange函数在这里主要是用于数据的交换,但是应该注意的是这个函数是不可以直接调用的,通常是通过调用UpdateData()函数来间接调用DoDataExchange函数。DoD

14、ataExchange函数其实是一项数据动态绑定技术,所以你要在对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按扭中。“BEGIN_MESSAGE_MAP(CMyDialogExp3Dlg,CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()/AFX_MSG_MAPEND_MESSAGE_MAP()”这是消息映射的实现,其中有三个消息:WM_SYSCOMMAND、WM_PAINT、WM_QUERYDRAGICON。并且WM_PAINT这个消息是在窗口被最大化或最小化等需要重绘窗口时系

15、统自动发出的,当然也可以强行发出该消息。WM_SYSCOMMAND是在调用系统菜单时被调用,不知道大家注意到没有,在主窗口的标题栏上右击会弹出如图所示的菜单,并且当我们选择移动、关闭、关于MyDialogExp3的菜单项时就会使系统发出WM_SYSCOMMAND这个消息。WM_QUERYDRAGICON消息是当我们拖动最小化窗口时发出的。“BOOLCMyDialogDlg:OnInitDialog()CDialog:OnInitDialog();/将“关于.”菜单项添加到系统菜单中。/IDM_ABOUTBOX必须在系统命令范围内。ASSERT(IDM_ABOUTBOX&0xFFF0)=IDM_

16、ABOUTBOX);ASSERT(IDM_ABOUTBOXAppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);/设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/执行此操作SetIcon(m_hIcon,TRUE);/设置大图标SetIcon(m_hIcon,FALSE);/设置小图标/TODO:在此添加额外的初始化代码returnTRUE;/除非将焦点设置到控件,否则返回TRUE”CMyDialogDlg类的OnInitDialog()函数主要完成了三个任务:完成必要的

17、初始化、将“关于CMyDailogDlg”添加到对话框的菜单选项中、设置对话框左上角的图标。通过调用CDialog类的OnInitDialog函数完成必要的初始化,如果注释掉这一句,窗口将无法显示,可以看出其“必要性”。“ASSERT(IDM_ABOUTBOX&0xFFF0)=IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOXAppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);”这段代码是说在上面的字符串不为空的情况下,通过菜单类的AppendMenu函数为菜单添加选

18、项,其中添加了一条横线,然后有添加了“关于.”选项。“SetIcon(m_hIcon,TRUE);SetIcon(m_hIcon,FALSE);”用于设置大图标与小图标。最后返回TRUE;“voidCMyDialogDlg:OnSysCommand(UINTnID,LPARAMlParam)if(nID&0xFFF0)=IDM_ABOUTBOX)CAboutDlgdlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID,lParam);”这个函数是WM_SYSCOMMAND消息对应的响应函数,参数中nID是消息的ID,lParam中包含了

19、消息的额外信息。在函数体内,对消息ID为IDM_ABOUTBOX的消息作出弹出CAboutDlg对话框的动作。如果不是IDM_ABOUTBOX消息,则只执行基类的OnSysCommand函数。“voidCMyDialogDlg:OnPaint()if(!IsIconic()CPaintDCdc(this);/用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc(),0);/使图标在工作区矩形中居中intcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSyste

20、mMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;/绘制图标dc.DrawIcon(x,y,m_hIcon);elseCDialog:OnPaint();”这个函数是WM_PAINT消息的响应函数。其中通过IsIconic函数判断窗口是否最小化。如果不是,则只执行基类的OnPaint()函数。如果是,则重画图标。重画图标的过程:“CPaintDCdc(this);”创建一个绘图的设备环境,以this为参数,用于绘图。“

21、SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc(),0)”SendMessage区别与PostMessage函数,SendMessage直接将消息发送到指定的窗口,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。WM_ICONERASEBKGND消息用于重绘背景,reinterpret_cast(dc.GetSafeHdc()获得绘图设备环境(reinterpret_cast进行强制转换)。“intcxIcon=GetSystemMetrics(SM_CXIC

22、ON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;/绘制图标dc.DrawIcon(x,y,m_hIcon);”这段代码把图标绘制在窗口的中央。其中带哦用了CDC类的DrawIcon函数。GetSystemMetrics可以获得的系统默认图标的缺省尺寸。“HCURSORCMyDialogDlg:OnQueryDragIcon()returnstatic_cast(m_hIcon);”这个函数是WM_QUERYDRAGICON消息的响应函数。该函数由系统调用,函数内部直接返回图标,同样static_cast也是一个强制转换说明符。这样我们就可以定制自己的对话框了!参考:百度百科CSDN网站MSDN.18

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!