建立个基于对话框的工程:
主窗体是a
二级窗体是b
三级窗体是c
自定义消息:b到a没有问题:
发送消息代码(b窗体中代码)是:CccenterDlg *pDlg = (CccenterDlg *)GetParent();
//AfxGetMainWnd() ->ShowWindow(SW_HIDE);
pDlg->PostMessage(WM_MYMESSAGE,0,0);
现在问题是同样的方法,在b中定义消息处理函数,从c发送消息到b,发送代码和上面一样
具体如下:
 Cproductsort *pDlg = (Cproductsort *)GetParent();
//AfxGetMainWnd() ->ShowWindow(SW_HIDE);
 pDlg->PostMessage(WM_PRODUCTSORT,0,0);但是发送不成功,问题好象是Cproductsort *pDlg = (Cproductsort *)GetParent();这样并不能取到c的父窗体b的句柄
请大家指点下原因

解决方案 »

  1.   

    问题在于你B中的消息处理函数,是否定义恰当?你的函数应该为(B中):Cproductsort::OnMyMessage(WPARAM, LPARAM)
    {
    CccenterDlg *pDlg = (CccenterDlg *)GetParent();
    pDlg->PostMessage(WM_MYMESSAGE,0,0);
    }。
    ==================================================================
    另外这种多级传递效率不高,你可以把A的窗口句柄传给B和C,然后用:
    ::PostMessage(HWND, WM_MESSAGE, WPARAM, LPARAM)
    就可一步到位了。
      

  2.   

    其实我定义了两个消息:第一个消息是b到a是可以的,没问题
    问题是是在c到b的消息传递不了;撇开不说b到a,因为这个并没有问题
    其实b弹出c的窗体代码是:
    productsortmod.Create(IDD_PRODUCTSORTMODDIALOG);  
    productsortmod.ShowWindow(SW_SHOW);
    productsortmod.SetForegroundWindow();按楼上所说,应该在这个地方把b的句柄传递给c,那实际该怎么传递呢?
      

  3.   

    而且在c窗体中这样发送也不成:
        HWND hWnd=::FindWindow("Cproductsort",NULL);
         if(hWnd)
         {
          ::PostMessage(hWnd,WM_PRODUCTSORT,NULL,NULL);
          }
      

  4.   

    三级窗体是c在创建的时候有没有指明窗体b为父窗口,不然不可能取不到父窗口b,
    HWND hWnd=GetParent()->m_hWnd;
    ::PostMessage(HWND,WM_MESSAGE, WPARAM, LPARAM)就可以从c发送给b了