MFC学习笔记 对话框

对话框有两种类型:模式和无模式。

CDialog 类

用于在屏幕上显示对话框的基类。

cpp 复制代码
class CDialog : public CWnd
名称 描述
CDialog::Create 初始化 CDialog 对象。 创建无模式对话框并将其附加到 CDialog 对象。
CDialog::CreateIndirect 从内存中的对话框模板创建无模式对话框(不是基于资源)。
CDialog::DoModal 调用模式对话框并在完成后返回。
CDialog::EndDialog 关闭模式对话框。
CDialog::GetDefID 获取对话框的默认按钮控件的 ID。
CDialog::GotoDlgCtrl 将焦点移动到对话框中的指定对话框控件。
CDialog::InitModalIndirect 从内存中的对话框模板创建模式对话框(不是基于资源)。 参数被存储,直到调用函数 DoModal
CDialog::MapDialogRect 将矩形的对话框单位转换为屏幕单位。
CDialog::NextDlgCtrl 将焦点移动到对话框中的下一个对话框控件。
CDialog::OnInitDialog 替代以增强对话框初始化。
CDialog::OnSetFont 替代以指定对话框控件在绘制文本时要使用的字体。
CDialog::PrevDlgCtrl 将焦点移动到对话框中的前一个对话框控件。
CDialog::SetDefID 将对话框的默认按钮控件更改为指定的按钮。
CDialog::SetHelpID 设置对话框的上下文相关帮助 ID。
名称 描述
CDialog::OnCancel 替代以执行"取消"按钮或 ESC 键操作。 默认将关闭对话框,并且 DoModal 将返回 IDCANCEL。
CDialog::OnOK 替代以在模式对话框中执行"确定"按钮操作。 默认将关闭对话框,并且 DoModal 将返回 IDOK。

CDialog::Create

使用资源中的对话框模板调用 Create 以创建无模式对话框。

cpp 复制代码
virtual BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

virtual BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);

lpszTemplateName 包含一个以 null 结尾的字符串,它是对话框模板资源的名称。

pParentWnd 指向对话框对象所属的父窗口对象(类型为 CWnd)。 如果为 NULL,则对话框对象的父窗口设置为主应用程序窗口。

nIDTemplate包含对话框模板资源的 ID 号码。

如果已成功创建和初始化对话框,这两种形式将返回非零值,否则返回 0。

CWnd类

CWnd::UpdateData

调用此成员函数可初始化对话框中的数据,或者检索和验证对话框数据。

cpp 复制代码
BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

bSaveAndValidate 指示是正在初始化对话框 (FALSE) 还是正在检索数据 (TRUE) 的标志。

如果操作成功,则返回非零值;否则返回 0。 如果 bSaveAndValidateTRUE,则非零返回值表示数据已成功验证。

CWnd::ShowWindow

设置窗口的可见性状态。

cpp 复制代码
BOOL ShowWindow(int nCmdShow);

nCmdShow 指定 CWnd 的显示方式。 它必须是以下值之一:

  • SW_HIDE 隐藏此窗口并将激活传递给另一个窗口。

  • SW_MINIMIZE 最小化窗口并激活系统列表中的顶级窗口。

  • SW_RESTORE 激活并显示窗口。 如果窗口已最小化或最大化,则 Windows 会将其还原为原始大小和位置。

  • SW_SHOW 激活窗口并以当前大小和位置显示窗口。

  • SW_SHOWMAXIMIZED 激活窗口并显示最大化的窗口。

  • SW_SHOWMINIMIZED 激活窗口并将其显示为图标。

  • SW_SHOWMINNOACTIVE 以图标形式显示窗口。 当前处于活动状态的窗口仍保持活动状态。

  • SW_SHOWNA 以当前状态显示窗口。 当前处于活动状态的窗口仍保持活动状态。

  • SW_SHOWNOACTIVATE 以最近的大小和位置显示窗口。 当前处于活动状态的窗口仍保持活动状态。

  • SW_SHOWNORMAL 激活并显示窗口。 如果窗口已最小化或最大化,则 Windows 会将其还原为原始大小和位置。

如果窗口先前可见,则返回非零值;如果 CWnd 先前已隐藏,则返回 0。

CWnd::Create

创建指定的子窗口并将其附加到 CWnd 对象。

cpp 复制代码
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
    Const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);

lpszClassName [in] 指向以 null 结尾的字符串的指针,该字符串包含已注册的系统窗口类的名称;或者为预定义的系统窗口类的名称。

lpszWindowName [in] 指向以 null 结尾的字符串的指针,该字符串包含窗口显示名称;否则为 NULL,表示没有窗口显示名称。

dwStyle [in] 窗口样式的按位组合 (OR)。 WS_POPUP 选项不是有效样式。

rect [in] 窗口相对于父窗口左上角的大小和位置。

pParentWnd [in] 指向父窗口的指针。

nID [in] 窗口的 ID。

pContext [in] 指向 CCreateContext 结构的指针,该结构用于自定义应用程序的文档视图体系结构。

cpp 复制代码
// Dynamically create static control using CWnd::Create,
// instead of with CStatic::Create, which doesn't
// need the "STATIC" class name.
void CMyDlg::OnCreateStatic() 
{
   // m_pWndStatic is a CWnd* member of CMyDlg
   m_pWndStatic = new CWnd;
   m_pWndStatic->Create(_T("STATIC"), _T("Hi"), WS_CHILD | WS_VISIBLE,
       CRect(0, 0, 20, 20), this, 1234);
}

CWnd::CreateEx

创建指定的窗口并将其附加到 CWnd 对象。

cpp 复制代码
virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
    DWORD dwStyle, int x, int y, int nWidth, int nHeight,
    HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam = NULL);

virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
    DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam = NULL);

dwExStyle
扩展窗口样式的按位组合 (OR);否则为 NULL(默认扩展窗口样式)。

lpszClassName

指向以 null 结尾的字符串的指针,该字符串包含已注册的系统窗口类的名称;或者为预定义的系统窗口类的名称。

lpszWindowName

指向以 null 结尾的字符串的指针,该字符串包含窗口显示名称;否则为 NULL,表示没有窗口显示名称。

dwStyle
窗口样式的按位组合 (OR);否则为 NULL(默认窗口样式)。

x

窗口与屏幕左侧或父窗口之间的初始水平距离。

y

窗口与屏幕顶部或父窗口之间的初始垂直距离。

nWidth

窗口的宽度(以像素为单位)。

nHeight

窗口的高度(以像素为单位)。

hwndParent

对于子窗口,为父窗口的句柄;否则,如果窗口有所有者,则为所有者窗口的句柄。

nIDorHMenu

对于子窗口,为窗口 ID;否则为窗口菜单的 ID。

lpParam

指向传递给 lpCreateParams 字段中 CWnd::OnCreate 方法的用户数据的指针。

rect

窗口相对于屏幕或父窗口的大小和位置。

pParentWnd

对于子窗口,为指向父窗口的指针;否则,如果窗口有所有者,则为指向所有者窗口的指针。

nID

对于子窗口,为窗口 ID;否则为窗口菜单的 ID。

CWnd::DestroyWindow

销毁附加到 CWnd 对象的 Windows 窗口。

cpp 复制代码
virtual BOOL DestroyWindow();

如果已销毁窗口,则返回非零值;否则返回 0。

CWnd::PostNcDestroy

在销毁窗口后由默认的 OnNcDestroy 成员函数调用。

cpp 复制代码
virtual void PostNcDestroy();

派生类可以使用此函数进行自定义清理,例如删除 this 指针。

控件

添加控件

编辑控件

删除控件

选中控件,按delete键。

测试对话框

对话数据交换和验证

对话框数据交换(DDX)是一种简单的方法,用于初始化对话框中的控件并收集用户的数据输入。 对话框数据验证(DDV)是验证对话框中数据输入的一种简单方法。 若要利用对话框中的 DDX 和 DDV,请使用 "添加成员变量向导 "创建数据成员并设置其数据类型并指定验证规则。

对话框数据交换

UpdateData 可以在两个方向进行,具体由传递给它的 BOOL 参数指定。 若要执行交换,UpdateData 将设置 CDataExchange 对象并调用对话框类的 CDialogDoDataExchange 成员函数的重写。 DoDataExchange 接受CDataExchange类型的参数。 CDataExchange传递给UpdateData表示交换上下文的对象,定义交换方向等信息。

当你(或代码向导)重写 DoDataExchange 时,可以指定对每个数据成员(控件)调用一个 DDX 函数。 每个 DDX 函数都了解如何基于由 CDataExchange 传递给 DoDataExchangeUpdateData 自变量提供的上下文双向交换数据。

MFC 为不同类型的交换提供了许多 DDX 函数。 以下示例演示了一个 DoDataExchange 重写,其中调用两个 DDX 函数和一个 DDV 函数:

cpp 复制代码
void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   DDX_Check(pDX, IDC_MY_CHECKBOX, m_bVal);
   DDX_Text(pDX, IDC_MY_TEXTBOX, m_strName);
   DDV_MaxChars(pDX, m_strName, 20);
}

对话框数据验证

您可以通过调用 DDV 函数来指定验证,除此之外还可以进行数据交换,如 对话数据交换中的示例所示。 示例中的 DDV_MaxChars 调用验证在文本框控件中输入的字符串长度不超过 20 个字符(DDV_MaxChars(pDX, m_strName, 20);)。 如果验证失败并将焦点放在有问题的控件上,则 DDV 函数通常会向用户发出消息框警报,以便用户可以重新输入数据。 给定控件的 DDV 函数必须在同一控件的 DDX 函数之后立即调用。

还可以定义自己的自定义 DDX 和 DDV 例程。 有关 DDX 和 DDV 的其他方面的详细信息,请参阅 MFC 技术说明 26

创建对话框项目

范例模态对话框

新建项目

插入对话框

创建对话框

创建对话框的成员变量

变量类型应该是public

对话框初始化

一般在构造函数中初始化、WM_CREATE初始化、WM_INITDIALOG初始化

运行对话框

cpp 复制代码
#include "Square.h"

...

void CMFCTest2View::OnModeldlg()
{
	CSquare dlg;
	if (dlg.DoModal() == IDOK)
	{
		m_vLength = dlg.m_length;
		Invalidate();//刷新视图
	}
}
cpp 复制代码
void CMFCTest2View::OnDraw(CDC* /*pDC*/)
{
	CMFCTest2Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	CClientDC dc{this};
	dc.Rectangle(10, 10, 10 + m_vLength, 10 + m_vLength);
}

非模态对话框与模态对话框的差异

可见属性

第一种,将对话框的属性设置为True

第二种,用CWnd::ShowWindow来显示对话框

对话框的创建

用CWnd::Create创建

对象的创建和关闭

非模态对话框用new操作符创建。

非模态对话框用定义自己的OnOK和OnCancel,用CWnd::DestroyWindow()关闭窗口

窗口被关闭后,框架会自动调用CWnd::PostNcDestroy(),可以在这个函数清理非模态对话框对象(例如删除 this 指针)。

窗口状态标记

必须有一个标志标明非模态对话框是否打开的标志,通常用窗口拥有者中指向该对话框的指针作为状态标记,nullptr表示关闭。

范例非模态对话框

新建项目

插入对话框

创建对话框

创建对话框的成员变量

变量类型应该是public

对话框初始化

一般在构造函数中初始化、WM_CREATE初始化、WM_INITDIALOG初始化

运行对话框

cpp 复制代码
//由于CSquare 使用 CMFCTest2View,CMFCTest2View 使用 CSquare
//所以需要使用以下前向声明
class CSquare;
class CMFCTest2Doc;


class CMFCTest2View : public CView
{

private:
	int m_vLength;

public:
	CSquare* m_pDlg;//窗口指针

....

// 特性

	CMFCTest2Doc* GetDocument() const;

....

}
cpp 复制代码
CMFCTest2View::CMFCTest2View() noexcept
{
	m_vLength = 0;
	m_pDlg = nullptr;
	// TODO: 在此处添加构造代码

}
cpp 复制代码
//由于CSquare 使用 CMFCTest2View,CMFCTest2View 使用 CSquare
//所以需要使用以下前向声明
class CMFCTest2View;

class CSquare : public CDialog
{

....

public:
	CMFCTest2View* m_pParent;//指向视图对象的指针

....
	
};
cpp 复制代码
...

#include "Square.h"//新增
...

CSquare::CSquare(CWnd* pParent /*=nullptr*/)
	: CDialog(IDD_DIALOG1, pParent)
	, m_length(0)
{
	m_pParent = (CMFCTest2View*)pParent;//非模块窗口的拥有者
}

...

cpp 复制代码
void CMFCTest2View::OnNomodeldlg()
{
	//如果非模态对话框存在(指针不为空)
	if (m_pDlg)
	{
		m_pDlg->SetActiveWindow();//激活窗口
	}
	else
	{
		//创建非模态对话框
		m_pDlg = new CSquare(this);//用new创建对象
		m_pDlg->m_pParent = this; //主窗口(拥有者)赋值
		m_pDlg->CDialog::Create(IDD_DIALOG1, this);//创建对话框
		m_pDlg->ShowWindow(SW_SHOW);//显示对话框
	}
}
cpp 复制代码
...
#include "MFCTest2View.h"

...


BEGIN_MESSAGE_MAP(CSquare, CDialog)
	ON_BN_CLICKED(IDOK, &CSquare::OnBnClickedOk)
	ON_BN_CLICKED(IDCANCEL, &CSquare::OnBnClickedCancel)
END_MESSAGE_MAP()



void CSquare::OnBnClickedOk()
{
	UpdateData(true);//UI数据到类变量
	CClientDC dc(m_pParent);
	dc.Rectangle(50, 50, 50 + m_length, 50 + m_length);//绘制矩形
	CDialog::OnOK();
}


void CSquare::OnBnClickedCancel()
{
	if (m_pParent != nullptr)
	{
		m_pParent->m_pDlg = nullptr;
		CWnd::DestroyWindow();
	}

	CDialog::OnCancel();
}
cpp 复制代码
void CSquare::PostNcDestroy()
{
	// TODO: 在此添加专用代码和/或调用基类

	CDialog::PostNcDestroy();
	delete this;//释放内存
}

窗口对象的清除

要删除一个MFC窗口对象,应该先删除窗口对象封装的窗口,然后删除窗口对象本身。

删除窗口最直接的方法是调用CWnd::DestroyWindow或::DestroyWindow,前者封装了后者功能。

一般当用户退出应用程序时会产生WM_CLOSE消息,MFC会调用CWnd::DestroyWindow()响应。

在非模态窗口中,调用CWnd::DestroyWindow或::DestroyWindow删除一个窗口时,该窗口的PostNcDestroy(),如下,不具有自动清除功能的这个成员函数,通常需要用户在函数内手动清除。

不具有自动清除功能

通常以变量形式创建

|---|----------------------------|
| 1 | 所有标准的Windows控件类 |
| 2 | 从CWn类直接派生的出来的子窗口(入用户定制的控件) |
| 3 | 切分窗口类CSplitterWnd |
| 4 | 默认的控制条,包括工具栏、状态栏、对话框 |
| 5 | 模态对话框 |

具有自动清除功能

通常在堆中创建

|---|---------------------------|
| 1 | 主框架窗口,直接或间接从CFrameWnd派生的类 |
| 2 | 视图类,直接或间接从CView派生的类 |
| 3 | 非模态对话框 |

范例

cpp 复制代码
void CSquare::OnBnClickedCancel()
{
	if (m_pParent != nullptr)
	{
		//m_pParent->m_pDlg = nullptr;//更改对话框标记
		//CWnd::DestroyWindow();
		CWnd::ShowWindow(SW_SHOW);
	}

	CDialog::OnCancel();
}
cpp 复制代码
void CMFCTest2View::OnNomodeldlg()
{
	//如果非模态对话框存在(指针不为空)
	if (m_pDlg)
	{
		m_pDlg->SetActiveWindow();//激活窗口
		m_pDlg->ShowWindow(SW_SHOW);
	}
	else
	{
		//创建非模态对话框
		m_pDlg = new CSquare(this);//用new创建对象
		m_pDlg->m_pParent = this; //主窗口(拥有者)赋值
		m_pDlg->CDialog::Create(IDD_DIALOG1, this);//创建对话框
		m_pDlg->ShowWindow(SW_SHOW);//显示对话框
	}
}

属性页对话框

CPropertySheet

表示属性表,也称为选项卡对话框

cpp 复制代码
class CPropertySheet : public CWnd
名称 描述
CPropertySheet::AddPage 向属性表添加页面。
CPropertySheet::Construct 构造 CPropertySheet 对象。
CPropertySheet::Create 显示无模式属性表。
CPropertySheet::DoModal 显示模式属性表。
CPropertySheet::EnableStackedTabs 指示属性表是使用堆叠选项卡还是滚动选项卡。
CPropertySheet::EndDialog 终止属性表。
CPropertySheet::GetActiveIndex 检索属性表的活动页的索引。
CPropertySheet::GetActivePage 返回活动页对象。
CPropertySheet::GetPage 检索指向指定页面的指针。
CPropertySheet::GetPageCount 检索属性表中的页数。
CPropertySheet::GetPageIndex 检索属性表的指定页面的索引。
CPropertySheet::GetTabControl 检索指向选项卡控件的指针。
CPropertySheet::MapDialogRect 将矩形的对话框单位转换为屏幕单位。
CPropertySheet::OnInitDialog 重写以增强属性表初始化。
CPropertySheet::PressButton 模拟在属性工作表中对指定按钮的选择。
CPropertySheet::RemovePage 从属性表中删除某页。
CPropertySheet::SetActivePage 以编程方式设置活动页对象。
CPropertySheet::SetFinishText 设置"完成"按钮的文本。
CPropertySheet::SetTitle 设置属性表的标题。
CPropertySheet::SetWizardButtons 启用向导按钮。
CPropertySheet::SetWizardMode 启用向导模式。

CPropertyPage

表示属性表的各个页,也称为选项卡对话框。

cpp 复制代码
class CPropertyPage : public CDialog
名称 描述
CPropertyPage::CancelToClose 在模式属性表的页面发生不可恢复的更改后,将"确定"按钮更改为"关闭",并禁用"取消"按钮。
CPropertyPage::Construct 构造 CPropertyPage 对象。 如果想在运行时指定参数,或者如果正在使用数组,请使用 Construct
CPropertyPage::GetPSP 检索与 CPropertyPage 对象关联的 Windows PROPSHEETPAGE 结构。
CPropertyPage::OnApply 单击"立即应用"按钮时由框架调用。
CPropertyPage::OnCancel 单击"取消"按钮时由框架调用。
CPropertyPage::OnKillActive 当前页面不再是活动页时由框架调用。 在此处执行数据验证。
CPropertyPage::OnOK 单击"确定"、"立即应用"或"关闭"按钮时由框架调用。
CPropertyPage::OnQueryCancel 在单击"取消"按钮时且在取消之前由框架调用。
CPropertyPage::OnReset 单击"取消"按钮时由框架调用。
CPropertyPage::OnSetActive 当该页面成为活动页时由框架调用。
CPropertyPage::OnWizardBack 在使用向导类型的属性表时单击"返回"按钮时由框架调用。
CPropertyPage::OnWizardFinish 在使用向导类型的属性表时单击"完成"按钮时由框架调用。
CPropertyPage::OnWizardNext 在使用向导类型的属性表时单击"下一步"按钮时由框架调用。
CPropertyPage::QuerySiblings 将消息转发到属性表的每一页。
CPropertyPage::SetModified 调用以激活或停用"立即应用"按钮。

范例

cpp 复制代码
void CMFCTest2View::OnPropage()
{
	CPropertySheet m_mySheet(L"属性页");
	CPersonalPage page1;
	CUnitPage page2;
	m_mySheet.AddPage(&page1);
	m_mySheet.AddPage(&page2);
	if (m_mySheet.DoModal()==IDOK)
	{
		CString s = page1.m_name + " 的工作单位是:" + page2.m_work;
		MessageBox(s);
	}
}

通用对话框

CFileDialog 类

封装用于文件打开操作或文件保存操作的常见对话框。

cpp 复制代码
class CFileDialog : public CCommonDialog
名称 描述
CFileDialog::AddCheckButton 向对话框添加复选按钮。
CFileDialog::AddComboBox 向对话框添加组合框。
CFileDialog::AddControlItem 将项添加到对话框中的容器控件。
CFileDialog::AddEditBox 向对话框添加编辑框。
CFileDialog::AddMenu 向对话框添加菜单。
CFileDialog::AddPlace 已重载。 将文件夹添加到可供用户打开或保存项的位置列表中。
CFileDialog::AddPushButton 向对话框添加按钮。
CFileDialog::AddRadioButtonList 将选项按钮(也称单选按钮)组添加到对话框。
CFileDialog::AddSeparator 向对话框添加分隔符。
CFileDialog::AddText 向对话框添加文本内容。
CFileDialog::ApplyOFNToShellDialog 更新 CFileDialog 的状态,使之与 m_ofn 成员变量中存储的参数和标志匹配。
CFileDialog::DoModal 显示对话框,使用户能够做出选择。
CFileDialog::EnableOpenDropDown 在对话框中的"打开"或"保存"按钮上启用下拉列表。
CFileDialog::EndVisualGroup 停止将元素添加到对话框中的视觉对象组。
CFileDialog::GetCheckButtonState 获取对话框中的复选按钮(复选框)的当前状态。
CFileDialog::GetControlItemState 获取在对话框中找到的容器控件中的项的当前状态。
CFileDialog::GetControlState 获取给定控件的当前可见性和启用状态。
CFileDialog::GetEditBoxText 获取编辑框控件中的当前文本。
CFileDialog::GetFileExt 返回所选文件的扩展名。
CFileDialog::GetFileName 返回所选文件的文件名。
CFileDialog::GetFileTitle 返回所选文件的标题。
CFileDialog::GetFolderPath 为资源管理器样式的"打开"或"另存为"常见对话框检索当前处于打开状态的文件夹或目录的路径。
CFileDialog::GetIFileDialogCustomize 检索自定义 CFileDialog 对象的内部 COM 对象。
CFileDialog::GetIFileOpenDialog 检索用作"打开"文件对话框的 CFileDialog 的内部 COM 对象。
CFileDialog::GetIFileSaveDialog 检索用作"保存"文件对话框的 CFileDialog 的内部 COM 对象。
CFileDialog::GetNextPathName 返回下一个选定文件的完整路径。
CFileDialog::GetOFN 检索 CFileDialog 对象的 OPENFILENAME 结构。
CFileDialog::GetPathName 返回选定文件的完整路径。
CFileDialog::GetReadOnlyPref 返回选定文件的只读状态。
CFileDialog::GetResult 获取用户在对话框中所做的选择。
CFileDialog::GetResults 获取用户在某个允许多项选择的对话框中所做的选择。
CFileDialog::GetSelectedControlItem 从对话框中的指定容器控件获取特定项。
CFileDialog::GetStartPosition 返回文件名列表的第一个元素的位置。
CFileDialog::HideControl 在资源管理器样式的"打开"或"另存为"常见对话框中隐藏指定的控件。
CFileDialog::IsPickFoldersMode 确定当前对话框是否处于文件夹选取器模式。
CFileDialog::MakeProminent 将某个控件放在对话框中,使其突出显示(相对于其他已添加的控件而言)。
CFileDialog::RemoveControlItem 将项从对话框的容器控件中删除。
CFileDialog::SetCheckButtonState 设置对话框中的复选按钮(复选框)的当前状态。
CFileDialog::SetControlItemState 设置在对话框中找到的容器控件中的项的当前状态。
CFileDialog::SetControlItemText 设置控件项的文本。 例如,单选按钮或菜单中项附带的文本。
CFileDialog::SetControlLabel 设置与控件关联的文本,例如按钮文本或编辑框标签。
CFileDialog::SetControlState 设置给定控件的当前可见性和启用状态。
CFileDialog::SetControlText 在资源管理器样式的"打开"或"另存为"常见对话框中设置指定控件的文本。
CFileDialog::SetDefExt 为资源管理器样式的"打开"或"另存为"常见对话框设置默认文件扩展名。
CFileDialog::SetEditBoxText 设置编辑框控件中的当前文本。
CFileDialog::SetProperties 提供一个属性存储,它定义将默认值用于正在保存的项。
CFileDialog::SetSelectedControlItem 在对话框中找到的选项按钮组或组合框中设置特定项的选定状态。
CFileDialog::SetTemplate 设置 CFileDialog 对象的对话框模板。
CFileDialog::StartVisualGroup 在对话框中声明视觉对象组。 对任何"add"方法的后续调用会将这些元素添加到此组。
CFileDialog::UpdateOFNFromShellDialog 更新存储在 m_ofn 成员变量中的数据,使之与文件对话框的当前状态匹配。
名称 描述
CFileDialog::OnButtonClicked 在单击按钮时调用。
CFileDialog::OnCheckButtonToggled 在选中/取消选中复选框时调用。
CFileDialog::OnControlActivating 在控件处于活动状态时调用。
CFileDialog::OnFileNameChange 处理 WM_NOTIFY CDN_SELCHANGE 消息。
CFileDialog::OnFileNameOK 验证对话框中输入的文件名。
CFileDialog::OnFolderChange 处理 WM_NOTIFY CDN_FOLDERCHANGE 消息。
CFileDialog::OnInitDone 处理 WM_NOTIFY CDN_INITDONE 消息。
CFileDialog::OnItemSelected 在选择容器项时调用。
CFileDialog::OnLBSelChangedNotify 让你可以在文件选择发生更改时执行自定义操作。
CFileDialog::OnShareViolation 处理共享冲突。
CFileDialog::OnTypeChange 处理 WM_NOTIFY CDN_TYPECHANGE 消息。
cpp 复制代码
	//bOpenFileDialog:true 文件 > 打开;false,文件 > 另存为
	//lpszDefExt:默认的文件扩展名
	//lpszFileName:"文件名"框中显示的初始文件名。
	//dwFlags:一个或多个标志的组合,可用于自定义对话框。
	//lpszFilter:一系列字符串对,用于指定可应用于文件的筛选器。
	//pParentWnd:一个指针,指向文件对话框的父窗口或所有者窗口。
	//dwSize: OPENFILENAME 结构的大小。 0 表示 MFC 代码将根据运行程序的操作系统版本确定要使用的正确的对话框大小。
	//bVistaStyle:[in] 注意 此参数在 Visual Studio 2008 及更高版本中可用,因此,仅当你在 Windows Vista 或更高版本中运行时,才使用新样式对话框。
	CFileDialog dlg(true,L"txt", L"*.txt",OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY, L"所有文件(*.*)|*.* |文本(*.txt)|*.txt||", this);
	if (dlg.DoModal() == IDOK)
	{
		CString filePathName = dlg.GetPathName();
		ShellExecute(NULL, L"open", filePathName, NULL, NULL, SW_RESTORE);

	}

CColorDialog 类

允许将颜色选择对话框合并到应用程序。

cpp 复制代码
class CColorDialog : public CCommonDialog
名称 描述
CColorDialog::DoModal 显示颜色对话框并允许用户做出选择。
CColorDialog::GetColor 返回包含所选颜色的值的 COLORREF 结构。
CColorDialog::GetSavedCustomColors 检索用户创建的自定义颜色。
CColorDialog::SetCurrentColor 将当前颜色选择强制为指定的颜色。
名称 描述
CColorDialog::OnColorOK 重写以验证对话框中输入的颜色。
cpp 复制代码
	CColorDialog dlg;
	if (dlg.DoModal() == IDOK)
	{
		CPen newPen;
		CClientDC dc{this};
		COLORREF color = dlg.GetColor();
		newPen.CreatePen(PS_SOLID, 2 ,color);
		CPen* oldPen = dc.SelectObject(&newPen);
		dc.Rectangle(100, 100, 400, 400);
		dc.SelectObject(oldPen);
	}

CFontDialog 类

允许将字体选择对话框合并到应用程序。

cpp 复制代码
class CFontDialog : public CCommonDialog
名称 描述
CFontDialog::DoModal 显示对话框并允许用户做出选择。
CFontDialog::GetCharFormat 检索选定字体的字符格式设置。
CFontDialog::GetColor 返回选定字体的颜色。
CFontDialog::GetCurrentFont 将当前选定字体的特征分配给 LOGFONT 结构。
CFontDialog::GetFaceName 返回选定字体的字体名称。
CFontDialog::GetSize 返回选定字体的磅值。
CFontDialog::GetStyleName 返回选定字体的样式名称。
CFontDialog::GetWeight 返回选定字体的粗细。
CFontDialog::IsBold 确定字体是否为粗体。
CFontDialog::IsItalic 确定字体是否为斜体。
CFontDialog::IsStrikeOut 确定字体是否带删除线显示。
CFontDialog::IsUnderline 确定字体是否带下划线。

cpp 复制代码
	CFontDialog dlg;
	if (dlg.DoModal() == IDOK)
	{
		CFont font;
		font.CreateFontIndirect(dlg.m_cf.lpLogFont);
		CClientDC dc{this};
		CFont* oldFont = dc.SelectObject(&font);
		dc.SetTextColor(dlg.GetColor());
		dc.TextOut(20,20, L"测试ABC123");
		dc.SelectObject(oldFont);
		font.DeleteObject();
	}

CPrintDialog

封装由 Windows 公共对话框提供的打印服务。

cpp 复制代码
class CPrintDialog : public CCommonDialog
名称 描述
CPrintDialog::CreatePrinterDC 在不显示"打印"对话框的情况下创建打印机设备上下文。
CPrintDialog::DoModal 显示对话框并允许用户做出选择。
CPrintDialog::GetCopies 检索请求的份数。
CPrintDialog::GetDefaults 在不显示对话框的情况下检索设备默认值。
CPrintDialog::GetDeviceName 检索当前所选打印机设备的名称。
CPrintDialog::GetDevMode 检索 DEVMODE 结构。
CPrintDialog::GetDriverName 检索当前所选打印机驱动程序的名称。
CPrintDialog::GetFromPage 检索打印范围的起始页面。
CPrintDialog::GetPortName 检索当前所选打印机端口的名称。
CPrintDialog::GetPrinterDC 检索打印机设备上下文的句柄。
CPrintDialog::GetToPage 检索打印范围的结束页面。
CPrintDialog::PrintAll 确定是否打印文档的所有页面。
CPrintDialog::PrintCollate 确定是否请求了已整理的副本。
CPrintDialog::PrintRange 确定是否只打印指定范围的页面。
CPrintDialog::PrintSelection 确定是否只打印当前所选项。

CPageSetupDialog 类

封装由 Windows 公共 OLE"页面设置"对话框提供的服务以及对于设置和修改打印边距的额外支持。

cpp 复制代码
class CPageSetupDialog : public CCommonDialog
名称 描述
CPageSetupDialog::CreatePrinterDC 创建用于打印的设备上下文。
CPageSetupDialog::DoModal 显示对话框并允许用户进行选择。
CPageSetupDialog::GetDeviceName 返回打印机的设备名称。
CPageSetupDialog::GetDevMode 返回打印机的当前 DEVMODE。
CPageSetupDialog::GetDriverName 返回打印机使用的驱动程序。
CPageSetupDialog::GetMargins 返回打印机的当前边距设置。
CPageSetupDialog::GetPaperSize 返回打印机的纸张大小。
CPageSetupDialog::GetPortName 返回输出端口名称。
CPageSetupDialog::OnDrawPage 由框架调用以呈现打印的页面的屏幕图像。
CPageSetupDialog::PreDrawPage 在呈现打印的页面的屏幕图像之前由框架调用。

CFindReplaceDialog 类

允许在应用程序中实现标准字符串"查找/替换"对话框。

cpp 复制代码
class CFindReplaceDialog : public CCommonDialog
名称 描述
CFindReplaceDialog::Create 创建并显示 CFindReplaceDialog 对话框。
::CFindReplaceDialog::​​​​​​FindNext 调用此函数来确定用户是否要查找查找字符串的下一个匹配项。
CFindReplaceDialog::GetFindString 调用此函数来检索当前查找字符串。
CFindReplaceDialog::GetNotifier 调用此函数来检索已注册消息处理程序中的 FINDREPLACE 结构。
CFindReplaceDialog::GetReplaceString 调用此函数以检索当前替换字符串。
CFindReplaceDialog::IsTerminating 调用此函数来确定对话框是否正在终止。
CFindReplaceDialog::MatchCase 调用此函数来确定用户是否希望精确匹配查找字符串的大小写。
CFindReplaceDialog::MatchWholeWord 调用此函数来确定用户是否希望只匹配整个单词。
CFindReplaceDialog::ReplaceAll 调用此函数来确定用户是否希望替换所有出现的字符串。
CFindReplaceDialog::ReplaceCurrent 调用此函数来确定用户是否希望替换当前单词。
CFindReplaceDialog::SearchDown 调用此函数来确定用户是否希望搜索按向下的方向进行。
cpp 复制代码
	CFindReplaceDialog*  dlg;
	dlg = new CFindReplaceDialog();
	dlg->Create(TRUE, _T(""), _T(""), FR_DOWN, this);
	dlg->ShowWindow(SW_SHOW);
相关推荐
卡提西亚1 小时前
数据库笔记-4-SQL语言之DCL
数据库·笔记·sql
Radan小哥1 小时前
Docker学习笔记—day0010
笔记·学习·docker
im_AMBER1 小时前
Canvas架构手记 05 鼠标事件监听 | 原生事件封装 | ctx 结构化对象
前端·笔记·学习·架构
老神在在0011 小时前
Mybatis01
后端·学习·spring·java-ee·mybatis
Y***89081 小时前
Neo4j图数据库学习(二)——SpringBoot整合Neo4j
数据库·学习·neo4j
理人综艺好会2 小时前
MySQL学习之go-mysql
学习·mysql·golang
想要成为计算机高手2 小时前
π*0.6: 从实践中学习 -- 2025.11.17 -- Physical Intelligence (π) -- 未开源
人工智能·学习·机器人·多模态·具身智能·vla
黑客思维者2 小时前
LLM底层原理学习笔记:模型评估的基准测试体系与方法论
人工智能·笔记·神经网络·学习·模型评估·基准测试
andeyeluguo2 小时前
postman笔记
笔记