Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > Баг /небаг с модольностью |
Автор: xTr1m 10.1.2013, 17:39 | ||||
День добрый, есть у меня программа, в которой, время от времени, терялась модальность диалогов. Долго копался и нашел такое: Пусть есть три класса диалога CDialog1, CDialog2, CDialog3. У CDialog1 есть кнопка, код ее примерно такой:
В классе CDialog2 есть обычный метод:
То есть в еще не показавшемся CDialog2 мы модально вызываем CDialog3. Штука в том, что после закрытия CDialog3 модальность CDialog2 пропадает!! Код утрированный, но наглядно показывает проблему. А может это не баг вовсе, а фича? Хотя я не верю, что я первый столкнулся с такой ситуацией. Кто, что думает? |
Автор: xTr1m 11.1.2013, 15:36 |
Оказывается можно еще проще воспроизвести. Создаем новый проект на основе диалога. На диалоге делаем кнопку, в которой вызываем окно About. А в OnInitDialog CAboutDlg делаем AfxMessageBox. Все, модальность диалога About пропадает. |
Автор: Earnest 15.1.2013, 12:23 |
Пропадает не модальность, а недоступность главного окна. Там все просто - в MFC при входе в модальный цикл окну-родителю делается enable (false), а при выходе, соответственно, Enable (true). На самом деле немного сложнее, учитывается состояние окна. Но OnInitDialog вызывается еще вне модального цикла, вот и разгадка. А не надо вызывать другие диалоги из OnInit, вот и все. Или, соответственно, подкрутить enable, если невтерпеж. |
Автор: xTr1m 16.1.2013, 21:26 |
Спасибо. Про то, что модальность есть "просто" disable родительского окна я уже понял (когда пытался разобраться). Однако, ведь если просто сделать недоступным родительское, то модальное тоже блокируется. Может там просто нужно по-глубже копнуть, посмотрим, может и полезу. Вообще проблема следующая. Как мне удалось выяснить, если в OnInitDialog вызвать не модальное окно, а обычное (причем явно указать парент, без этого не работает), то все хорошо. Реальная ситуация такая: я вызываю диалог, в OnInit'е которого делаю загрузку из БД. В этот момент может появиться диалог ожидания (с кнопкой отмены. Так вот этот диалог все и портит. Его переделали на немодальный, но как указать ему парента, который еще не создан. Можно конечно пропихивать указатель, но таких мест много, да и костыль это. |
Автор: volatile 16.1.2013, 23:43 |
xTr1m, в онините пошлите постмессидж wm_user , этому-же диалогу в обработчике wm_user загружайте бд и выводите любой диалог. |
Автор: xTr1m 17.1.2013, 10:31 |
Вот это интересный вариант решения, спасибо. Хотя опять же для всех существующих диалогов переделывать на это сложновато, но все равно идея красивая. И все-таки я склонен называть это скорее багом MFC, нежели фичей =) |
Автор: Earnest 23.1.2013, 13:59 | ||
Неправильно ты понял. Модальность == собственный цикл обработки сообщений. А деактивация родительского окна (и других) - это опция, причем необязательная. И никак это модальности не мешает. Другое дело, что пользователь может потыкать в другие окна, перекрыть текущий диалог и т.д. Поэтому обычно и дизэблят. |
Автор: xTr1m 28.1.2013, 07:07 |
Про собственный цикл не знал, обязательно почитаю. Спасибо. |