VC对话框上Tab控件的各子标签及其与主对话框之间的数据传递

假设主对话框已经初始化好了Tab控件(具体参考:MFC的TAB控件使用详细说明),主对话框CMainDlg成员变量m_tab, m_d1, m_d2,分别代表Tab控件,子标签1,子标签2。主对话框及各标签的编辑控件绑定一个变量m_data。

一、子标签调用主对话框的数据成员

方法:在子标签的处理函数OnClickedBtn1中,使用GetParent()->GetParent()得到主对话框的指针。注意包含主对话框头文件在源文件里,放在头文件中会报错。

二、子标签之间的数据传递

方法:使用主对话框进行桥接,在标签1中,GetParent()->GetParent()->m_d2.m_data。

三、子标签传递数据到主对话框

方法:在主对话框按钮的处理函数中插入代码:

m_d1.UpdateData(); 
m_d2.UpdateData(); 
m_data = m_d1.m_data + m_d2.m_data;
UpdateData(false);

然而,这种情况存在一个特殊情况:即模态主对话框点击OK按钮时将子标签传递数据到主对话框来返回。上面的代码是不适用的。主要是因为主对话框点击OK按钮时,其上的控件及各子标签对话框就会被销毁。UpdateData()的使用将会导致Debug Assertion Failed错误。但是,如果不使用UpdateData(),如下述代码。数据又不会更新。下述的例子是CTest对话框单击“测试”按钮弹出模态对话框CMainDlg(带Tab控件)。

void CTest::OnClickedBtnTest()
{
    // TODO: 在此添加控件通知处理程序代码
    CMainDlg d;
    //  d.m_d1.UpdateData();
    //  d.m_d2.UpdateData();  //会导致Debug Assertion Failed.
    if (d.DoModal() == IDOK)
    {
        int data = d.m_d1.m_data + d.m_d2.m_data;
    }
}
		
		

解决方法:正确的做法是在类向导中为CMainDlg添加OnOK虚函数,并添加如下代码:

void CMainDlg::OnOK()
{
	// TODO: 在此添加专用代码和/或调用基类
	m_d1.UpdateData();
	m_d2.UpdateData();   // 更新子标签的数据

	CDialogEx::OnOK();
}

这样能够使CMainDlg在调用其基类的OnOK()函数之前(也就是销毁之前)更新子标签的控件数据。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页