怎么样在两个类之间通信?

gison 2004-12-07 07:03:29
子对话框要访问父对话框的信息怎么样实现比较好呢?
我想通过类中的公有变量来实现,但却不行:
class CTimeSetDlg : public CDialog
{
.....
Public CString str; //定义公有变量
.....
}

void CTimeSetDlg::OnOK()
{
GetDlgItemText(ID_EDIT1,str);
}

然后在子对话框中
void CClildDlg::OnButton1()
{
CTimeSetDlg dlg;
MessageBox(dlg.str);
}

先点父窗口的OK按钮,然后点button1按钮 却总是显示出空字符,显示不出str的值。还请大虾帮助指导一下。先谢谢了。
...全文
260 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
_xiao 2004-12-07
  • 打赏
  • 举报
回复
/////////////////////////////////////////////
然后在子对话框中
void CClildDlg::OnButton1()
{
CTimeSetDlg dlg;
MessageBox(dlg.str); //这里的dlg是你上句刚建立的对象,并不是当前子对话框的父对话框,其str自然是空的了
}
////////////////////////////////////////////
换成:
CTimeSetDlg *dlg = (CTimeSetDlg *)GetParentOwner();
MessageBox(dlg->str);
handwolf 2004-12-07
  • 打赏
  • 举报
回复
我只是告诉你怎么用,不能把这个代码拷贝过去的,对话框当然还是你建了,但是两个对话框之间的联系用我给你思想。
明白了吗?


CParentDlg:public CDialog
{
//...
public:
CString str;
//...
};

子对话框类:
CClildDlg:public CDialog
{
//...
public:
CParentDlg * pParent;//point to the parent dialog
//...
afx_msg void OnButton1();
//...
};

//帮定消息



void CClildDlg::OnButton1()
{
MessageBox(pParent->str);
}


父对话框中有一个按纽,按下后,显示子对话框!代码如下

void CParentDlg ::OnButtonShowChildDlg()
{
CClildDlg dlg;
dlg.pParent = this;
dlg.Domodal();
}
gison 2004-12-07
  • 打赏
  • 举报
回复
handwolf(初学者) 我按你写的出现了错误:

--------------------Configuration: parent - Win32 Debug--------------------
Compiling...
parentDlg.cpp
Childlg.cpp
d:\software\study\parent\childlg.h(19) : error C2143: syntax error : missing ';' before '*' 19行是 这句 CParentDlg * pParent;
d:\software\study\parent\childlg.h(19) : error C2501: 'CParentDlg' : missing storage-class or type specifiers
d:\software\study\parent\childlg.h(19) : error C2501: 'pParent' : missing storage-class or type specifiers
D:\software\study\parent\Childlg.cpp(48) : error C2065: 'pParent' : undeclared identifier
D:\software\study\parent\Childlg.cpp(48) : error C2227: left of '->str' must point to class/struct/union
Generating Code...
Error executing cl.exe.

parent.exe - 5 error(s), 0 warning(s)
handwolf 2004-12-07
  • 打赏
  • 举报
回复
void CParentDlg ::OnButtonShowChildDlg()
{
CClildDlg dlg;
dlg.pParent = this;//把父对话框的句柄传给子对话框!
dlg.Domodal();
}

EnochShen 2004-12-07
  • 打赏
  • 举报
回复

CTimeSetDlg dlg;
MessageBox(dlg.str);
这样不行,CTimeSetDlg dlg;DLG只是个空值。
handwolf 2004-12-07
  • 打赏
  • 举报
回复
子对话框在父对话框中显示的时候,要把父对话框的句柄传给子对话框!
我给你举个例子:
父对话框类:
CParentDlg:public CDialog
{
//...
public:
CString str;
//...
}

子对话框类:
CClildDlg:public CDialog
{
//...
public:
CParentDlg * pParent;//point to the parent dialog
//...
afx_msg void OnButton1();
//...
}

//帮定消息



void CClildDlg::OnButton1()
{
MessageBox(pParent->str);
}


父对话框中有一个按纽,按下后,显示子对话框!代码如下

void CParentDlg ::OnButtonShowChildDlg()
{
CClildDlg dlg;
dlg.pParent = this;
dlg.Domodal();
}

gison 2004-12-07
  • 打赏
  • 举报
回复
str的值是通过EDIT BOX动态输入的。
KOBEBRYANT8 2004-12-07
  • 打赏
  • 举报
回复
str的值到底赋了没有啊?
构造函数CimeSetDlg()中
str = _T("");
改为:
str = _T("hh");//赋初值

gison 2004-12-07
  • 打赏
  • 举报
回复
handwolf(初学者) 可以说下应该怎么写么?最后给个例子啊
gison 2004-12-07
  • 打赏
  • 举报
回复
楼上的定制消息 可以说详细点么
handwolf 2004-12-07
  • 打赏
  • 举报
回复
void CClildDlg::OnButton1()
{
CTimeSetDlg dlg;
MessageBox(dlg.str);
}
???????????????????????????????????????????????????

我想,你是因为最基本的知识没有弄清楚,怎么可以这么写呢?
sunqinghui 2004-12-07
  • 打赏
  • 举报
回复
定制消息 通过定制的消息来进行
gison 2004-12-07
  • 打赏
  • 举报
回复
debug 后,str的值与在edit中输入的值是一致的,但是一到CClildDlg中再调试的话,str的值就是空了。找不出原因来。
scmsir 2004-12-07
  • 打赏
  • 举报
回复
建议楼主debug一下。
看看
void CTimeSetDlg::OnOK()
{
GetDlgItemText(ID_EDIT1,str);
}
执行之后str的值是多少。
EnochShen 2004-12-07
  • 打赏
  • 举报
回复
用全局变量好了

16,473

社区成员

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

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

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