2015-04-15 6 views
2

Я пытаюсь вызвать CFileDialog, чтобы пользователь мог выбрать файл.CFileDialog замерзает при запуске с помощью диалогового окна Modeless

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

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

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

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

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

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

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

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

+0

Я пробовал это в Windows 8 и не видел проблемы. Вы должны показать больше кода, чтобы воспроизвести проблему. 'dlgFile' должен иметь больше аргументов и т. д. –

+0

@BarmakShemirani Да, я бы хотел, но это все, что нужно, кода больше нет. У меня буквально есть функция, в которой есть только две строки кода. Я тоже не могу воспроизвести его. Как я уже упоминал, я сделал новый проект в Windows 8 с той же базовой настройкой, и он работал нормально. Это происходит только с этим проектом. –

+0

Создайте свой CFileDialog, передавая родительское окно вашего немодального окна. Посмотрите на [конструктор] (https://msdn.microsoft.com/en-us/library/wh5hz49d%28v=vs.100%29.aspx). Имеется параметр 'CWnd * pParentWnd = NULL', который вы может установить – cha

ответ

1

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

+0

Установка параметра «bVistaStyle = FALSE» в последнем параметре тоже работала для меня, но она уменьшила функциональность. Также висит только в режиме DEBUG, а не в режиме RELEASE. (VS2008) – MasterHD

+0

Возвращаясь к этому после looooong времени. В VS2005 нет параметра 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

Спасибо за ответ, но я пробовал обе функции, и они оба дают одинаковый результат. Все еще замерзает, даже когда я раскомментирую две строки EnableWindow и строку hwndOwner. –

0

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

Смежные вопросы