对话框有两种类型:模式和无模式。
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。 如果 bSaveAndValidate 为 TRUE,则非零返回值表示数据已成功验证。
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 对象并调用对话框类的 CDialog 的 DoDataExchange 成员函数的重写。 DoDataExchange 接受CDataExchange类型的参数。 CDataExchange传递给UpdateData表示交换上下文的对象,定义交换方向等信息。
当你(或代码向导)重写 DoDataExchange 时,可以指定对每个数据成员(控件)调用一个 DDX 函数。 每个 DDX 函数都了解如何基于由 CDataExchange 传递给 DoDataExchange 的 UpdateData 自变量提供的上下文双向交换数据。
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::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);



