Приложение MFC и модальный диалог без MFC - PullRequest
7 голосов
/ 24 февраля 2011

Я пишу подключаемую библиотеку Win32 для стороннего приложения MFC.DLL должна отображать модальное диалоговое окно.Когда я делаю это, используя DialogBox() или другой простой Win32 API (например, я пытался написать свой собственный модальный цикл), окно основного приложения перерисовывает не все элементы: оно перерисовывает стандартные элементы, но не клиентскую область.Немодальные диалоги отображаются очень хорошо.

Screenshot

Я подозреваю, что это происходит, потому что MFC на самом деле не имеет модальных диалогов в смысле Win32.У него может быть только один цикл сообщений, а отдельный цикл в DialogBox() нарушает работу его тонкого механизма.Вот статья CodeProject , которая объясняет это.Но этой статье CodeProject 9 лет, так что, возможно, с тех пор все изменилось.Может ли кто-нибудь пролить свет на это?Приложение использует MFC 8 (т.е. mfc80.dll).

Обновление .Вот ссылка на оригинальный вопрос ;может содержать некоторую дополнительную информацию.

Обновление 2 .Спасибо всем;Я действительно ценю все советы, это, безусловно, помогает мне получить общее представление о том, как все складывается вместе.Первый путь, который я собираюсь исследовать, - это использовать «модальные» диалоги MFC.(Поскольку я делаю все это из Python, я буду использовать привязки Python для MFC, pywin32).Это займет некоторое время;когда он будет готов, я обновлю сообщение с результатами.

1 Ответ

4 голосов
/ 24 февраля 2011

Каждый поток может иметь цикл сообщений.Поместите ваш модальный диалог в отдельный поток и эмулируйте стандартное поведение Windows, отключив родительское окно.

Редактировать: после некоторого обсуждения (см. Ниже) кажется, что родительский код ведет себя неправильно.

Тем не менее, я думаю, что есть возможные обходные пути.Одним из них может быть родительское окно (для модального диалога, но дочернее для того, которое в данный момент ведет себя некорректно), которое перекрывает ошибочное содержимое окна, но перерисовывает его из DC в памяти, чтобы имитировать правильное поведение.Конечно, родительское окно все равно должно быть отключено.Другим решением может быть создание подкласса родительского окна для исправления поведения.Поскольку плагин будет работать в том же процессе, реализация должна быть простой.

...