選択可能なサブフォーム ダイアログ ボックスを表示するためのセクションをメイン ダイアログ ボックスにしようとしている MS Visual C++ 2005 プロジェクトがあります。各サブフォームは同じサイズですが、レイアウトが異なります。選択は、コンボ ボックス コントロールを使用して実行されます。この機能を実装する最善の方法を探したところ、メイン ダイアログ内の子ダイアログを処理するために誰かが 1999 年に開発したこのクラスに出会いました。
http://www.codeproject.com/KB/dialog/childdlg.aspx
追加の変更により:
http://www.codeproject.com/KB/dialog/childdlg.aspx?msg=1287#xx1287xx
このコードは、さまざまなサブフォームを選択して表示するのに非常にうまく機能しますが、あるサブフォームから別のサブフォームにデータを渡すことができないようです。具体的には、各サブフォームはいくつかの編集コントロールで構成されています。ユーザーがサブフォーム #1 のエディット コントロールに値を入力できるようにし、この値がサブフォーム #2 のエディット コントロールまたは静的テキスト コントロールに反映されるようにしたいと考えています。
サブフォーム ダイアログ クラス (名前は CSubFormType で、CDialog のサブクラス) のメンバー関数を使用してこれを実装しようとしました。
void CSubFormType::OnEnKillfocusBox1a(){
p2WndControl = (CWnd*)(GetDlgItem(IDC_Box1a)); //Get pointer to the control dialog box for data entry
//Inserted here some specific code used to place data entered into IDC_Box1a into extern wchar_t outstr[32]
SetDlgItemText (IDC_Box1b, outstr); //Echo data entered in IDC_Box1a to IDC_Box1b on same Subform #1
SetDlgItemText (IDC_Box2, outstr);//Echo data entered in IDC_Box1a to IDC_Box2 on different subform, Subform #2
}
OnEnKillfocusBox1a を直接呼び出すための CSubFormType のメッセージ マップは次のとおりです。
ON_EN_KILLFOCUS(IDC_Box1a, &CSubFormType:: OnEnKillfocusBox1a)
または間接的に:
ON_BN_CLICKED(IDOK, &CSubFormType::OnBnClickedOk) // CSubFormType::OnBnClickedOk は OnEnKillfocusBox1a を呼び出します
私が抱えている問題は次のとおりです。
1) Box1a にデータを入力した後に Enter キーを押しても、ON_BN_CLICKED(IDOK, &CSubFormType::OnBnClickedOk) が呼び出されません。代わりに、メイン ダイアログ ボックスの OnBnClickedOk メンバー関数が呼び出されます。
2) CSubFormType::OnEnKillfocusBox1a が実行されると (別の場所でのマウス クリックによって)、Box1a に入力された値を同じサブフォーム #1 の Box1b にエコーできますが、サブフォーム #2 の Box2 には値をエコーしません。
これらの問題を解決するために何をする必要があるか、または同じ一般的な機能を実装するためのより良いアプローチについてのガイダンスをいただければ幸いです。
使用されているメイン ダイアログ ボックスのコンボ ボックス選択メンバー関数:
void CMain::OnCbnSelchange() { int 選択;
selection = ((CComboBox*)GetDlgItem(IDC_Select))->GetCurSel();
switch(selection)
{
case 0: // Select Subform 1
//Do nothing
break;
case 1: // Select Subform 2
SetDlgItemText (IDC_Box2, outstr); //Set Box2 text on Subform #2
break;
}
m_SubForms.ShowSubForm(selection);
}