在 CDialog 类型的子窗体之间传递数据
Posted
技术标签:
【中文标题】在 CDialog 类型的子窗体之间传递数据【英文标题】:Passing data between subforms of type CDialog 【发布时间】:2010-10-25 15:20:27 【问题描述】:我有一个 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)的焦点时执行。
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) ON_BN_CLICKED(IDOK, &CSubFormType::OnBnClickedOk) 在将数据输入 Box1a 后按 Enter 键时不会被调用。而是调用主对话框的 OnBnClickedOk 成员函数。
2) 当 CSubFormType::OnEnKillfocusBox1a 确实被执行时(通过鼠标单击其他地方),它能够将 Box1a 中输入的值回显到同一子表单 #1 上的 Box1b,但不会将值回显到子表单 #2 上的 Box2。
任何关于我需要做些什么来解决这些问题或实现相同通用功能的更好方法的任何指导都将不胜感激。
正在使用的主对话框的组合框选择成员函数:
void CMain::OnCbnSelchange() 整数选择;
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);
【问题讨论】:
【参考方案1】:当主组合框选择改变时同步所有表单。您尝试在文本框文本更改时立即执行此操作,但这不是必需的,因为只有一个表单可见。
【讨论】:
感谢您的评论。我将用于组合框选择的代码添加到原始帖子的末尾。是否需要做一些特别的事情来同步所有表单? 我不知道,这是你的要求。以上是关于在 CDialog 类型的子窗体之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章