弹出窗口的数据传输: 如何获取弹出的CDialog中Edit的文本?

shadowWind 2004-12-22 07:11:16
结构是这样的:
主窗体是A,是一个Dialog
A上面嵌了B,是一个FormView
FormView的某个操作会弹出一个对话框C
B需要得到C中Edit控件里的字符串。

不通过A,怎么进行数据传输?
因为我想要把B和C做成一个独立的冬冬,以后可以移植到其他程序里面,比如Doc/View结构的程序。

谢谢!
...全文
186 点赞 收藏 20
写回复
20 条回复
shadowWind 2005年01月15日
最终解决方案。

B中:
CxxxDlg C;
if ( IDOK == C.DoModal() )
{
C.m_text;
}

C中:
OnOK() 函数

m_edit.GetWindowText(m_text);

谢谢各位,结贴
回复 点赞
linfeng1216 2004年12月24日
获取句柄,然后 WM_GETTEXT
回复 点赞
msm 2004年12月24日
给b和c加两个成员变量 CString strEdit;

然后
int nResponse = c.domodel();
if (nResponse == IDOK)
{
b.strEdit = c.strEdit
}
else
{
}
回复 点赞
Mr-Chen 2004年12月24日
先得到Edit句柄
GetDlgItem(IDC_EDIT3,&hwndEdit);
或者用FindWindowEx

然后
::SetWindowText(hwndEdit,s_Data);
回复 点赞
潜水8年再度回归 2004年12月23日
上面说的是模态对话框,非模态对话框不是这样的,因为非模态对话框是和父窗口同时运行的,典型的例子是记事本中的文件查找对话框。
在非模态对话框里,你可以这样做:
给C添加一成员函数比如SetText和GetText,给Edit控件添加一CEdit类型的变量,假定为m_edit;
void C::SetText(LPCTSTR szText)
{
if(this->GetSafeHwnd() != NULL) // 要先判断对话框是否已经被创建
{
m_edit.SetWindowText(szText);
}
}

CString C::GetText()
{
CString strText(_T("")); // 初始化为空串,也可以写成CString strText;
if(this->GetSafeHwnd() != NULL) // 同上
{
m_edit.GetWindowText(strText);
}
return strText;
}
回复 点赞
潜水8年再度回归 2004年12月23日
如果C是一个模态对话框,你不能在C还没有关闭时在B中对其操作,因为如果你是在B的事件处理函数中显示C,C美关闭之前,B将会处于挂起状态直到C关闭。这种情况有一个很好的例子供你借鉴,CFileDialog示例单代码如下:
CFileDiaolg fdlg(TRUE);
//调用DoModal时,程序将挂起在这一行直到文件对话框被关闭
if(fdlg.DoModal() == IDOK) // 如果点击了文件对话框上确定按钮
{
//这时对话框已经关闭,句柄已经失效,但是fdlg这个变量还存在
CString strFileName = fdlg.GetPathName();
}

// 如上,对于非模态对话框,你可以这样实现:
1.在类C中给文本框添加一变量,比如 m_strText;,类型自定,一般为CString
2.在类B中调用C时代码如下:
......
C c;
c.m_strText = "....";
c.DoModal();
CString c = c.m_strText;
当然这样有违封装原则,你可以将m_strText 设成私有并加上Get和Set方法:
CString C::GetText()
{return m_strText;} // 返回的是m_strText的拷贝
void C::SetText(LPCTSTR szText)
{
m_strText = szText;
}
回复 点赞
shadowWind 2004年12月23日
sdgzhk(网络流氓):
是的,我碰到的情况和你一样。

请问你最后怎么解决的?
回复 点赞
sdgzhk 2004年12月23日
在模式对话框情况下好像这样做是错的,我很早以前就想过这个问题,经过调试发现真的不可行,因为当你打开对话框时,前一个程序被挂起,但当你关闭对话框时,对话框的折构函数已经把内存释放了。你再从那找到你的文本框呢?
回复 点赞
rr12 2004年12月23日
对话框C作为B的成员啊,怎么就析构了?除非你把B也销毁了。

C弹出来后,点OK文本框的内容就传给m_text了,DDX.
回复 点赞
rr12 2004年12月23日
把C作为B的成员m_dlg,加一个与C的Edit控件对应的成员m_text,
这是C的成员。再:

CString C::GetText()
{
return m_text;
}

void B::OnButton1()
{
m_dlg.DoModal();
AfxMessageBox(m_dlg.GetText());
}
回复 点赞
oyljerry 2004年12月23日
模式对话框在按钮中处理
回复 点赞
HunterForPig 2004年12月22日
用SendMessage啊,把EDIT空间的内容放在SendMessage的参数中
传到指定的窗口,在窗口通过消息影射,保存SendMessage传来的数据!
回复 点赞
Kudeet 2004年12月22日
看你的B是怎么建立的,如果B是C的父窗口,GetParent(),如果不是,试试在建立的时候保存句柄
回复 点赞
oyljerry 2004年12月22日
PostMessage
回复 点赞
Hendy_So 2004年12月22日
B得到C:你是在B中创建C,当然能得到它的句柄或指针
C得到B:B是C的父窗口,GetParent()就可以得到。
回复 点赞
shadowWind 2004年12月22日
laiyiling(陌生人·钻研MS技术) ( )

能详细点吗?
看了半天,还是不明白。

另外,很疑惑怎么得到 B 的句柄
回复 点赞
Hendy_So 2004年12月22日
B是C的父窗口?B得到C的指针,GetDlgItem得到Edit的指针,然后写数据,取数据都可以。
回复 点赞
Kudeet 2004年12月22日
发消息,用消息来传递你需要的字符串
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=204227
回复 点赞
chqu18 2004年12月22日
FormView在弹出对话框C时,保存c的指针
这样你就可以通过FormView来获取C中的内容了
回复 点赞
xenke 2004年12月22日
不通过A又要独立,那你用一个全局变量吧(或者类)
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7900

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告