User interface 用相似的处理实现多个对话框
我们的MFC程序中有多个非常相似的对话框。每个对话框都包含类似的控件(即,它们都包含名称、日期、地址等)。因此,尽管这些控件的处理过程是相同的,但我们不得不多次为windows编写显示代码。我正在寻找关于如何更改GUI的建议,以便我只需在一个位置进行处理,而不必多次进行处理。User interface 用相似的处理实现多个对话框,user-interface,mfc,User Interface,Mfc,我们的MFC程序中有多个非常相似的对话框。每个对话框都包含类似的控件(即,它们都包含名称、日期、地址等)。因此,尽管这些控件的处理过程是相同的,但我们不得不多次为windows编写显示代码。我正在寻找关于如何更改GUI的建议,以便我只需在一个位置进行处理,而不必多次进行处理。 我的想法是有一个类来进行处理,并将指向控件的指针传递给该类来显示,尽管我觉得这不是一个很好的OO设计 想法?创建一个从CDialog派生的基类(比如CMyDlgBase),将所有常用函数放在那里,并从CMyDlgBase而
我的想法是有一个类来进行处理,并将指向控件的指针传递给该类来显示,尽管我觉得这不是一个很好的OO设计
想法?创建一个从
CDialog
派生的基类(比如CMyDlgBase
),将所有常用函数放在那里,并从CMyDlgBase
而不是CDialog
派生对话框类
现在可以调用CMyDlgBase
中的函数,就好像它们是直接在对话框类中声明的一样
编辑示例代码以验证对话框的公用项(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;
}
我觉得你的解决方案不错。另一种可能是只创建一个对话框,并根据不同的情况对其进行调整。我已经考虑过了,但对话框之间的差异足够大,最终需要更多的努力来管理它们。在这种情况下,我如何处理对控件的访问?我会在基类中创建所有公共控件吗?不,你会在每个对话框类中创建控件,基类可以通过resourceID或指向控件的指针访问控件。此解决方案是否依赖于在对话框中具有相同资源ID的公共控件?如果没有,你能给我一个你如何设想它被使用的例子吗?不,资源ID可以是不同的,就像基类函数被复制到每个类中一样--编辑答案以包含示例代码来验证对话框的公共项。好的,我按照你在那里做的。我认为没有办法绕过参数列表。如果我从多个控件中获取/填充数据,那么我在基类中访问的每个控件都必须是传入的参数。您是否觉得指向控件的指针会使代码简化一点?
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.
}