实现具有相似处理的多个对话框
Posted
技术标签:
【中文标题】实现具有相似处理的多个对话框【英文标题】:Implementing multiple dialogs with similar processing 【发布时间】:2013-10-25 13:23:07 【问题描述】:我们的 MFC 程序中有多个非常相似的对话框。这些对话框中的每一个都包含类似的控件(即,它们都包含名称、日期、地址等)。正因为如此,我们不得不多次为窗口编写显示代码,尽管这些控件的处理是相同的。我正在寻找有关如何更改我们的 gui 的建议,以便我只需在一个地方进行处理,而不必多次进行。 我的想法是有一个类来进行处理并将指针传递给控件以显示给该类,尽管我觉得这不是一个很好的 OO 设计。
想法?
【问题讨论】:
您的解决方案对我来说听起来不错。另一种可能性是只制作一个对话框并根据不同情况对其进行调整。 我曾考虑过这一点,但对话之间存在足够的差异,最终管理它们会更加努力。 【参考方案1】:创建一个从CDialog
派生的基类(比如CMyDlgBase
),将所有常用函数放在那里,并从CMyDlgBase
而不是CDialog
派生对话框类。
您现在可以调用CMyDlgBase
中的函数,就好像它们是直接在您的对话框类中声明的一样。
EDIT 示例代码,用于验证对话框共有的项目(CDlg1
和 CDlg2
派生自 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 可以不同,就好像基类函数被复制到每个类中 - 编辑答案以包含示例代码以验证对话框共有的项目。 好的,我按照你在那里所做的。我认为没有办法绕过参数列表。如果我从多个控件中获取/填充数据,那么我在基类中访问的每个控件都必须是传入的参数。你觉得指向控件的指针会更简化代码吗?以上是关于实现具有相似处理的多个对话框的主要内容,如果未能解决你的问题,请参考以下文章