2016-09-15 10 views
0

У меня есть главное окно, а затем пользователь может «всплывать» один из фрейма в приложении, чтобы он плавал, а не содержался в главном окне. Существует несколько фреймов, которые могут быть вырезаны, так что в заданное время может быть три окна WS_POPUP.Отключить все окна верхнего уровня (WS_POPUP) при показе модального диалога

Проблема в том, когда я хочу показать модальное диалоговое окно, я могу только отключить один из них, используя параметр в функции DoModal. Как отключить все окна верхнего уровня с помощью DoModal? Я не могу просто отключить окна перед показом модальных данных, а затем включить их обратно, потому что может быть несколько цепочечных модальных диалогов (один модальный диалог открывает еще один модальный диалог).

Предоставляет ли API способ сделать что-то подобное? Я искал это в течение двух часов и не могу найти достаточно хорошее решение. Я использую комбинацию MFC, WTL и ATL.

Заранее благодарен!

+1

Это не так, как работают диалоги. Вы должны использовать EnableWindow() явно для достижения аналогичного эффекта. Но нет, это неинтуитивно для любого пользователя. –

+1

@JanS: модальный диалог ** принадлежит ** его владельцем. Нет отношений между дочерним и родительским. Модальный диалог не отключает братьев и сестер, например. другие принадлежащие окнам. – IInspectable

+0

@HansPassant Какая часть, по вашему мнению, не интуитивно понятна? Один пример в реальном мире - это визуальная студия. Visual Studio поддерживает несколько всплывающих окон. В VS, когда вы хотите открыть файл, все остальные всплывающие окна отключены. Во всяком случае, меня больше беспокоит реализация. – bysreg

ответ

1

Как я понимаю, это похоже на работу окон кадра MFC.

Фактически только CFrameWnd приложения MFC отключается. По прибытии выдается сообщение WM_ENABLE (с FALSE) BeginModalState, и эта функция просто отключает его плавающие «дочерние окна» CFrameWnd.

То же самое, когда EnableWindow (WM_ENABLE поступает с TRUE) вызывается для CFrameWnd. Вызывается EndModalState, и все отключенные «дочерние и плавающие» окна снова включаются.

См. Реализацию MFC CFrameWnd :: OnEnable, BeginModalState, EndModalSTate в исходном коде.

Итак, вы в главном окне знаете, что это собственные всплывающие окна. После запуска подлинного модального диалога и отключения этого родителя он отключит его всплывающие всплывающие окна.

Хитрость в том, что CDialog :: DoModal нуждается в реальном родителе ... если не задано в конструкторе, он в большинстве случаев угадывает правильный. Для вашего случая должно быть необходимо, чтобы вы предоставили свое «главное окно» в качестве родительского окна ... то же самое для сообщений ...

+0

привет, так вы говорите, если я предоставляю главный дескриптор окна функции domodal, а затем при создании нового pop-window с помощью функции Create я должен передать дескриптор главного окна также как родительский? Я пробовал это, и он не работает – bysreg

+0

Я использую CFrameWindowImpl для главного окна и для всплывающего окна, я использую CWindowImpl bysreg

+1

Это само по себе не сработает. Я написал: Посмотрите на реализацию MFC! CFrameWnd делает это.И я сказал вам, что нужно искать! – xMRi