我编了一个子对话框的程序,在主对话框中声明两个已经定义好的子对话框对象成员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为全局变量吗?

解决方案 »

  1.   

    你怎么定义两次Dialog2呢?而且不是主对话框得成员变量。
    可能是第二次你没有DoModul吧,第一次的已经析构了
      

  2.   

    这样当然不能得到你在主对话框中的定义的CDialog2 dlg2中的str的值, 因为你在主对话框中定义的dlg2和在类CDialog1实现文件中定义的那个CDialog2 dlg根本就是两个变量嘛! 
    你可以设法在CDialog1实现文件中得到在主对话框中声明的那个CDialog2 dlg2变量(比如你在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg),然后在CDialog1中的实现文件这样:
    CString str2 = m_pMainDlg->dlg2.str;
      

  3.   

    你在dlg1中定义的dlg变量与主对话框中定义的dlg2没有任何联系,所以你赋的值肯定不对。你可以在dlg1中获得主对话框的指针,再通过该指针调用dlg2变量的str值。
      

  4.   

    这样当然不能得到你在主对话框中的定义的CDialog2 dlg2中的str的值, 因为你在主对话框中定义的dlg2和在类CDialog1实现文件中定义的那个CDialog2 dlg根本就是两个变量嘛! 
    你可以设法在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);
      

  5.   

    请问怎么在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg?
    用GetParent()吗?可他的返回值是CWnd*啊?!而不是CDialog*。
      

  6.   

    CMyDialog1::CMyDialog1(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDialog1::IDD, pParent)
    {    ASSERT(pParent);

    //{{AFX_DATA_INIT(CMyDialog1)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    }运行发生ASSERT错误。
      

  7.   

    请问怎么在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg?---------------------------------
    你可以将m_pMainDlg作为参数传给CDialog1的构造函数。
    CDialog1::CDialog1(CMainDlg* m_pMainDlg)
    {
    ...
    }然后调用的时候 
    CMainDlg* m_pMainDlg;
    CDialog1 dlg(m_pMainDlg);
      

  8.   

    Maybe it is helpful to you.
    http://www.codeguru.com/system/SharedMemory.shtml