对话框A调用对话框B,对话框B调用了一个Socket C,C的OnRecieve函数用来接受数据,并要改变B中的控件的值,请问C该如何调用B中的控件?比如B中有一个ListBox:ID_USERLIST,现在我要操作ID_USERLIST,那么就必须先获得B,问题是我该如何获得对话框B?请高手指点,谢了!

解决方案 »

  1.   

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

  2.   

    在创建对话框B的时候返回这个全局的ghWnd,,,,,
      

  3.   

    本帖最后由 VisualEleven 于 2010-12-22 15:10:22 编辑
      

  4.   

    直接把其句柄传给C不行吗?你的C不是从CSocket继承的?
    反正是有了句柄,就什么都有了
      

  5.   


    "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();
    }
      

  6.   

    我认为你的程序设计是有问题的,C的职责只负责接收和发送数据,不应该加入刷新界面的功能,
    可以在B中调用C的函数接收返回值,然后B自己来刷新界面。
      

  7.   

    你可以修改C类,加上B类的指针即可,可以通过修改C的构造函数,将B的指针传递进入
      

  8.   

    你修改一下B的定义:
    B b;修改为B g_dlgB;
    同时在C的头文件定义中引用extern B g_dlgB,也#include "b.h"
    这样,在C的任何地方,你都可以调用g_dlgB.AnyFunction()了。
      

  9.   

    补充一下,B g_dlgB就是让你把对话框B声明成全局变量的意思。
    要在b.cpp的成员函数之外声明。
    不要在A::OnInitDialog()中声明    B b;
    声明之后,可以在A::OnInitDialog()中调用doModal().
    A::OnInitDialog()
    {
        。
        g_dlgB.doModal();
        。
    }