![]() |
|
![]() ![]() ![]() |
|
xTr1m |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
День добрый, есть у меня программа, в которой, время от времени, терялась модальность диалогов. Долго копался и нашел такое:
Пусть есть три класса диалога CDialog1, CDialog2, CDialog3. У CDialog1 есть кнопка, код ее примерно такой:
В классе CDialog2 есть обычный метод:
То есть в еще не показавшемся CDialog2 мы модально вызываем CDialog3. Штука в том, что после закрытия CDialog3 модальность CDialog2 пропадает!! Код утрированный, но наглядно показывает проблему. А может это не баг вовсе, а фича? Хотя я не верю, что я первый столкнулся с такой ситуацией. Кто, что думает? |
||||
|
|||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Оказывается можно еще проще воспроизвести. Создаем новый проект на основе диалога. На диалоге делаем кнопку, в которой вызываем окно About.
А в OnInitDialog CAboutDlg делаем AfxMessageBox. Все, модальность диалога About пропадает. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Пропадает не модальность, а недоступность главного окна. Там все просто - в MFC при входе в модальный цикл окну-родителю делается enable (false), а при выходе, соответственно, Enable (true). На самом деле немного сложнее, учитывается состояние окна. Но OnInitDialog вызывается еще вне модального цикла, вот и разгадка. А не надо вызывать другие диалоги из OnInit, вот и все. Или, соответственно, подкрутить enable, если невтерпеж.
-------------------- ... |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Спасибо. Про то, что модальность есть "просто" disable родительского окна я уже понял (когда пытался разобраться). Однако, ведь если просто сделать недоступным родительское, то модальное тоже блокируется. Может там просто нужно по-глубже копнуть, посмотрим, может и полезу. Вообще проблема следующая. Как мне удалось выяснить, если в OnInitDialog вызвать не модальное окно, а обычное (причем явно указать парент, без этого не работает), то все хорошо. Реальная ситуация такая: я вызываю диалог, в OnInit'е которого делаю загрузку из БД. В этот момент может появиться диалог ожидания (с кнопкой отмены. Так вот этот диалог все и портит. Его переделали на немодальный, но как указать ему парента, который еще не создан. Можно конечно пропихивать указатель, но таких мест много, да и костыль это.
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 4 Всего: 85 |
xTr1m, в онините пошлите постмессидж wm_user , этому-же диалогу
в обработчике wm_user загружайте бд и выводите любой диалог. |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Вот это интересный вариант решения, спасибо. Хотя опять же для всех существующих диалогов переделывать на это сложновато, но все равно идея красивая.
И все-таки я склонен называть это скорее багом MFC, нежели фичей =) |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Баг обеспечиваете вы, прерывая процесс инициализации. Система послав WM_INITDIALOG, ждёт результата его обработки, а тут AfxMessageBox с ручным тормозом... Зачем вмешательство пользователя на данном этапе? Для этого существует очередь, вот и отправляйте пользователя туда ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Неправильно ты понял. Модальность == собственный цикл обработки сообщений. А деактивация родительского окна (и других) - это опция, причем необязательная. И никак это модальности не мешает. Другое дело, что пользователь может потыкать в другие окна, перекрыть текущий диалог и т.д. Поэтому обычно и дизэблят. -------------------- ... |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Про собственный цикл не знал, обязательно почитаю. Спасибо.
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |