Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 用相似的处理实现多个对话框_User Interface_Mfc - Fatal编程技术网

User interface 用相似的处理实现多个对话框

User interface 用相似的处理实现多个对话框,user-interface,mfc,User Interface,Mfc,我们的MFC程序中有多个非常相似的对话框。每个对话框都包含类似的控件(即,它们都包含名称、日期、地址等)。因此,尽管这些控件的处理过程是相同的,但我们不得不多次为windows编写显示代码。我正在寻找关于如何更改GUI的建议,以便我只需在一个位置进行处理,而不必多次进行处理。 我的想法是有一个类来进行处理,并将指向控件的指针传递给该类来显示,尽管我觉得这不是一个很好的OO设计 想法?创建一个从CDialog派生的基类(比如CMyDlgBase),将所有常用函数放在那里,并从CMyDlgBase而

我们的MFC程序中有多个非常相似的对话框。每个对话框都包含类似的控件(即,它们都包含名称、日期、地址等)。因此,尽管这些控件的处理过程是相同的,但我们不得不多次为windows编写显示代码。我正在寻找关于如何更改GUI的建议,以便我只需在一个位置进行处理,而不必多次进行处理。
我的想法是有一个类来进行处理,并将指向控件的指针传递给该类来显示,尽管我觉得这不是一个很好的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.
}