如题!

解决方案 »

  1.   

    不好意思。也就是说在模式对话框(如:CFileDialog)的父窗口中关闭它,而不是点击“确定”和“取消”来关闭模式对话框。
      

  2.   

    CFileDialog是domodal出来的,会在那里等,难道你要用个定时器来把他干掉??那就创建的时候new出来,想关的时候强制delete掉
      

  3.   

    楼上说的对,我目的是这样的:父窗口创建模式对话框时就挂起了,不能对父窗口进行操作,我创建了一个定时器,但如果用户一段时间没有操作的话,整个程序就会退出。如果直接对父窗口发WM_CLOSE消息的话,就出错。所以在关闭父窗口时要把模式对话框关掉才行。
      

  4.   

    子类化一下CFileDialog就可以了 void TestFileDlg(void)
    {
    CFileDialog fd(TRUE);
    fd.m_pOFN->Flags |= (OFN_ENABLEHOOK | OFN_EXPLORER);
    fd.m_pOFN->Flags |= OFN_EXPLORER;
    fd.m_pOFN->lpfnHook = OFNHookProc;
    fd.DoModal(); }
    static UINT_PTR CALLBACK OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
    const int ID_TMR_CLOSE = WM_USER + 100;
    switch (uiMsg)
    {
    case WM_INITDIALOG:
    SetTimer(hdlg,ID_TMR_CLOSE,1000,NULL);
    break;
    case WM_TIMER:
    if (wParam == ID_TMR_CLOSE)
    PostMessage(GetParent(hdlg),WM_COMMAND,MAKELONG(IDCANCEL,0),1); break;
    }
    return 0;
    }
      

  5.   

    楼上的兄弟,非常感谢你!你说的这个方法的确可行。但是假如用户正常操作的话,在模式对话框上点击保存另存为一个文件的时候就出错了,在下面红色文字的地方提示断言失败:INT_PTR CFileDialog::DoModal()
    {
    ASSERT_VALID(this);
    ASSERT(m_ofn.Flags & OFN_ENABLEHOOK);
    ASSERT(m_ofn.lpfnHook != NULL); // can still be a user hook        …… if (nResult)
    ASSERT(pThreadState->m_pAlternateWndInit == NULL);
    pThreadState->m_pAlternateWndInit = NULL;        …… PostModal();
    return nResult ? nResult : IDCANCEL;
    }还请各位高手指点一下,谢谢!
      

  6.   

    to bdzwj ,可以再帮我看看这个问题吗,先谢谢了!
      

  7.   

    class CCustomFileDialog : public CFileDialog
    {
    enum { ID_TMR_CLOSE = 100 };
    public:
    CCustomFileDialog(BOOL bOpen = TRUE)
    : CFileDialog(bOpen) {};

    DECLARE_MESSAGE_MAP()
    afx_msg void OnTimer(UINT nIDEvent); virtual BOOL OnInitDialog()
    {
    SetTimer(ID_TMR_CLOSE,5000,NULL);
    return CFileDialog::OnInitDialog();
    }
    };
    BEGIN_MESSAGE_MAP(CCustomFileDialog, CFileDialog)
    ON_WM_TIMER()
    END_MESSAGE_MAP()void CCustomFileDialog::OnTimer(UINT nIDEvent)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    if (nIDEvent ==  ID_TMR_CLOSE)
    {
    GetParent()->PostMessage(WM_COMMAND,MAKELONG(IDCANCEL,0),NULL);
    }
    }void Test()
    {
    CCustomFileDialog fd;
    if (fd.DoModal() == IDCANCEL)
    AfxMessageBox("Exit");
    else 
    AfxMessageBox(fd.GetFileName());}