对话框A调用对话框B,对话框B调用了一个Socket C,C的OnRecieve函数用来接受数据,并要改变B中的控件的值,请问C该如何调用B中的控件?

heartgoon2010 2010-12-18 10:19:08
对话框A调用对话框B,对话框B调用了一个Socket C,C的OnRecieve函数用来接受数据,并要改变B中的控件的值,请问C该如何调用B中的控件?比如B中有一个ListBox:ID_USERLIST,现在我要操作ID_USERLIST,那么就必须先获得B,问题是我该如何获得对话框B?请高手指点,谢了!
...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dragon33tree 2010-12-22
  • 打赏
  • 举报
回复
补充一下,B g_dlgB就是让你把对话框B声明成全局变量的意思。
要在b.cpp的成员函数之外声明。
不要在A::OnInitDialog()中声明 B b;
声明之后,可以在A::OnInitDialog()中调用doModal().
A::OnInitDialog()
{
。。。。
g_dlgB.doModal();
。。。。
}
dragon33tree 2010-12-22
  • 打赏
  • 举报
回复
你修改一下B的定义:
B b;修改为B g_dlgB;
同时在C的头文件定义中引用extern B g_dlgB,也#include "b.h"
这样,在C的任何地方,你都可以调用g_dlgB.AnyFunction()了。
Eleven 2010-12-22
  • 打赏
  • 举报
回复
你可以修改C类,加上B类的指针即可,可以通过修改C的构造函数,将B的指针传递进入
架构师成长营 2010-12-22
  • 打赏
  • 举报
回复
我认为你的程序设计是有问题的,C的职责只负责接收和发送数据,不应该加入刷新界面的功能,
可以在B中调用C的函数接收返回值,然后B自己来刷新界面。
renxu350 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 heartgoon2010 的回复:]

那么问题就转化成我要在C::OnReceive(int nErrorCode)中使用b的句柄,
这个时候具体该怎们弄呢?请指点下,谢了!希望能具体点!
[/Quote]

"B的句柄"是对话框B的窗口句柄?

另外MFC,,,,,
我以为你说的是WIN32呢,

解决你这个问题的大致方法是这样的:

1.你先在你这段代码的文件中建立1个全局变量 HWND ghWndB;//用于保存对话框B的窗口句柄

2.在你的这个函数中这样
BOOL B::OnInitDialog()
{
ghWndB = m_hWnd;//保存对话框B的窗口句柄
}
这里有一个问题要注意,
如果你在程序运行期间关闭了对话框B的话,
那么对话框B的ghWndB以及m_hWnd就无效了,
你如果要再次获取对话框B的句柄,需要重复以上的工作

3.你的C是对话框还是SOCKET?你要考虑全局变量的问题
我不太熟悉MFC,
我只能使用WIN32的解决问题的方法帮你考虑这个问题,
你可以尝试调用WIN32的SendMessage()函数向对话框B发消息,
你接下来应该在下面的函数中向对话框B发消息,
anytype C::OnReceive(int nErrorCode)
{
SendMessage();//注意是WIN32函数
}
SendMessage()
第1个参数是ghWndB
关于SendMessage的使用你可以看一看MSDN的帮助

但是写到这里,我发现你这个MFC并不需要使用m_hWnd,
你应该这样使用,
你先打开对话框资源,
选择ID_USERLIST,
鼠标右击,选择 添加变量...
你把变量明填好以后,VS自动帮你生成一个成员变量,
然后到你的对话框头文件里面找一找,
假设名字叫 mlbUserList,
然后你这样使用,
anytype C::OnReceive(int nErrorCode)
{
//B b;注意b最好是全局的
b.mlbUserList.AddString();
}
renxu350 2010-12-19
  • 打赏
  • 举报
回复
在创建对话框B的时候返回这个全局的ghWnd,,,,,
renxu350 2010-12-19
  • 打赏
  • 举报
回复
你是不是要获得对话框B的hWnd ?
你可以将ghWnd定义成全局变量,
然后在创建对话框的时候返回这个全局的ghWnd,,,,,
大蓝头 2010-12-19
  • 打赏
  • 举报
回复
直接把其句柄传给C不行吗?你的C不是从CSocket继承的?
反正是有了句柄,就什么都有了
heartgoon2010 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 renxu350 的回复:]

你是不是要获得对话框B的hWnd ?
你可以将ghWnd定义成全局变量,
然后在创建对话框的时候返回这个全局的ghWnd,,,,,
[/Quote]

谢谢你!能不能说具体一点呢
比如程序是这样的:
A::OnInitDialog()
{
。。。。
B b;
b.doModal();
。。。。
}
B::OnInitDialog()
{
。。。。
c.Create(0,SOCK_DGRAM);// C c是对象b的成员变量
。。。。
}

C::OnReceive(int nErrorCode)
{
。。。。
}
那么问题就转化成我要在C::OnReceive(int nErrorCode)中使用b的句柄,
这个时候具体该怎们弄呢?请指点下,谢了!希望能具体点!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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