我有一个 MS Visual C++ 2005 项目,我试图在其中创建一个主对话框,其中包含一个专门用于显示可选子窗体对话框的部分。每个子表单的大小相同,但布局不同。使用组合框控件执行选择。我搜索了实现此功能的最佳方法,并遇到了这个类,该类是有人在 1999 年开发的,用于处理主对话框中的子对话框:
http://www.codeproject.com/KB/dialog/childdlg.aspx
附加修改:
http://www.codeproject.com/KB/dialog/childdlg.aspx?msg=1287#xx1287xx
该代码非常适合选择和显示各种子表单,但我似乎无法将数据从一个子表单传递到另一个子表单。具体来说,每个子表单都由几个编辑控件组成。我希望用户能够在 Subform #1 上的编辑控件中输入一个值,并在 Subform #2 上的编辑控件或静态文本控件中回显该值。
我尝试通过使用子窗体对话框类(名为 CSubFormType 和 CDialog 的子类)的成员函数来实现这一点,该函数将在取消对数据输入编辑控件(即 Box1a)的焦点时执行。
无效 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) ON_BN_CLICKED(IDOK, &CSubFormType::OnBnClickedOk) 在将数据输入 Box1a 后按 Enter 键时不会被调用。而是调用主对话框的 OnBnClickedOk 成员函数。
2) 当 CSubFormType::OnEnKillfocusBox1a 确实被执行时(通过鼠标单击其他地方),它能够将 Box1a 中输入的值回显到同一子表单 #1 上的 Box1b,但不会将值回显到子表单 #2 上的 Box2。
任何关于我需要做什么来解决这些问题或实现相同通用功能的更好方法的任何指导都将不胜感激。
正在使用的主对话框的组合框选择成员函数:
void CMain::OnCbnSelchange() { int selection;
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);
}