在程序里做了两个窗口IDD_DIALOG1和IDD_DIALOG2,并分别为该两窗口新建了不同的类!
    其中IDD_DIALOG1做为程序运行时的起动验证界面,在IDD_DIALOG1中我放了一个IDC_IPADDRESS1让用户填写登录到远方的服务器的IP地址,点击确定后进入IDD_DIALOG2,在IDD_DIALOG2所对应的类中我要用到IDD_DIALOG1中IDC_IPADDRESS1控件上用户所输入的值,想了很久都不知道怎么实现!希望大家帮忙!

解决方案 »

  1.   

    方法很多!
    比如修改IDD_DIALOG2对应类的构造函数,然后在构造的时候把在IDD_DIALOG1类中得到
    的值传进去!
      

  2.   

    上面两楼的实现都是为了实现而实现的。
    其实,这个问题实现的方法很多。但考虑到设计问题我推荐一个方式:多个界面都需要的数据必然有其全局性。但绝对不能象一楼说的,简单设置成全局变量。
    这里可以明显看出来,你没有设计你的逻辑结构。没有建立整体的数据结构。
    其实你应该有一个全局的数据结构来支持你的逻辑实现。
    而你所说的数据,只不过是全局数据结构的一部分而已。具体的过程是:验证界面关闭后,从验证界面中把对应的数据取出来。然后放到全局数据中。在DoModal第二个对话框之前,把这个数据设置到第二个对话框中。注意:绝对不允许在对话框中修改全局数据。这样流程上会混乱。
      

  3.   

    不论模态还是非模态对话框,默认情况下点确定对话框成员都不会销毁的,就是说这个成员还在,你要用它的成员变量直接用就好了。例如CDlg1 dlg;
    if(dlg.DoModal()==IDOK)
    {
         UINT nIPAddress=dlg.m_nIPAddress
    }
      

  4.   

    对不起大家,我对MFC的全局变量理解有些混乱,MFC是基于类的,那么如何设计一个全部变量,又在那个类的那个文件(.H / .CPP)设置全局变量,一个全局变量是对每个类对像都可见的吗?
      

  5.   

    http://m2.tech.topzj.com/thread-5950-1-1.html
    可以用sendmessage和copydata来实现不同窗口之间的通信
      

  6.   

    zhb1190() ( ) 信誉:100    Blog   加为好友  2007-04-10 12:43:01  得分: 0  
     
     
       http://m2.tech.topzj.com/thread-5950-1-1.html
    可以用sendmessage和copydata来实现不同窗口之间的通信
      
     
    ---------------------
    人家是同一个程序的窗口间,这么做也太小题大作了吧
      

  7.   

    在确定的响应函数中添加
    C2.m_ip=m_ip;//m_ip分别在两个类中都定义
      

  8.   

    对不起大家,我对MFC的全局变量理解有些混乱,MFC是基于类的,那么如何设计一个全部变量,又在那个类的那个文件(.H / .CPP)设置全局变量,一个全局变量是对每个类对像都可见的吗?
    //----------------
    前面有朋友说可以用全局变量,可是我还是不知道怎么用啊!大家帮帮忙,这个问题难道就这么难吗?Delphi里面实现可是非常简单啊!
      

  9.   

    感谢:fancyxing(凡鱼) ( ) ,你的建议很好。.......................... zhejiang9(人づ龙) ( ) 信誉:100    Blog   加为好友  2007-4-10 8:05:21  得分: 0  
     
    方法很多!
    比如修改IDD_DIALOG2对应类的构造函数,然后在构造的时候把在IDD_DIALOG1类中得到
    的值传进去!你说了半天到最后又回到我的问题上来了,我就是想知道怎么样才能传进去啊!.........................不过,我感觉其实我只想取IDD_DIALOG1类中的一个值,感觉一两个语句应该就可以了吧,没想到这么难,比方说可不可以先获得IDD_DIALOG1窗口句柄,然后再用类似:GetGlgItemText()函数从控件上获取值.大家给点建设,我想其实这应该是经常用到的嘛,大家平常是怎么处理这个传值的问题的呢!
      
     
      

  10.   

    记得要UpdateData(TRUE)和UpdateData(FALSE)
      

  11.   

    if(dlg2.Domodal()==IDOK)
    {
        ipaddress 类型的一个变量。
        dlg2.GetDlgItemText(IDC_ipaddress1,变量);
    }
    这样的话,那个变量就是你要的值.
    另外 :dlg2是IDD_DIALGO2的类变量。
      

  12.   

    如果是进行正式的程序设计的话,建议还是用我说的方法。但如果仅仅是做个练习的话就没必要那么复杂了。方法一:全局变量。这个稍微有点复杂,比如说,在stdafx.h和stdafx.cpp中定义一个int g_nFlag。    stdafx.h中的代码
        extern "C" int g_nFlag;    stdafx.cpp中的代码
        int g_nFlag = 0;然后,这个g_nFlag就可以在任何地方使用了。其它地方定义也成,但在MFC中,stdAfx.h文件是任何一个.cpp文件都必须包含的。
    方法二:直接从对话框中取。步骤如下:
        1、给IDD_DIALGO1的IDC_IPADDRESS1加一个变量,比如说是m_uIPAddress.
        2、给IDD_DIALOG1的IDOK事件添加一个函数。
           OnOK()
           {
               UpdateData(TRUE);
           }
        3、给IDD_DIALOG2也添加一个变量m_uIPAddress(最好与IDD_DIALOG1中的同名)
           主程序代码可以这么写
           CDlg1 dlg1;
           if (dlg1.DoModal() != IDOK)
           {
               return; // 不愿意验证的话,当然是返回了。
           }       CDlg2 dlg2;
           dlg2.m_uIPAddress = dlg1.m_uIPAddress;
        
         这样就可以了。
      

  13.   

    在IDD_DIALOG1中:
         CStirng IPaddr;//这个变量要在头文件里定义为全局变量
    即:
    public:
         CString IPaddr;
    在程序里写:
         GetDlgItemText(IDC_IPADDRESS1,IPaddr);
    在IDD_DIALOG2中:
         首先在程序的顶部包含IDD_DIALOG1的头文件,然后你可以传值了。比如你想把IDD_DIALOG1中的IPaddr传到IDD_DIALOG2中的变量Str,你可以这样写:
         IDD_DIALOG1的类名 dlg;     
         CString Str;
         Str=dlg.IPaddr;
    这样就可以了。
      

  14.   

    对话框工程的话在C*App类中添加数据成员就可以了,其他对话框通过工程中的全局对象C*App theApp对象来使用你添加的变量。