MFC对话框

本篇文章不是系统的介绍MFC的对话框相关的内容。本篇的知识点会很碎,看到哪里就写到哪里。

本文参考链接: mfc最详细入门教程_wang18323834864的博客-CSDN博客_mfc


目录

1> 对话框的属性

2> 对话框的数据交换和检验

3> 模态对话框

4> 非模态对话框

5> 属性页对话框

5.1 CPropertyPage类

5.2 CPropertySheet类

6. 创建向导对话框

7. 创建属性页对话框


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();

至此,一般属性页对话框就创建完成了。文章来源地址https://uudwc.com/A/O3g5

原文地址:https://blog.csdn.net/sinat_41752325/article/details/122499666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年06月15日 01:01
下一篇 2023年06月15日 01:01