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

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

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

谢谢!
...全文
265 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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);
  • 打赏
  • 举报
回复
上面说的是模态对话框,非模态对话框不是这样的,因为非模态对话框是和父窗口同时运行的,典型的例子是记事本中的文件查找对话框。
在非模态对话框里,你可以这样做:
给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;
}
  • 打赏
  • 举报
回复
如果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又要独立,那你用一个全局变量吧(或者类)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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