我编了一个子对话框的程序,在主对话框中声明两个已经定义好的子对话框对象成员CDialog1 dlg1;CDialog2 dlg2; 然后自然是在主对话框的OnInitDialog()中生成两个子对话框,一个隐藏,一个显示。这些都很成功。然后我再dlg2中加入了一个CEdit控件,并在类CDialog2中声明了一个变量CString str,然后再CDialog2地实现文件中调用GetDlgItem(IDC_EDIT1)->GetWindowText(str),经测试,编辑控件的输入内容确实是输进了变量str中。
但当我在类CDialog1地实现文件中使用CDialog2的成员变量str的时候,采用以下方法:
CDialog2 dlg; CString str2=dlg.str;却无法得到str的值,请问这是为什么?该怎样才能在对话框2中得到对话框1的公有变量str的值呢?
难道非得在主对话框的App文件中声明str为全局变量吗?
但当我在类CDialog1地实现文件中使用CDialog2的成员变量str的时候,采用以下方法:
CDialog2 dlg; CString str2=dlg.str;却无法得到str的值,请问这是为什么?该怎样才能在对话框2中得到对话框1的公有变量str的值呢?
难道非得在主对话框的App文件中声明str为全局变量吗?
可能是第二次你没有DoModul吧,第一次的已经析构了
你可以设法在CDialog1实现文件中得到在主对话框中声明的那个CDialog2 dlg2变量(比如你在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg),然后在CDialog1中的实现文件这样:
CString str2 = m_pMainDlg->dlg2.str;
你可以设法在CDialog1实现文件中得到在主对话框中声明的那个CDialog2 dlg2变量(比如你在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg),然后在CDialog1中的实现文件这样:
CString str2 = m_pMainDlg->dlg2.str;如果你是在主程序中处理数据交换的话,以及Dialog1和Dialog2都为非摸态对话框上面说的对。
但要是在Dialog1中处理数据交换,或为模态对话框上面的办法就不行了。最好用消息发送的办法,那样无论什么情况都可以保证Dialog1获得Dialog2的数据.
如:定义消息WM_MYMESSAGE
在Dialog1中声明消息处理函数,影射消息afx_msg void OnMyMessage(WPARAM wParam,LPARAM lParam);OM_MESSAGE(WM_MYMESSAGE,OnMyMessage)void OnMyMessage(WPARAM wParam,LPARAM lParam)
{
CString *pStr = new CString;
pStr = (CString *)wParam;
//添加对此字符串的处理
}在对话框2中当需要通知对话框1时CMainDlg*pDlg = (CMainDlg*)AfxGetApp()->GetMainWnd();//CMainDlg为主程序的类CString str;
GetDlgItem(IDC_EDIT1)->GetWindowText(str);
WPARAM wParam;
wParam = (WPARAM)str;pDlg->dlg.PostMessage(WM_MYMESSAGE,wParam,0);
用GetParent()吗?可他的返回值是CWnd*啊?!而不是CDialog*。
: CDialog(CMyDialog1::IDD, pParent)
{ ASSERT(pParent);
//{{AFX_DATA_INIT(CMyDialog1)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}运行发生ASSERT错误。
你可以将m_pMainDlg作为参数传给CDialog1的构造函数。
CDialog1::CDialog1(CMainDlg* m_pMainDlg)
{
...
}然后调用的时候
CMainDlg* m_pMainDlg;
CDialog1 dlg(m_pMainDlg);
http://www.codeguru.com/system/SharedMemory.shtml