Смешивание MFC и WPF: модальные диалоги - PullRequest
3 голосов
/ 07 ноября 2008

Я добавляю диалоги C # WPF в существующее приложение C ++ MFC, используя интерфейсный уровень C ++ / CLI. У меня все работает, но у меня проблемы с модальностью. Например:

  1. Приложение MFC показывает диалог WPF с использованием ShowDialog. Работает как положено.
  2. В этом диалоговом окне WPF отображается диалоговое окно MFC с использованием DoModal. Диалоговое окно WPF скрыто за базовым приложением C ++ и не отключается, если я вручную не изменю IsEnabled. Не идеально, но работает.
  3. Теперь этот диалог MFC закрыт. Теперь по какой-то причине базовое приложение MFC включено, когда оно все еще должно быть отключено из-за того, что диалог WPF не был закрыт. Это плохо, так как теперь он позволяет пользователю делать сумасшедшие вещи, пока диалог WPF еще открыт.

У меня такое ощущение, что было бы лучше, если бы я мог правильно установить родительские диалоги. Но до сих пор я не смог установить родителя диалога MFC в качестве диалога WPF или наоборот. И я даже не знаю, исправит ли это это.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 16 ноября 2008

При открытии CDialog хитрость заключается в использовании WindowsInteropHelper для получения HWND родительского диалога WPF. Затем вы можете использовать CWnd :: Attach, чтобы обернуть этот HWND в класс CWnd для передачи в конструктор CDialog.

Проблема, с которой я столкнулся, заключалась в том, что я уже создал CDialog., Но еще не отображал. Различные версии SetParent могут использоваться, только если у вашего целевого дочернего окна уже есть действительный дескриптор. Мне пришлось написать новую функцию в моем классе CDialog, чтобы установить m_wndParent, который он использует в качестве родителя, когда в конце концов создает диалог. Тогда все отлично работает!

Каким-то образом создание диалогов WPF из диалогов MFC "просто работает". Это волшебство.

2 голосов
/ 08 ноября 2008

При отображении диалогового окна WPF вы используете HwndSource класс для переноса окна WPF? Если это так, вы можете :: SetParent открыть окно WPF, а также использовать свойство HwndSource.Handle для установки родителя дочернего элемента.

...