0

MFC プログラムには、非常によく似た複数のダイアログがあります。これらの各ダイアログには、同様のコントロールが含まれています (つまり、すべて名前、日付、住所などが含まれています)。このため、これらのコントロールの処理は同じであるにもかかわらず、ウィンドウの表示コードを複数回コード化する必要がありました。guis を変更する方法についての提案を探しています。これにより、処理を 1 か所で行うだけで済み、複数回行う必要がなくなります。
私の考えでは、処理を行い、そのクラスに表示するコントロールへのポインターを渡すクラスを用意することでしたが、それはあまり良い OO 設計ではないと感じています。

考え?

4

1 に答える 1

1

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;
}

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.
}
于 2013-10-27T07:34:11.867 に答える