Смешивание MFC и WPF: модальные диалоги

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

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

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

Любые идеи?


person Joe    schedule 07.11.2008    source источник


Ответы (2)


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

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

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

person Joe    schedule 16.11.2008

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

person Aidan Ryan    schedule 08.11.2008
comment
Нет. Я обнаружил, что использование HwndSource было необходимо только тогда, когда я хотел встроить элементы управления WPF в окно MFC / Win32. Хотя, возможно, стоит попробовать ... Я добавлю правку о том, что я пробовал - person Joe; 08.11.2008
comment
На самом деле, вы, наверное, близки. Я сосредоточился на бите HwndSouce и пропустил :: SetParent. Я пытался использовать CDialog :: SetParent, который принимает указатель CWnd, а CWnd :: Attach у меня не работал. Но я должен иметь возможность использовать WindowInteropHelper, чтобы получить HWND для стороны WPF, и просто использовать :: SetParent - person Joe; 08.11.2008
comment
Черт возьми, ограничение - 300 символов. Попробую позже - наверное, на работе в понедельник - person Joe; 08.11.2008