从无模式对话框启动时,CFileDialog会冻结

时间:2015-04-15 01:50:38

标签: c++ mfc visual-studio-2005 cfiledialog

我试图调用CFileDialog以允许用户选择文件。

我的程序是MFC应用程序,我使用的是VS2005。

这是我的问题:

我有一个主视图,可以创建一个无模式对话框。在这个对话框中,我有一个菜单项,可以进行简单的CFileDialog调用:

CFileDialog dlgFile(true);
dlgFile.DoModal();

但程序总是挂在DoModal上。该程序不响应命令,任务管理器表示已停止响应。

其他有趣的信息:

  • 仅在Windows 8上观察到,Windows 7计算机似乎未受影响。
  • 我使用相同的基本View->无模式对话框> CFileDialog方案创建了一个新项目,它运行得很好。
  • 当我调用MessageBox时,它出现在对话框的后面(我必须点击alt才能获得它),但程序仍然响应。
  • 如果我在主视图中进行相同的CFileDialog调用,它会弹出而没有任何问题。
  • 另一个令人讨厌的问题可能与此有关:当CFileDialog调用正常时(在Win 7上),选择"计算机"在浏览窗口中显示一个空白的白色屏幕(其他一切正常)。

我能找到的最接近的问题是:Why does CFileDialog::DoModal() Hang? 但是,我没有使用线程(至少我95%肯定我不会,这不仅仅是我的项目)。我的项目是否自动被线程化?如果是这样,我怎样才能确保这不会导致我出现问题?

3 个答案:

答案 0 :(得分:1)

dlgFile.DoModal()调用运行模态例程,它启用/禁用和重新聚焦窗口,这可能是问题所在。您可以尝试使用GetOpenFileName

void CModeless::foo()
{
    //EnableWindow(0);
    OPENFILENAME ofn = { 0 };
    char buf[300];
    memset(buf, 0, 300);
    ofn.lpstrFile = buf;
    ofn.nMaxFile = 300;
    ofn.lStructSize = sizeof(OPENFILENAME);
    //ofn.hwndOwner = AfxGetApp()->m_pMainWnd->m_hWnd;
    GetOpenFileName(&ofn);
    //EnableWindow(1);
}

如果没有错误,请取消注释EnableWindowofn.hwndOwner,然后重试。您也可以尝试这种方法:

void CModeless::foo()
{
    CWnd *wnd = GetParent(); //or AfxGetApp()->m_pMainWnd
    EnableWindow(0);
    CFileDialog dlg(TRUE, 0, 0, 0, 0, wnd, 0, 1);
    dlg.DoModal();
    EnableWindow(1);

    MSG msg;
    while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
        if (!AfxGetApp()->PumpMessage())
            break;

    SetFocus();
}

答案 1 :(得分:1)

我在VS2008中遇到了同样的问题。 尝试将 false 设置为CFileDialog构造函数中的最后一个参数(bVistaStyle)

答案 2 :(得分:0)

我的基于CDialogEx的对话框无法显示CFileDialog。从我的CDocument中,一切正常。 我发现,我的对话框有一个自定义控件,它源自CStatic并覆盖虚拟 WindowProc()。 在评论WindowProc之后,CFileDialog像往常一样显示。 问题仅适用于“m_bVistaStyle”CFileDialog,并且在IFileDialog-> Show()中会出现冻结。