MFC学习笔记(八):对话框

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

CDialog 类

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

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 以创建无模式对话框。

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

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

BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

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

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

CWnd::ShowWindow

设置窗口的可见性状态。

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 对象。

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 结构的指针,该结构用于自定义应用程序的文档视图体系结构。

// 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 对象。

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 窗口。

virtual BOOL DestroyWindow();

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

CWnd::PostNcDestroy

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

virtual void PostNcDestroy();

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


控件

添加控件

编辑控件

删除控件

选中控件,按delete键。

测试对话框


对话数据交换DDX和验证DDV

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

CDataExchange

对话框数据交换DDX

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

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

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

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

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


创建对话框项目


模态对话框

创建模态对话框

模态对话框消息循环

模态的终结

范例

新建项目

插入对话框

创建对话框

创建对话框的成员变量

变量类型应该是public

对话框初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值