相同问题,在基础,线程,Com版如题:工程类型SDI:当然,可以重载 OnOk() OnCancel(), 然后在它们里面向父窗体发个消息.
但,当前项目基本成形,如此大的改动,量大,易误.[因有众多的这种情形]理想状态,我在CView中,或CMainFrame中进行捕获它们发来的销毁消息,
而不改动派生的Dialog类.怎么处理呢? 请高手指点.

解决方案 »

  1.   

    我刚刚帮你做了一个mfc例子你参考参考:
    app.h
    #define WM_CHILDDESTROY WM_USER+0x100
    {
    public:
    HHOOK m_hHook;
    //钩子过程 
    static LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam);
    }app.cpp:InitInstance:
    m_hHook = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,AfxGetInstanceHandle(),GetCurrentThreadId());ExitInstance:if(m_hHook != NULL)
    UnhookWindowsHookEx(m_hHook);//////////////////////////////////////////////////////////////////////////
    //Hook 回调函数LRESULT CALLBACK CTestListCtrlApp::CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if(nCode == HC_ACTION)
    {
    CWPSTRUCT * pCwp = (CWPSTRUCT*)lParam;
    if(pCwp != NULL && ::IsWindow(pCwp->hwnd) )
    {
    if(pCwp->message == WM_DESTROY)
    {
    TRACE("句柄:%x\n",pCwp->hwnd); TCHAR szText[256];
    TCHAR szClassName[256];
    GetWindowText(pCwp->hwnd,szText,256);
    TRACE("WindowText:%s\n",szText);
    GetClassName(pCwp->hwnd,szClassName,256);
    TRACE("ClassName:%s\n",szClassName);

    //"#32770"
    if(theApp.m_pMainWnd->GetSafeHwnd() != NULL && _tcsicmp(szClassName,_T("#32770")) == 0)
    {
    //下面是发送消息给主窗口#32770是mfc默认的dialog类名,你可以用不同的方式和不同的条件来判断,注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了
    SendMessage(theApp.m_pMainWnd->GetSafeHwnd(),WM_CHILDDESTROY,0,(LPARAM)szText);
    }
    }
    }
    }
    return CallNextHookEx(theApp.m_hHook,nCode,wParam,lParam);}主窗口中:
    LRESULT CTestListCtrlDlg::OnChildDestroy(WPARAM wParam,LPARAM lParam)
    {
    CString strTemp;
    strTemp.Format(_T("窗口名为%s的窗口正在被Destroy掉 "),lParam);
    MessageBox(strTemp);
    //在这里做你要做的东西

    return 0;}
      

  2.   

    需要用到钩子么?
    直接在dialog销毁的时候发送这个消息就可以了!楼上的解释一下:“注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了”是什么意思?
      

  3.   

    to warmchang(风滑过的痕迹):
    你没有看懂楼主的意思吗?
    你说的这个方法他都知道,不过他的工程里面有上百个对话框一个一个改太麻烦。

    注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了”
    这句话的意思是在hook里面hook到WM_DESTROY消息这时消息里面对应的句柄时即将要被销毁的窗口句柄,如果将这个窗口句柄传给主窗口处理的话,这时可能已经不存在这个窗口了。
      

  4.   

    一般的子窗口在关闭时会发给父窗口WM_PARENTNOTIFY消息。
    其中wParam==WM_DESTROY, lParam=idChildWindow;
    对话框好象需要在WM_DESTROY中自已发送该消息:
    ::SendMessage(hParent, WM_PARENTNOTIFY, WM_DESTROY, m_id);父窗口接收到该消息后,可做相应处理。
    LRESULT CALLBACK WndProc(HWND...)
    {
       switch(uMsg)
      {
        case WM_PARENTNOTIFY:
        ....
        break;
      }
    }如果用MFC,方法类似。
      

  5.   

    chehw(chehw) :你的方法不行,因为它不想在在对话框Destroy的时候添加其他代码.
      

  6.   

    to:checkyvc6(checkyvc6) 非常不错. 就立即散分,了表心意.