父子对话框均有一个Edit控件和一个按钮,点击父对话框按钮显示子对话框,更改子对话框Edit控件的值后按按钮,使得子对话框中的值在父对话框中的Edit控件中显示。父对话框的Edit控件ID为IDC_EDIT1,子对话框的Edit控件ID为IDC_EDIT2。
子对话框的按钮按下后的代码如下:
void Dlg1::OnOK() 
{
GetDlgItemText(IDC_EDIT2,string1);
::SendMessage(::GetParent(this->m_hWnd),WM_COPYDATA,0,0);
}父对话框接收消息的代码如下:
BOOL CCopyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
AfxMessageBox("get message",MB_OK,0);
Dlg1 dlg1; //Dlg1是子对话框的类名
CString string2; 
string2 = dlg1.string1; //string1在子对话框类中已定义为public
SetDlgItemText(IDC_EDIT1,string2); return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}经运行发现,消息已经被相应,但是字符串变量却没有被传递过来。请大家帮忙给看一下问题出在什么地方,谢谢!
P.S. 也试过在子对话框的OnOK()里传递字符串变量,结果也是一样无法传过来。

解决方案 »

  1.   

    你咋又新建了Dlg1对象?
    传递的时候把值作为参数传进去
    应该是利用COPYDATASTRUCT吧,
      

  2.   

    这样的事,就不需要用消息来传递了
    Dlg1 dlg(this);
    if (dlg.DoModal() == IDOK)
    {
      GetDlgItem(IDC_XXX)->SetWindowText(dlg.m_edit);
    }
      

  3.   

    你看下MSDN上WM_COPYDATA的例子#define MYDISPLAY 1
    typedef struct tagMYREC
    {
       char  s1[80];
       char  s2[80];
       DWORD n;
    } MYREC;
    COPYDATASTRUCT MyCDS;
    MYREC MyRec;
    HRESULT hResult;
    BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );
    // ************ Code fragment ****************
    // Get data from user. InfoDlgProc stores the information in MyRec.
    //
       DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc );
    //
    // Copy data into structure to be passed via WM_COPYDATA.
    // Also, we assume that truncation of the data is acceptable.
    //
       hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName );
       if (hResult != S_OK)
        return False;
       hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName );
       if (hResult != S_OK)
        return False;
       MyRec.n = nAge;
    //
    // Fill the COPYDATA structure
    // 
       MyCDS.dwData = MYPRINT;          // function identifier
       MyCDS.cbData = sizeof( MyRec );  // size of data
       MyCDS.lpData = &MyRec;           // data structure
    //
    // Call function, passing data in &MyCDS
    //
       hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
       if( hwDispatch != NULL )
          SendMessage( hwDispatch,
                       WM_COPYDATA,
                       (WPARAM)(HWND) hWnd,
                       (LPARAM) (LPVOID) &MyCDS );
       else
          MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );
    //接收
    #define MYDISPLAY 1
    typedef struct tagMYREC
    {
       char  s1[80];
       char  s2[80];
       DWORD n;
    } MYREC;
    PCOPYDATASTRUCT pMyCDS;
    void WINAPI MyDisplay( LPSTR, LPSTR, DWORD );
    //
    // ************ Code fragment ****************
    //
    case WM_COPYDATA:
       pMyCDS = (PCOPYDATASTRUCT) lParam;
       switch( pMyCDS->dwData )
       {
          case MYDISPLAY:
             MyDisplay( (LPSTR) ((MYREC *)(pMyCDS->lpData))->s1,
                        (LPSTR) ((MYREC *)(pMyCDS->lpData))->s2,
                        (DWORD) ((MYREC *)(pMyCDS->lpData))->n );
       }
       break;
      

  4.   

    void Dlg1::OnOK()  

    UpdateData(TRUE);//加上这一句
    GetDlgItemText(IDC_EDIT2,string1); 
    ::SendMessage(::GetParent(this->m_hWnd),WM_COPYDATA,0,0); 
    }
      

  5.   

    to2楼:试了你的办法,依然在父对话框中无法显示to4楼:你的办法我也试过。因为直接用GetDlgItemText,所以加与不加UpdateData(TRUE);是一样的,我都试过了。
      

  6.   

    2楼的不行,位置是放在子对话框的OnOK()里面的
      

  7.   

    1楼的已经给出了原因,你应该仔细读一下Dlg1 dlg1; //Dlg1是子对话框的类名 
    CString string2;  
    string2 = dlg1.string1; //string1在子对话框类中已定义为public 这个"dlg1"就不是你弹出来的那个dlg了
      

  8.   


    为什么要放到子对话框的OnOK里面啊?不解//二楼的代码应该放到主对话框的按钮响应函数中,并且添加UpdateData(false);首先给子对话框Edit关联变量CString m_edit;
    在子对话框的OnOK函数中UpdateData(true);在主对话框的按钮响应函数中:
    Dlg1 dlg(this); 
    if (dlg.DoModal() == IDOK) 

      GetDlgItem(IDC_XXX)->SetWindowText(dlg.m_edit);  //这里IDC_XXX为主对话框Edit的ID
    }
      

  9.   


    "点击父对话框按钮显示子对话框"
    是如何显示子窗口的?
    如果是形如  myDlg.DoModel(), 可以把这个变量作为你这个父对话框的成员变量,
    然后string2 = myDlg.string1
      

  10.   

    可以直接给父对话框的Edit控件发WM_SETTEXT 消息。把取得的字符串放在参数里就是了,具体查一下此消息。
    Dlg1 dlg1; //Dlg1是子对话框的类名
    你想定义一个对象肯定不行。因为dlg1跟之前的不是同一个对象