从无模式对话框启动时 CFileDialog 冻结
CFileDialog freezes when launched from Modeless Dialog
我正在尝试调用 CFileDialog 以允许用户 select 一个文件。
我的程序是一个MFC应用程序,我使用的是VS2005。
这是我的问题:
我有创建无模式对话框的主视图。在这个对话框中,我有一个菜单项,可以进行简单的 CFileDialog 调用:
CFileDialog dlgFile(true);
dlgFile.DoModal();
但是程序总是挂在DoModal上。程序不响应命令,任务管理器说它已停止响应。
其他有趣的信息:
- 这只在 Windows 8 台机器上观察到,Windows 7 台机器似乎没有受到影响。
- 我使用相同的基本视图->无模式对话框->CFileDialog 方案创建了一个新项目,它工作得很好。
- 当我调用 MessageBox 时,它出现在对话框后面(我必须按 alt 键才能在前面显示),但程序仍然响应。
- 如果我在主视图中进行相同的 CFileDialog 调用,它会毫无问题地弹出。
- 另一个可能与此相关或无关的烦人问题:当 CFileDialog 调用工作时(在 Win 7 上),selecting "computer" 在浏览 window 中显示空白屏幕(其他一切正常)。
我能找到的最接近的问题是:Why does CFileDialog::DoModal() Hang?
但是,我不使用线程(至少我 95% 确定我不使用线程,这不仅仅是我的项目)。我的项目会自动线程化吗?如果是这样,我如何确保这不会给我带来问题?
dlgFile.DoModal()
调用 运行 模态例程,它 enables/disables 并重新聚焦 windows,也许这就是问题所在。您可以尝试 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);
}
如果没有错误,则取消EnableWindow
和ofn.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();
}
我在 VS2008 中遇到了同样的问题。
尝试将 CFileDialog 构造函数 (bVistaStyle) 中的最后一个参数设置为 false
我基于 CDialogEx 的对话框无法显示 CFileDialog。在我的 CDocument 中,一切正常。
我发现,我的对话框有一个 自定义控件 ,它派生自 CStatic 并覆盖了虚拟 WindowProc( )。
在评论 WindowProc 之后,CFileDialog 照常显示。
此问题仅针对 "m_bVistaStyle" CFileDialog,冻结发生在 IFileDialog->Show() 中。
我正在尝试调用 CFileDialog 以允许用户 select 一个文件。
我的程序是一个MFC应用程序,我使用的是VS2005。
这是我的问题:
我有创建无模式对话框的主视图。在这个对话框中,我有一个菜单项,可以进行简单的 CFileDialog 调用:
CFileDialog dlgFile(true);
dlgFile.DoModal();
但是程序总是挂在DoModal上。程序不响应命令,任务管理器说它已停止响应。
其他有趣的信息:
- 这只在 Windows 8 台机器上观察到,Windows 7 台机器似乎没有受到影响。
- 我使用相同的基本视图->无模式对话框->CFileDialog 方案创建了一个新项目,它工作得很好。
- 当我调用 MessageBox 时,它出现在对话框后面(我必须按 alt 键才能在前面显示),但程序仍然响应。
- 如果我在主视图中进行相同的 CFileDialog 调用,它会毫无问题地弹出。
- 另一个可能与此相关或无关的烦人问题:当 CFileDialog 调用工作时(在 Win 7 上),selecting "computer" 在浏览 window 中显示空白屏幕(其他一切正常)。
我能找到的最接近的问题是:Why does CFileDialog::DoModal() Hang? 但是,我不使用线程(至少我 95% 确定我不使用线程,这不仅仅是我的项目)。我的项目会自动线程化吗?如果是这样,我如何确保这不会给我带来问题?
dlgFile.DoModal()
调用 运行 模态例程,它 enables/disables 并重新聚焦 windows,也许这就是问题所在。您可以尝试 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);
}
如果没有错误,则取消EnableWindow
和ofn.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();
}
我在 VS2008 中遇到了同样的问题。 尝试将 CFileDialog 构造函数 (bVistaStyle) 中的最后一个参数设置为 false
我基于 CDialogEx 的对话框无法显示 CFileDialog。在我的 CDocument 中,一切正常。 我发现,我的对话框有一个 自定义控件 ,它派生自 CStatic 并覆盖了虚拟 WindowProc( )。 在评论 WindowProc 之后,CFileDialog 照常显示。 此问题仅针对 "m_bVistaStyle" CFileDialog,冻结发生在 IFileDialog->Show() 中。