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

解决方案 »

  1.   

    改动CDialog的实现可以考虑否则可能只有在new CDialog时进行设置了. 而且要自己写相当头痛的程序.
      

  2.   

    to:flyelf(空谷清音) 唉,那要在每个CDialog实现类里鼓捣一通,头晕.
      

  3.   

    可以把从CDialog派生改为从CMyDialog派生,然后只要在CMyDialog里做一次
      

  4.   

    我有个备选方案, 就是用单件模式, 在每个OnOk() OnCancel()中,添一行代码就成了.可这也要逐一改动. 更为要命的是,在Dlg实现类的有些地方,直接就用 CDialog::OnOk(),CDialog::OnCancel().  希望有个好法子.
      

  5.   

    to:easyrock() 老大, 有好多好多的CDialog. 迫不得以,莫要惹它们.
      

  6.   

    to: lygfqy(风清扬) 老兄,能否详细一下?
      

  7.   

    兄弟,重载CDIALOG吧然后+上自己的方法再让你工程去继承你做的CDIALOG这样改动不是很大而且结构灵活修改父类就可以了,一般不用改继承类;长痛不如短痛;是我铁定去改
      

  8.   

    这样行吗?
    自己做一个WH_CALLWNDPROC的钩子,监视本线程的所有窗口过程消息
    如果发现WM_DESTROY消息的话检查
    是否窗口的属性或者看看它的父窗口是不是MainFrame等等就可以了
      

  9.   

    个人觉得如果从父窗口里改没有什么好方法,
    而且可能也不会减轻多少工作量,
    还是直接从dialog里去改吧,
    容易.
      

  10.   

    还是在 OnDestroy 发消息吧, 这样还少一些函数。 不建议派生CDialog类。
      

  11.   

    其实,我是把众多的CDialog,内嵌到CView中实现的, 当然是非模式的.
    那在dlg销毁时, 我猜想, CView会接受到类似的消息, OnNotify不成的.我用Spy++仔细查过了, 在非模式对话框Destroy时, 无WM_DESTROY,WM_CLOSE
    之类的消息弹出. 想来,钩子怕也不成.唉,那位弟兄还有奇招, 这个问题,我散分400, 在COM,线程版都有相同问题.
      

  12.   

    我刚刚帮你做了一个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;
      

  13.   

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