【问题标题】:CFileDialog freezes when launched from Modeless Dialog从无模式对话框启动时 CFileDialog 冻结
【发布时间】:2015-06-20 19:48:39
【问题描述】:

我正在尝试调用 CFileDialog 以允许用户选择文件。

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

这是我的问题:

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

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

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

其他有趣的信息:

  • 这仅在 Windows 8 上观察到,Windows 7 机器似乎不受影响。
  • 我使用相同的基本视图->无模式对话框->CFileDialog 方案创建了一个新项目,它工作得很好。
  • 当我调用 MessageBox 时,它出现在对话框的后面(我必须按 alt 才能将它放在前面),但程序仍然响应。
  • 如果我在主视图中进行相同的 CFileDialog 调用,它会毫无问题地弹出。
  • 另一个可能与此相关或无关的烦人问题:当 CFileDialog 调用工作时(在 Win 7 上),在浏览窗口中选择“计算机”会显示一个空白屏幕(其他一切正常)。李>

我能找到的最接近的问题是:Why does CFileDialog::DoModal() Hang? 但是,我不使用线程(至少我 95% 确定我不使用,这不仅仅是我的项目)。我的项目会自动线程化吗?如果是这样,我如何确保这不会给我带来问题?

【问题讨论】:

  • 我在 Windows 8 中尝试过,但没有发现问题。您必须显示更多代码才能重现该问题。 dlgFile 必须有更多参数等。
  • @BarmakShemirani 是的,我希望我可以,但仅此而已,没有更多代码。我真的有一个函数,里面只有这两行代码。我似乎也无法复制它。就像我提到的那样,我在 Windows 8 上使用相同的基本设置创建了一个新项目,并且运行良好。它似乎只发生在这个项目中。
  • 创建你的 CFileDialog 传递你的无模式窗口的父窗口。看看constructor有一个CWnd* pParentWnd = NULL参数可以设置
  • @cha 我试过了,我已经将父级设置为桌面、对话框和主视图,仍然冻结。

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


【解决方案1】:

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

【讨论】:

  • 在最后一个参数中设置 bVistaStyle=FALSE 也对我有用,但它减少了功能。此外,挂起仅发生在 DEBUG 模式而不是 RELEASE 模式。 (VS2008)
  • 在很长一段时间后回到这个问题。 VS2005 中没有 bVistaStyle 参数,但是,我将继续并将其标记为答案。
【解决方案2】:

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();
}

【讨论】:

  • 感谢您的回复,但我尝试了这两个功能,它们都给出了相同的结果。仍然冻结,即使我取消注释两个 EnableWindow 行和 hwndOwner 行。
【解决方案3】:

我的基于 CDialogEx 的对话框无法显示 CFileDialog。在我的 CDocument 中,一切正常。 我发现,我的对话框有一个 自定义控件,它是从 CStatic 派生的并覆盖了虚拟 WindowProc( )。 注释 WindowProc 后,CFileDialog 照常显示。 该问题仅针对“m_bVistaStyle”CFileDialog,并且在 IFileDialog->Show() 中发生冻结。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多