两个基于对话框的MFC程序,利用创建进程的方式实现调用,然而要实现在一个对话框上设置好的参数传输到另一个对话框上,并且使另一个对话框正常运行。这个通信应该怎么实现呢?具体的发送端怎么发送消息和接收端怎么接受这个消息的代码?WM_COPYDATA可以用么,还是要自定义消息。

解决方案 »

  1.   

    可以用共享内存,管道,文本,ini,这些方法都可以哈
      

  2.   

    获取窗口句柄,然后PostMessage等,另一个对话框响应对应的消息
      

  3.   

    剪贴板和用WM_COPYDATA都试过啦,但是只实现了传递一个编辑框的数据,我想实现的是,同时实现多个(大约10个)编辑框的数据参数同时传递到接收端对应意义的编辑框当中,请问怎么实现呢
      

  4.   

    剪贴板和用WM_COPYDATA都试过啦,但是只实现了传递一个编辑框的数据,我想实现的是,同时实现多个(大约10个)编辑框的数据参数同时传递到接收端对应意义的编辑框当中,请问怎么实现呢 
      

  5.   

    举个例:ini的方法
    [editcnt]
    cnt = 10
    [readvalue]//标注是否被取走过了,
    [edit-1]
    value=......
    [edit-1]
    value=......
    ..
    这样规律的存放读取数据就可以了。
      

  6.   

    WM_COPYDATA 或内存共享都可实现。至于传多少数据由你自己来定。
      

  7.   

    传递一个编辑框数据和传递多个编辑框数据有区别么?
    最不济的做法也就把这段代码多复制几次罢了。
    //发送..
    for(int i=0;i<10;i++)
    {
        CString s=第i个编辑框的内容;
        COPYDATASTRUCT  cpd;
        cpd.dwData=i;//标记这个是第几个编辑框
        cpd.cbData=(s.GetLength()+1)*sizeof(TCHAR);
        cpd.lpData=(void*)s.GetString();
        SendMessage(....);
    }//接收:
     BOOL xxDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
     {
         CString s=(TCHAR*)(pCopyDataStruct->lpData);//获取字符串内容
         int i=pCopyDataStruct->dwData;//获取这个是第几个编辑框的内容
         这里就更新第i个编辑框的内容....
         return CDialog::OnCopyData(pWnd, pCopyDataStruct);
      }
    //大致就这样了.
      

  8.   

    我指的是几个有特定ID的编辑框,该怎么循环呢?我不懂ID怎么遍历呢
      

  9.   


    没有遍历的条件,就不能创造遍历的条件?
    首先你得明白,控件的ID到底是什么? 
    实际上,在MFC里面,id就是一个数字!一个 int 的数字! 
    你打开工程下面的 Resource.h 看看就知道了.所以,你只需要定义一个int的数组,就可以遍历了!
    至于设置/获取文本,只需要用 GetWindowsText / SetWindowsText 即可.int idlst[]={IDC_EDIT1,IDC_EDIT2,IDC_EDIT3};//你需要遍历多少个,就写多少个,只要是正确的控件ID即可..
    for(int i=0;i<sizeof(idlst)/sizeof(int);i++)
    {
        //这里直接用 idlst[i] 作为 控件ID 即可.
       CString str;
       CWnd *p=GetDlgItem(idlst[i]);// 获取这个id的对象.
       p->GetWindowsText(str);// 这样,str就得到了输入框的值.
       str="xxxxx";
       p->SetWindowsText(str);// 这样, 输入框的值就变成  "xxxxx"
    }
    //大致思路就这样了.
      

  10.   

    抱歉,上面写错了,应该是 GetWindowText / SetWindowText .
    "Window" 后面没有s的.
      

  11.   

    多谢你的思路,但是我实现的时候传到另一个进程的数据全部是数组中最后一个ID对应的数据,这该怎么解决 呢?能否加一个缓存的buffer用于暂时存储这些数据呢?
      

  12.   

    发送端:
    void CPXIDlg::OnBtnSend() 
    {
    // TODO: Add your control notification handler code here
        int idlst[]={IDC_MOTU_TYPE_COMBO,IDC_FILTER_TYPE_COMBO,IDC_COMBO_PRB,IDC_SAMPLE_RATE_COMBO,IDC_ROLLOFF_COMBO};
        for (int i=0;i<sizeof(idlst)/sizeof(int);i++) 
    {
      CString szCopydata;  szCopydata.Empty();
       CWnd *p=GetDlgItem(idlst[i]);
    p->GetWindowText(szCopydata);

    //fill the COPYDATASTRUCT
    COPYDATASTRUCT cpdst;
    cpdst.dwData = NULL;
      cpdst.cbData = szCopydata.GetLength();
      cpdst.lpData = (void *)szCopydata.GetBuffer(cpdst.cbData);

    if(szCopydata.IsEmpty())
    {
    CWnd::MessageBox("Please input sth");
    return;
    }

    CWnd * pWnd = CWnd::FindWindow(NULL,"Custom Digital Modulation");
    if(pWnd == NULL)
    {
    CWnd::MessageBox("Unable to find the RecieveMsg");
    return;
    }

    pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpdst);
    }
    }
    接收端:
    BOOL CCustomDigitalModulation::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
    // TODO: Add your message handler code here and/or call default
    int idlsts[]={IDC_COMBO_MODULATION,IDC_COMBO_FILTER,IDC_DataSource,IDC_EDIT_OVERSAMPLING,IDC_XISHU1};
    for (int i=0;i<sizeof(idlsts)/sizeof(int);i++)
    { CString szRecvCopydata;
    szRecvCopydata.Empty();
    szRecvCopydata = (LPSTR)pCopyDataStruct->lpData;
    szRecvCopydata = szRecvCopydata.Left(pCopyDataStruct->cbData);

    CWnd::SetDlgItemText(idlsts[i],szRecvCopydata);
    }
    return CDialog::OnCopyData(pWnd, pCopyDataStruct);
    }
      

  13.   


    话说,以后的代码,记得用代码标签包括起来(像我下面那样),不然别人很难看的.简单看了一下,你的代码有一个问题.(详细的我没去调试过)
    那就是, 你的 SendMessage 是在 for 里面进行的, 但是你接收处理的时候,for ... 这算什么?
    简单来说, 既然你每一次Send只会发送一个文本框的内容,你处理的时候也应该每次只处理一个文本框的内容.简单改了一下吧,未测试过,纯参考:void CPXIDlg::OnBtnSend() 
    {
        // TODO: Add your control notification handler code here
        int idlst[]={IDC_MOTU_TYPE_COMBO,IDC_FILTER_TYPE_COMBO,IDC_COMBO_PRB,IDC_SAMPLE_RATE_COMBO,IDC_ROLLOFF_COMBO};
        for (int i=0;i<sizeof(idlst)/sizeof(int);i++) 
        {
      CString szCopydata;
       CWnd *p=GetDlgItem(idlst[i]);
            p->GetWindowText(szCopydata);//其实严格来说,这里要判断 p!=NULL 的.        //fill the COPYDATASTRUCT
            COPYDATASTRUCT cpdst;
            cpdst.dwData = i;// 这里不要设置为NULL,因为接收方要知道你这个是哪一个文本框...
      cpdst.cbData = szCopydata.GetLength();
      cpdst.lpData = (void *)szCopydata.GetBuffer(cpdst.cbData);        if(szCopydata.IsEmpty())
            {
                CWnd::MessageBox("Please input sth");
                return;//纯建议:这里不妨用 continue ...
            }//if        CWnd * pWnd = CWnd::FindWindow(NULL,"Custom Digital Modulation");
            if(pWnd == NULL)
            {
                CWnd::MessageBox("Unable to find the RecieveMsg");
                return;
            }//if        pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpdst);
                //注意了,这个send是在for里面的,不是在外面.
                //在里面和在外面,代码里面就一个 } 的位置,但实际上是天和地的区别...
        }//for
    }//function()//接收端:
    BOOL CCustomDigitalModulation::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
    // TODO: Add your message handler code here and/or call default
        int idlsts[]={IDC_COMBO_MODULATION,IDC_COMBO_FILTER,IDC_DataSource,IDC_EDIT_OVERSAMPLING,IDC_XISHU1};
        //这里就不要用for了,因为你每次只是 Send 了一个编辑框的数据过来...
        //for (int i=0;i<sizeof(idlsts)/sizeof(int);i++)
        {
            CString szRecvCopydata;
            szRecvCopydata.Empty();
            szRecvCopydata = (LPSTR)pCopyDataStruct->lpData;
            szRecvCopydata = szRecvCopydata.Left(pCopyDataStruct->cbData);        //===== here =========
            int i=(int)pCopyDataStruct->dwData;//获取编辑框的index 
            CWnd::SetDlgItemText(idlsts[i],szRecvCopydata);
        }
        return CDialog::OnCopyData(pWnd, pCopyDataStruct);
    }
      

  14.   

    Quote: 引用 14 楼 firendlys 的回复:

    多谢您的耐心讲解,更感谢您的建议!问题已解决。