Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Модальность в многооконном приложении


Автор: artsb 11.6.2010, 08:17
Всем привет!

Есть многооконное приложение. Нужно реализовать что-то типа MDI. Вот только есть некоторые условия, из-за которых обычное MDI-приложение не устраивает:
1. Нужно реализовать модальность по только по отношению к дочерним окнам. Т.е. основное окно должно быть всегда доступно, чтобы его можно было перемещать, сворачивать, изменять размер и закрыть. Это необходимо для удобства.
2. В связи с тем, что некоторые окна приложения имеют фиксированные размеры, возникает следующая проблема: если какое-нибудь окно развёрнуто внутри главного окна, то при открытии окна с фиксированными размерами, развёрнутое окно уменьшается, что не есть хорошо.

Проблемы решил пока так:
1. Использую обычное MDI-приложение. Вместо отображения модального окна, пробегаюсь по всем чилдам и ставлю Enabled=false. Потом отображаю "модальное" окно. После закрытия этого окна, делаю Enabled=true всем чилдам.
2. Перехватываю момент разворота окна и просто ставлю его в позицию (0, 0), а ширину и высоту делаю равными ширине и высоте клиентской области главного окна.

Естественно, всё это дело выглядит ужасно (особенно разворот), но другого пока ничего придумать не удалось.

Вот, хотел узнать, что посоветуют спецы. Может кто-то сталкивался с подобной задачей...

В принципе, не обязательно делать MDI-приложение. Это может быть что угодно. Лишь бы было главное окно, которое содержало в себе дочерние "окна". Вот вчера, например, появилась идея:
Использовать PageControl. В него можно встраивать окна в качестве вкладок. Это решает такую проблему, как развёртывание (получается окно всегда будет развёрнуто на всю доступную область главного окна). Остаётся одна - модальность. В принципе, некоторые окна, наподобие "О программе" и "Настройки" можно отображать как обычные модальные окна. Тогда остаются "модальные" окна связанные с конкретной вкладкой (окном). Тут была идея приблизительно такая: перед открытием "модального" окна, делаем скриншот, затемняем его немного, скрываем само окно (содержимое вкладки), кладём Image и вставляем в него затемнённый скриншот, а поверх Image на эту же вкладку кидаем заранее заготовленный фрейм (оформленный в виде окна). Вроде всё супер. Но возникает другая проблема: что делать, если изменится размер главного окна? Получается, что старый криншот уже не подходит в качестве подложки. А как сделать новый?..

В общем, надеюсь, что суть вы поняли smile

Автор: NightElf 11.6.2010, 09:21
Да есть такая проблема, но такова политика MDI, все окна не могут быть максимизированы. Активным может быть только чтото одно.
Модальная форма накрывает всё полностью (простой пример приложения Office). 
Попробуй на формы те что должны быть максимизированы поставить в нужный момент Align = alClient а затем сразу Align = alTop.

Автор: artsb 11.6.2010, 09:57
Спасибо за ответ.

Цитата(NightElf @  11.6.2010,  09:21 Найти цитируемый пост)
все окна не могут быть максимизированы. Активным может быть только чтото одно.

Как раз таки, все одновременно могут быть, тогда можно между ними переключаться по Ctrl+Tab. А вот так, чтобы несколько развёрнутых и хотя бы одно с фиксированными размерами быть не может.

Цитата(NightElf @  11.6.2010,  09:21 Найти цитируемый пост)
Модальная форма накрывает всё полностью (простой пример приложения Office). 

Эт понятно. Но мне нужно допиться похожего эффекта, только чтобы главное окно осталось активным. Т.е. модальность я привёл как пример того, что мне нужно и указал недостаток, который мне мешает.

Цитата(NightElf @  11.6.2010,  09:21 Найти цитируемый пост)
такова политика

Опять таки, я просто привёл пример того что мне нужно и указал недостатки.

Я же писал, что необязательно решать задачу стандартными средствами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)