急:帮忙解决从一个对话框中读取另一个对话框中的数据!

马鸣风萧萧 2003-03-02 12:00:05
我编了一个子对话框的程序,在主对话框中声明两个已经定义好的子对话框对象成员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为全局变量吗?
...全文
210 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leoparder 2003-03-02
  • 打赏
  • 举报
回复
这样当然不能得到你在主对话框中的定义的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);


rockyluo 2003-03-02
  • 打赏
  • 举报
回复
你在dlg1中定义的dlg变量与主对话框中定义的dlg2没有任何联系,所以你赋的值肯定不对。你可以在dlg1中获得主对话框的指针,再通过该指针调用dlg2变量的str值。
hdsunwind 2003-03-02
  • 打赏
  • 举报
回复
这样当然不能得到你在主对话框中的定义的CDialog2 dlg2中的str的值, 因为你在主对话框中定义的dlg2和在类CDialog1实现文件中定义的那个CDialog2 dlg根本就是两个变量嘛!
你可以设法在CDialog1实现文件中得到在主对话框中声明的那个CDialog2 dlg2变量(比如你在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg),然后在CDialog1中的实现文件这样:
CString str2 = m_pMainDlg->dlg2.str;
GoldenSword 2003-03-02
  • 打赏
  • 举报
回复
你怎么定义两次Dialog2呢?而且不是主对话框得成员变量。
可能是第二次你没有DoModul吧,第一次的已经析构了
approach 2003-03-02
  • 打赏
  • 举报
回复
Maybe it is helpful to you.
http://www.codeguru.com/system/SharedMemory.shtml
pentiwolf 2003-03-02
  • 打赏
  • 举报
回复
请问怎么在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg?

---------------------------------
你可以将m_pMainDlg作为参数传给CDialog1的构造函数。
CDialog1::CDialog1(CMainDlg* m_pMainDlg)
{
...
}

然后调用的时候
CMainDlg* m_pMainDlg;
CDialog1 dlg(m_pMainDlg);
马鸣风萧萧 2003-03-02
  • 打赏
  • 举报
回复
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错误。


马鸣风萧萧 2003-03-02
  • 打赏
  • 举报
回复
请问怎么在CDialog1的类中声明了一个指向主对话框的指针m_pMainDlg?
用GetParent()吗?可他的返回值是CWnd*啊?!而不是CDialog*。
马鸣风萧萧 2003-03-02
  • 打赏
  • 举报
回复
感谢各位高手的指点,我是第一次在专业网站上发帖子,没想到有这么多热心的朋友,真的非常激动!谢谢大家。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧