1

朋友们,这几天我面临的问题真的让我很头疼......它很简单......我想在两个/多个对话框之间进行通信,例如,如果有一个变量 CString 测试......我希望这个测试变量对于对话框/类是通用的(考虑到每个对话框都有单独的类)......我尝试了很多方法,一切都失败了......最后我尝试了这个 WM_COPYDATA 方法......即使现在,我也没有达到我想要的去做...

Sender Class:

#define ORGININFO 1

typedef struct ShareMessage
{
    CString mydata;
    int myValue;
}MYDATA;

void CCopyDataDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    MYDATA myData;
    COPYDATASTRUCT cData;

    myData.mydata.SetString(L"Rakesh");

    cData.dwData = ORGININFO;
    cData.cbData = sizeof(myData);
    cData.lpData = &myData;

    HWND hwnd  = (HWND)FindWindow(L"Dialog1",L"Test");



    SendMessageA(m_hWnd,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)(LPVOID)&myData);


    Dialog1 dlg;
    dlg.DoModal();

}

接收器类:

#define iMessage 1

typedef struct MyDatas
{
    CString myData;
    int myint;
}DATA;
PCOPYDATASTRUCT pData;


LRESULT Dialog1::WindowProc(UINT message,WPARAM wParam,LPARAM lparam)
{

    if(WM_COPYDATA != NULL)
        pData = (PCOPYDATASTRUCT)lparam;
        switch(pData->dwData)
        {
        case iMessage:
            MessageBoxA((HWND)AfxGetInstanceHandle(),(LPCSTR)(LPCTSTR)((DATA*)(pData->lpData))->myData,(LPCSTR)L"Test",MB_OK);

        }
    return 0;
}

在上面我不知道我在做什么错误,但它没有从 CCopyDialog 类接收数据......请帮助我......

4

3 回答 3

2

您的 CString 可能在结构中,但存储它的内存是在堆上分配的。您必须在这里采用低技术:在 ShareMessage 结构中放入一个 wchar(或 char 或 TCHAR,取决于您的需要)数组,并将字符串内容复制到该数组中。在您的接收器代码中,从 wchar 数组中读取字符串。哦,您已经发送了您的结构的地址,而不是 COPYDATASTRUCT,并将其发送给您自己,而不是其他对话框。像这样修改 SendMessage 调用:

SendMessage (hWnd,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)(LPVOID)&cData);

另外,您确定 FindWindow 调用有效吗?那个类名在我看来很可疑。最好使用NULL,并依赖窗口标题。我有一个模糊的记忆,MFC 对话框有一个固定的类名。

你的代码应该可以工作。

例如:

typedef struct ShareMessage
{
    wchar szMyString [100];
    int myValue;
}MYDATA;

void CCopyDataDlg::OnBnClickedOk()
{
   MYDATA myData;
   COPYDATASTRUCT cData;
   ZeroMemory (&myData, sizeof(myData);

   wcscpy (myData.szMyString, (L"Rakesh"));

   cData.dwData = ORGININFO;
   cData.cbData = sizeof(myData);
   cData.lpData = &myData;
   ...

我还没有测试过那个代码,它不在我的脑海中。我假设 wchar 因为您在常量字符串上使用了 L 修饰符。

此外,在您的接收器代码中,您有以下行:

if (WM_COPYDATA != NULL)

这是没有意义的。我假设您打算根据常量 WM_COPYDATA 测试收到的消息编号。

于 2010-03-05T09:28:55.023 回答
0

除了我上面的回答,这是接收代码

LRESULT Dialog1::WindowProc(UINT message,WPARAM wParam,LPARAM lparam)
{
   CString csPassedString;
   PCOPYDATASTRUCT pData;
   MYDATA myStuff;

   if (message == WM_COPYDATA)
   {
      pData = (PCOPYDATASTRUCT)lparam;
      if (pData)
      {
         memcpy (&myStuff, pData->lpData, sizeof(myData));
         csPassedString = myStuff.szMyString;
         switch(pData->dwData)
         {
           case iMessage:
              MessageBox (csPassedString,
                          L"Test",
                          MB_OK);
....

但是这里还有另一个更基本的问题……在 MFC 应用程序中,仅仅为了处理基本消息而重写 WindowProc 似乎很奇怪。

于 2010-03-05T11:26:14.787 回答
0

我避免使用 WinProc ..我在 Dialog11 类中编写了一个普通函数(CopyData) ..在 CCopyDialog1 类中创建了一个无模式对话框 ..并调用了该函数(CopyData)..它起作用了..请检查下面的代码...

//CCopyDialog Class(sender)
void CCopyDataDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    Dialog1* dialog1 = new Dialog1();
    dialog1->Create(IDD_DIALOG1,0);
    dialog1->ShowWindow(SW_SHOW);
    ZeroMemory(&myData,sizeof(myData));
    wcscpy(myData.mydata,(L"Rakesh"));

    cData.dwData = ORGININFO;
    cData.cbData = sizeof(myData);
    cData.lpData = &myData;

       HWND rs = ::FindWindow(NULL,L"Rakesh");

    dialog1->CopyData(WM_COPYDATA,(WPARAM)rs,(LPARAM)&cData);


}


Dialog1 class(receiver)
LRESULT Dialog1::CopyData(UINT message,WPARAM wParam,LPARAM lparam)
{
    if(message == WM_COPYDATA)
    {
        pData = (PCOPYDATASTRUCT)lparam;
        wchar_t tes[50];
        memcpy(tes,((DATA*)(pData->lpData))->myData,sizeof(DATA));

    }
    else
    {
        return FALSE;
    }

    return 0;
}

基本上,与我以前的代码(我的问题中的代码)相比......有很多差异/错误......

1.在sendmessage中我传递了结构而不是COPYDATASTRUCT.. 2.在调用Dialog1窗口之前调用了FindWindow.. 3.使用函数WinProc函数来接收消息..很难让它工作..然后避免那并使用了正常的功能 4.Didnt 传递了正确的窗口句柄...以上所有内容均由 Bob Moore 纠正...归功于他...

于 2010-03-06T04:38:40.190 回答