对话框A调用对话框B,对话框B调用了一个Socket C,C的OnRecieve函数用来接受数据,并要改变B中的控件的值,请问C该如何调用B中的控件? 对话框A调用对话框B,对话框B调用了一个Socket C,C的OnRecieve函数用来接受数据,并要改变B中的控件的值,请问C该如何调用B中的控件?比如B中有一个ListBox:ID_USERLIST,现在我要操作ID_USERLIST,那么就必须先获得B,问题是我该如何获得对话框B?请高手指点,谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是不是要获得对话框B的hWnd ?你可以将ghWnd定义成全局变量,然后在创建对话框的时候返回这个全局的ghWnd,,,,, 在创建对话框B的时候返回这个全局的ghWnd,,,,, 本帖最后由 VisualEleven 于 2010-12-22 15:10:22 编辑 直接把其句柄传给C不行吗?你的C不是从CSocket继承的?反正是有了句柄,就什么都有了 "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();} 我认为你的程序设计是有问题的,C的职责只负责接收和发送数据,不应该加入刷新界面的功能,可以在B中调用C的函数接收返回值,然后B自己来刷新界面。 你可以修改C类,加上B类的指针即可,可以通过修改C的构造函数,将B的指针传递进入 你修改一下B的定义:B b;修改为B g_dlgB;同时在C的头文件定义中引用extern B g_dlgB,也#include "b.h"这样,在C的任何地方,你都可以调用g_dlgB.AnyFunction()了。 补充一下,B g_dlgB就是让你把对话框B声明成全局变量的意思。要在b.cpp的成员函数之外声明。不要在A::OnInitDialog()中声明 B b;声明之后,可以在A::OnInitDialog()中调用doModal().A::OnInitDialog(){ 。 g_dlgB.doModal(); 。} 周立功USBCAN测试软件的波特率寄存器设置? 怎样决定重画的顺序,高手请入 界面问题 请教一个服务问题,我叫钟平生 一个创建线程的问题,100分求助。 简单问题,怎么把一个字符串中的"字符替换成^" WDM内存使用问题 这个地方时应该返回一个引用还是返回一个实际的对象? 关于服务程序的两个疑问 帮帮菜鸟:能给出一个用ADO的实例吗?或者大概介绍一下 注册网络读取事件失败 vc图像热区
你可以将ghWnd定义成全局变量,
然后在创建对话框的时候返回这个全局的ghWnd,,,,,
反正是有了句柄,就什么都有了
"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();
}
可以在B中调用C的函数接收返回值,然后B自己来刷新界面。
B b;修改为B g_dlgB;
同时在C的头文件定义中引用extern B g_dlgB,也#include "b.h"
这样,在C的任何地方,你都可以调用g_dlgB.AnyFunction()了。
要在b.cpp的成员函数之外声明。
不要在A::OnInitDialog()中声明 B b;
声明之后,可以在A::OnInitDialog()中调用doModal().
A::OnInitDialog()
{
。
g_dlgB.doModal();
。
}