![]() |
|
|
![]()
|
|
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Простенькая проблема.
Имеются три окна, производные от CDialog: W_main,W_Ch и Wm. Все имеют стиль POPUP. W_main - главное окно приложения. W_Ch - окно, открываемое в W_main, в качестве указателя на родителя в функцию Create и конструктор передается указатель на W_main. Wm - окно, открываемое как модальное из окна W_main. Но открывается оно как модальное только по отношению к главному окну, то есть доступ к окну W_Ch не блокируется. А хотелось бы, чтобы окно было модальным не только по отношению к главному окну приложения, а ко всем окнам приложения. Флаги TASKMODAL, SYSTEMMODAL не помогают, либо я их неправильно использую. Как сделать? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: нет Всего: 1 |
Dreamer_0x01 напиши как ты создаешь диалоги, и как вызываешь...
|
|||
|
||||
| Dreamer_0x01 |
|
||||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
1. Класс W_main создается визардом (приложение, основанное на диалоговом окне). Это и есть главное окно.
2. Класс W_ch и W_m создаю через редактор ресурсов. То есть добавляю простейший диалог, практически ничего в нем не меняю, все оставляю по умолчанию, создаю визардом классы, производные от CDialog. получился следующий код классов:
Ну и далее создаю их так:
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||||
|
|||||||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: нет Всего: 1 |
Функция Create не создает модальных окон для диалога.
|
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Не модал, но может Вам подойдёт:
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Если помотреть реализацию MFC CDialog::DoModal, можно увидеть, что недоступность parent-окна диалога достигается просто и незамысловато -
Далее. Видимо, ваше главное окно-диалог не дизэблит всех своих потомков, наверное, в диалоге это не предусмотрено. Ну так добавьте сами обработку WM_ENABLE в главном диалоге. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
oper54
вы меня не правильно поняли. Мне окно wch и не нужно делать модальным. Мне нужно модальным делать оно w_m, при этом чтобы не было доступа ни в какое другое окно приложения. Earnest
Сейчас именно так и делаю, но нельзя ли сразу окно как-то "совсем модальным" сделать, чтобы вручную все дочерние окна не тормошить? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
По-видимому, нет. Так как W_m не воспринимает W_ch как родителя.
|
|||
|
||||
| Гость_Амортизатор |
|
|||
|
Unregistered |
Скорее всего это невозможно. Дочернее окно вызывается из родительского окна и наверное только по отношению к нему и может быть модальным.
|
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Собственно, я имела в виду не тормошить каждое дочернее окно, а написать обработчик WM_ENABLE в главном диалоге, откуда разослать всем дочерним окнам соответствующее сообщение - примерно, как это делает CFrameWnd в своем обработчике OnEnable:
Это часть кода функции CFrameWnd::NotifyFloatingWindows. Отсюда можно взять способ получения всех порожденных окон и послать им WM_ENABLE. А сделать окно "совсем модальным" только с помощью флагов, боюсь, действительно не получится. -------------------- ... |
||||
|
|||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Спасибо, попробую так.
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Кстати. Отличнаямысль ловить WM_ENABLE !
Всего одна функция: void W_main::OnEnable(BOOL bEnable) { CDialog::OnEnable(bEnable); wch->EnableWindow(bEnable); } И все как надо работает! Всем спасибо. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |