我建立了基于对话框的应用程序CMyDlg,由CMyDlg调出无模式对话框C1Dlg,由C1Dlg调出无模式对话框C2Dlg,现在我想在C2Dlg中获取C1Dlg的指针,以便能够在C2Dlg中访问到C1Dlg中的数据。请教各位高手,我该怎么做呢?

解决方案 »

  1.   

    可以在C2Dlg中定义一个函数,来接收一个方法,如:
    C2Dlg::SetThinkData(**** & x);//这里的SetThinkData就是用来C1Dlg的有效信息的,****为定义的有效类型也可以是一个结构,这样在C2Dlg中解析就可以了。
      

  2.   

    谢谢楼上的帮助,能不能像模式对话框那样,获取对话框指针,然后访问C1Dlg中的数据呢?
      

  3.   

    这些无模式对话框,从设计上来说,应该是从属于主对话框,它们应该由主对话框来管理,彼此之间还是不要知道为好。如果一定要知道的话,可以修改它们的构造函数,让这些无模式对话框在构造时就记住它们的“老大”是CMyDlg的一个对象,而这个对话框“老大”当然知道它的两个“小弟”并可以提供像getXXDlg之类的方法。这样在C1Dlg里可以先得到“老大”,再通过“老大”得到C2Dlg
    更好的做法是,由“老大”来做两者之间的协作。例如,在1里,一个文本框输入一个字符串,显示在2里,可以这样写:
    老大:
    CMyDlg
    {
    void display(CString &str);
    //在这个函数里,老大调用2里的函数,让2显示str
    };
    C1Dlg
    {
    private:
    CMyDlg & boss;
    public:
    C1Dlg(CMyDlg & boss, ...);
    //在构造函数里,把老大记住
    };
    C2Dlg
    {
    };
    假设1里有个按钮,把文本框里的东西在2里输出,那么可以在这个按钮的消息处理函数里写:
    boss.display(str);
    这样两个对话框之间就不必相互知道,更好的是,它避免了硬编码,可以让两个小弟独立设计而不相干涉。
      

  4.   

    使用方法传递吧:
    struct ValueStruct
    {
    int iValue1;
    int iValue2;
    int iValue3;
    };
    CDialog2::SetValue(ValueStruct& valuestruct)
    {
    m_i1 = valuestruct.iValue1;
    }
    //当点击按钮时,调用SetValue()
      

  5.   

    最简单的方法:
    设置一个全局变量不就可以了。
    像theApp那样,哪都能用!
      

  6.   

    谢谢各位的帮助,已经解决了,用FindWindow函数就可以获取无模式对话框的窗体指针。
      

  7.   

    HWND hwnd = FindWindow(NULL,"我的窗口");
    if( hwnd )
    {
      CWnd* pWnd = CWnd::FromHandle(hwnd);
      ASSERT( pWnd != NULL );
      ....
    }