CFileDialog зависает при запуске из немодального диалога

Я пытаюсь вызвать CFileDialog, чтобы позволить пользователю выбрать файл.

Моя программа — приложение MFC, и я использую VS2005.

Вот моя проблема:

У меня есть основной вид, который создает немодальное диалоговое окно. В этом диалоговом окне у меня есть пункт меню, который делает простой вызов CFileDialog:

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

Но программа всегда висит на DoModal. Программа не отвечает на команды, и диспетчер задач говорит, что перестал отвечать.

Другие интересные фрагменты информации:

  • Это наблюдается только на Windows 8, машины с Windows 7, похоже, не подвержены изменениям.
  • Я создал новый проект с той же базовой схемой View-> modeless dialog-> CFileDialog, и он работал просто отлично.
  • Когда я звоню в MessageBox, он появляется за диалоговым окном (мне нужно нажать alt, чтобы получить его сразу), но программа все еще реагирует.
  • Если я сделаю тот же вызов CFileDialog в главном представлении, он появляется без каких-либо проблем.
  • Еще одна досадная проблема, которая может или не может быть связана с этим: когда работает вызов CFileDialog (в Win 7), выбор «компьютера» в окне просмотра показывает пустой белый экран (все остальное работает нормально).

Ближайшие вопросы, которые я мог найти, это: Почему CFileDialog :: DoModal () зависает?
Тем не менее, я не использую темы (по крайней мере, я на 95% уверен, что я не использую, это не только мой проект). Мой проект автоматически продвигается? Если так, как я могу убедиться, что это не вызывает у меня проблем?

2

Решение

У меня такая же проблема в VS2008.
Попробуйте установить на ложный последний параметр в конструкторе CFileDialog (bVistaStyle)

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

Если нет ошибки, тогда раскомментируйте 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();
}
1

Мой диалог на основе CDialogEx не смог отобразить CFileDialog. Из моего CDocument все работало нормально.
Я обнаружил, что мой диалог пользовательский контроль, который был получен из CStatic и перекрыл виртуальный WindowProc ().
После комментирования WindowProc CFileDialog показывался как обычно.
Проблема только для CFileDialog «m_bVistaStyle», и замораживание происходит в IFileDialog-> Show ().

0
По вопросам рекламы [email protected]