实现具有相似处理的多个对话框

Posted

技术标签:

【中文标题】实现具有相似处理的多个对话框【英文标题】:Implementing multiple dialogs with similar processing 【发布时间】:2013-10-25 13:23:07 【问题描述】:

我们的 MFC 程序中有多个非常相似的对话框。这些对话框中的每一个都包含类似的控件(即,它们都包含名称、日期、地址等)。正因为如此,我们不得不多次为窗口编写显示代码,尽管这些控件的处理是相同的。我正在寻找有关如何更改我们的 gui 的建议,以便我只需在一个地方进行处理,而不必多次进行。 我的想法是有一个类来进行处理并将指针传递给控件以显示给该类,尽管我觉得这不是一个很好的 OO 设计。

想法?

【问题讨论】:

您的解决方案对我来说听起来不错。另一种可能性是只制作一个对话框并根据不同情况对其进行调整。 我曾考虑过这一点,但对话之间存在足够的差异,最终管理它们会更加努力。 【参考方案1】:

创建一个从CDialog 派生的基类(比如CMyDlgBase),将所有常用函数放在那里,并从CMyDlgBase 而不是CDialog 派生对话框类。

您现在可以调用CMyDlgBase 中的函数,就好像它们是直接在您的对话框类中声明的一样。

EDIT 示例代码,用于验证对话框共有的项目(CDlg1CDlg2 派生自 CMyDlgBase),不包括错误检查代码:

BOOL CMyDlgBase::ValidateName(UINT nID)
   CString ss;
    CEdit *pEdit = GetDlgItem(nID);
    pEdit->GetWindowText(ss);
    if (ss.Find(_T("A")) < 0) // some kind of validation
       MessageBox(_T("Name should contain the character 'A'"));
        pEdit->SetFocus();
        return FALSE;
    
    return TRUE;


CDlg1::OnOK()
    if (!ValidateName(IDC_DLG1_NAME)) // resource id value = 101
         return;
     CDialog::OnOK(); // This will close the dialog and DoModal will return.


CDlg2::OnOK()
    if (!ValidateName(IDC_DLG2_NAME)) // resource id value = 102
         return;
     CDialog::OnOK(); // This will close the dialog and DoModal will return.

【讨论】:

在这种情况下如何处理对控件的访问?我会在基类中创建所有通用控件吗? 不,您将在每个对话框类中创建控件,基类可以通过 resourceID 或通过指向控件的指针访问控件。 此解决方案是否依赖于在对话框中具有相同资源 ID 的通用控件?如果没有,你能举个例子说明你是如何使用它的吗? 不,资源 ID 可以不同,就好像基类函数被复制到每个类中 - 编辑答案以包含示例代码以验证对话框共有的项目。 好的,我按照你在那里所做的。我认为没有办法绕过参数列表。如果我从多个控件中获取/填充数据,那么我在基类中访问的每个控件都必须是传入的参数。你觉得指向控件的指针会更简化代码吗?

以上是关于实现具有相似处理的多个对话框的主要内容,如果未能解决你的问题,请参考以下文章

删除具有层级关系的多个对话主题

Vuex动作和对话窗口

结对项目

十万火急:VC中,能不能集中处理多个按钮(控件)的事件?

双击CAD对象(具有扩展数据),显示自定义对话框实现方法

急!MFC中给一个对话框的不同编辑框关联变量后如何获得多个不同变量的值进行计算处理?????