在CDialog类型的子表单之间传递数据

时间:2010-10-25 15:20:27

标签: visual-c++ mfc cdialog subforms

我有一个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的子类)的成员函数来实现这一点,该函数会在将焦点消除到数据输入编辑控件(即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

}

CSubFormType的消息映射意味着直接调用OnEnKillfocusBox1a:

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

}

1 个答案:

答案 0 :(得分:0)

更改主组合框选择时同步所有表单。您尝试在更改文本框文本时立即执行此操作,但这不是必需的,因为只有一个表单可见。