本篇文章不是系统的介绍MFC的对话框相关的内容。本篇的知识点会很碎,看到哪里就写到哪里。
本文参考链接: mfc最详细入门教程_wang18323834864的博客-CSDN博客_mfc
目录
1> 对话框的属性
属性名称 | 含义 |
ID | 对话框ID,唯一标识对话框资源 |
Caption | 对话框标题 |
Border | 边框类型 |
Maximize | 是否使用最大化按钮 |
Minimize | 是否使用最小化按钮 |
Style | 对话框类型,有Overlapped(重叠窗口)、Popup(弹出式窗口)、Child(子窗口),默认是Popup |
System Menu | 是否带有系统菜单,包括移动、关闭等菜单项,默认为TRUE |
Title Bar | 是否带有标题栏,默认为TRUE |
Font(Size) | 字体类型和字体大小,默认使用系统字体 |
2> 对话框的数据交换和检验
界面上的控件改变输入的值或者改变选择的状态,MFC会修改控件关联变量的值,这种同步是通过DoDataExchange()来实现的,也称作对话框的数据交换和检验机制。
3> 模态对话框
当一个对话框弹出后,本应用程序其它窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行响应操作退出后,其它窗口才能继续与用户交互,这类的对话框称为模态对话框。比如有些程序打开文件操作会打开文件对话框,此时只能对文件对话框操作,不能对该程序的其它窗口操作。
弹出对话框的函数是DoModal(),函数原型为:
virtual INT_PTR DoModal();
函数返回值指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult参数值。
如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
如果点击【退出】按钮,返回IDCANCLE;如果点击【确定】,返回IDOK。
返回点击的按钮的ID。
4> 非模态对话框
非模态对话框显示后,程序其它窗口仍然可以正常运行,可以响应用户输入,还可以相互切换。
非模态对话框创建可以使用CDialog::Create()函数。
5> 属性页对话框
属性页对话框就是包含一般属性页对话框和向导对话框两类,它将多个对话框集成于一身,通过标签或按钮来切换页面。
属性页对话框用到的类主要有两个:CPropertyPage或CPropertySheet类
5.1 CPropertyPage类
CPropertyPage类继承自CDialog类,它被用于处理某个单个的属性页,所以要为每个属性页都创建以恶搞继承自CPropertyPage的子类。如下是该类的一些成员函数
(1)构造函数
CPropertyPage();
explicit CPropertyPage(
UINT nIDTemplate,
UINT nIDCaption = 0,
DWORD dwSize = sizeof(PROPSHEETPAGE)
);
explict CPropertyPage(
LPCTSTR lpszTemplateName,
UINT nIDCaption = 0,
DWORD dwSize = sizeof(PROPSHEETPAGE)
);
第一个构造函数没有任何参数。
第二个构造函数中,nIDTemplate是属性页的对话框资源ID,参数nIDCaption是属性页对话框选项卡的标题所用字符串资源的ID,若设为0,则选项卡标题就使用该属性页的对话框资源的标题。
第三个构造函数中,参数lpszTemplateName为属性页的对话框资源的名称字符串,不能为NULL。参数nIDCaption同上。
(2)CancelToClose(0函数
在模态属性页对话框的属性页进行了某不可恢复的操作后,使用CancelToClose()函数将“OK”按钮改为“Close”按钮,并禁用“Cancel"按钮,函数原型:
void CancelToClose();
(3)SetModified()函数
调用此函数可激活或禁用”Apply"按钮,函数原型:
void SetModified(BOOL bChange = TRUE);
(4) 可重载函数
CPropertyPage类提供了一些消息处理函数,来响应属性页对话框的各种消息。重载这些消息处理函数,可以自定义对属性页对话框操作的处理。可重载的消息处理函数包括:
OnApply(); // 处理属性页的“Apply”按钮被单击的消息
OnCancel(); // 处理属性页的“Cancel"按钮被单击的消息
OnKillActive(); // 处理属性页当前活动状态被切换的消息,常用于数据验证
OnOk(); // 处理属性页的"OK"按钮、"Apply"按钮或者"Close"按钮被单击的消息
OnQueryCancel(); // 处理属性页的”Cancel"按钮被单击前发出的消息
OnReset(); // 处理属性页的“Reset"按钮被单击的消息
OnSetActive(); // 处理属性页被切换为当前活动页的消息
OnWizardBack(); // 处理属性页的"Back"按钮被单击的消息,仅在向导对话框中有效
OnWizardFinish(); // 处理属性页的"Finish"按钮被单击的消息,仅在向导对话框中有效
OnWizardNext(); // 处理属性页的"Next"按钮被单击的消息,仅在向导对话框中有效
5.2 CPropertySheet类
CPropertySheet类继承自CWnd类,它是属性表类,负责加载、打开或删除属性页,并可以在属性页对话框中中切换属性页,有模态类和非模态两种,下面介绍该类的一些成员函数。
(1)构造函数
CPropertySheet();
explicit CPropertySheet(
UINT nIDCaption,
CWnd* pParentWnd = NULL,
UINT iSelectPage = 0
);
explicit CPropertySheet(
LPCTSTR lpszCaption,
CWnd* pParentWnd = NUL,
UINT iSelectPage = 0
);
参数:
@nIDCaption:标题的字符串资源的ID;
@pParentWnd:属性页对话框的父窗口,若设为NULL,则父窗口为应用程序的主窗口;
@SelectPage:初始状态时,活动属性页的索引,默认为第一个添加到属性表的属性页。
@lpszCaption:标题字符串;
(2)GetActiveIndex()函数
获取当前活动属性页的索引,返回值是当前活动属性页的索引,函数原型:
int GetActiveIndex() const;
(3) GetActivePage()函数
获取当前活动属性页的对象,函数返回当前活动属性页对象的指针 ,函数原型为:
CPropertyPage* GetActivePage() const;
(4)GetPage()函数
获取某个属性页对象,函数原型:
CPropertyPage* GetPage(int nPage) const;
参数:nPage--目标属性页的索引。
返回值:目标属性页对象的指针。
(5)GtePageCount()函数
获取属性页的数量,函数返回值是属性页的数量,函数原型:
int GetPageCount() const;
(6) GetPageIndex()函数
获取某个属性页在属性页对话框中的索引,函数原型:
int GetPageIndex(CPropertyPage* pPage);
参数:pPage---要获取索引的属性页对象的指针;
返回值是属性页对象在属性页对话框中的索引。
(7)SetActivePage()函数
设置某个属性页为轰动属性页,函数原型:
BOOL SetActivePage(int nPage);
BOOL SetActivePage(CPropertyPage* pPage);
参数:
@nPage:要设置为活动属性页的索引;
@pPage:要设置活动属性页的对象指针;
(8)SetWizardButtons()函数
在向导对话框上启动或禁用Back、Next或Finish按钮,应在调用DoModal之前调用此函数,函数原型:
void SetWizardButtons(DWORD dwFlags);
参数:
@dwFlags:设置向导按钮的外观和功能属性,可以是以下值的组合:
dwFlags取值 | 说明 |
PSWIZB_BACK | 启用【Back】按钮,如果不包含此值则禁用【Back】按钮 |
PSWIZB_NEXT | 启用【Next】按钮,如果不包含此值则禁用【Next】按钮 |
PSWIZB_FINISH | 启用【Finish】按钮 |
PSWIZB_DISABLEDFINISH | 显示禁用的【Finish】按钮 |
(9)SetWizardMode()函数
设置属性页对话框为向导对话框模式,应在调用的DoModal()之前调用此函数,函数原型:
void SetWizardMode();
(10) SetTitle()函数
设置属性对话框的标题,函数原型:
void SetTitle(LPCTSTR lpszText, UINT nStyle = 0);
参数:
@lpszText:标题字符串;
@nStyle:指定属性表标题的风格,应当为0或PSH_PROPTITLE。如果设置为PSH_PROPTITLE,则单词“Propperties”会出现在指定标题之后。例如,SetTitle("Simple", PSH_PROPTITLE);调用后会使得属性表标题为“Simple Properties”。
(11) AddPage()函数
为属性对话框添加新的属性页,函数原型:
void AddPage(CPropertyPage* pPage);
参数pPage表示要添加的新的属性页的对象指针。
(12) PressButton()函数
模拟按下某指定的按钮,函数原型:
void PressButton(int nButton);
参数nButton表示要模拟按下的按钮,可以是下列值之一:
nButton取值 | 说明 |
PSBTN_BACK | 选择【Back】按钮 |
PSBTN_NEXT | 选择【Next】按钮 |
PSBTN_FINISH | 选择【Finish】按钮 |
PSBTN_OK | 选择【OK】按钮 |
PSBTN_APPLYNOW | 选择【Apply】按钮 |
PSBTN_CANCEL | 选择【Cancel】按钮 |
PSBTN_HELP | 选择【帮助】按钮 |
(13) RemovePage()函数
删除某属性页,函数原型:
void RemovePage(CPropertyPage *pPage);
void RemovePage(int nPage);
参数:
@pPage:要删除的属性页的对象指针;
@nPage:要删除的属性页的索引。
6. 创建向导对话框
第一步,创建属性页对话框。需要设置几页向导就添加几个对话框,删除每一个对话框界面上的【确定】、【取消】按钮;设置每一个对话框的ID、Caption,设置每一个对话框的Style属性为Child,设置每一个对话框的Border属性为Thin;为每个对话框添加需要的控件等资源。
第二步,创建属性页类。为每个对话框创建对话框类,创建时需要注意选择基类为CPropertyPage;第一个属性页和最后一个属性页应该重载函数OnSetActive(),在第一个属性页中添加【下一步】按钮,最后一个属性页应该把【下一步】按钮换成【完成】按钮;点击完成按钮后如果想进行某些处理可以重载OnWizardFinish()函数;
第三步,创建属性表类。属性页资源和属性页类创建后,需要用一个属性表类容纳这些属性页。为项目增加类,选择【MFC类】,在弹出的界面中选择基类为【CPropertySheet】,点击【Finish】即可。在新生成的类的两个构造函数中使用AddPage()函数增加属性页到属性表中。
第四步,显示向导对话框。在主界面对话框类中添加要显示向导的代码,如下代码:
// 创建属性表对象
CAddSheet sheet(L""); // CAddSheet是增加的属性表类
// 设置属性对话框为向导对话框
sheet.SetWizardMode();
// 打开模态向导对话框
sheet.DoModal();
至此,向导对话框就创建完成了。
7. 创建属性页对话框
与创建向导对话框类似。
第一步,创建属性页对话框。与创建向导对话框的第一步类似。
第二步,创建属性页类。与创建对话框的属性页类基本一样,只是一般属性页对话框中不需要【下一步】和【完成】等按钮,所以不需要OnSetActive()和OnWizardFinish()等重载函数。
第三步,创建属性表类。与创建向导对话框属性表类一样。
第四步,显示一般属性页对话框。一般属性页对话框不需要SetWizardMode(),可以将属性页对话框的标题设为【使用说明】,在构造属性表对象时将此字符串作为构造函数的参数传入。如下:
// 创建属性表对象
CAddSheet sheet(L"使用说明");
// 打开模态一般属性页对话框
sheet.DoModal();
至此,一般属性页对话框就创建完成了。