Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EnableWindow и модальное окно 
V
    Опции темы
deniska
Дата 24.6.2013, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



Ситуация:

есть dialog-based приложение, у него основное окно и куча других, у которых Parent-ом является основное. 
основное окно по таймеру делает какие то вещи, а потом заставляет всех child-ов перерисовать себя на основе новых данных (с помощью спец функции Update, кот есть у всех child-ов)

некий child "A" в определенный момент вызывает модальное окно, в результате чего перестает реагировать на действия пользователя (мышь-клава и тд) - это нормально и правильно

в это время  Parent обрабатывая определенную ситуацию, блокирует всех child-ов через CWnd::EnableWindow(FALSE) а  через несколько секунд опять разрешает их через CWnd::EnableWindow(TRUE). Вообще смысл этих телодвижений - запретить любую активность пользователя во всех окнах приложения на некоторое время.

так вот все это время, у childа "A" модальное окно все еще висит. После вызова CWnd::EnableWindow(TRUE) для childа "A", окно становится доступным для действий пользователя, хотя модальное окно висит.

Как избежать этой ситуации?
Надеюсь понятно описАл....
PM MAIL ICQ   Вверх
deniska
Дата 24.6.2013, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



Пока сделал блокировку ввода для всех окон через CWinApp::PreTranslateMessage c фильтром на мышиные и клавиатурные сообщения, за счет этого убрал портящие все CWnd::EnableWindow(FALSE/TRUE).

Как правильнее блокировать доступность приложения на действия пользователя, не используя CWnd::EnableWindow(FALSE) для всех окон приложения? (ну помимо того способа, что я только что написал)
PM MAIL ICQ   Вверх
Earnest
Дата 25.6.2013, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Да никак. Если ты заглянешь в код DoModal и чуть глубже, ты найдешь кучу EanbleWindow. Если ты сделаешь EnableWindow (true) (другим окнам) во время модального цикла, ввод в них будет доступен. Ибо модальность - это вовсе не недоступность других окон. Это просто отдельный цикл обработки сообщений. Так что делай аккуратно через EnableWindow. 
А еще лучше - сделай SDI-приложение. Не то, чтобы тебе это помогло насчет блокировки ввода, это по-прежнему сам. Но что-то многовато у тебя окон для диалогового приложения. А оно ведь ущербное в каком-то смысле, там нет нормального цикла обработки сообщений.

Добавлено через 1 минуту и 42 секунды
В SDI-приложении, кроме всего, можно сделать обновление доступности окон в цикле простоя на основе текущего состояния - через обработчики OnCmdMsg.


--------------------
...
PM   Вверх
deniska
Дата 25.6.2013, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



вот то, что EnableWindow (true) перебивает модальность окна, для меня оказалось неприятным сюрпрайзом...

Цитата

Но что-то многовато у тебя окон для диалогового приложения.

одновременно не более 3-х. не меньше 2-ух. окно "подложка" для полноэкранного режима, с инфой которая необходима всегда, и что-то еще, в зависимости от того что делает пользователь. 

Цитата

А оно ведь ущербное в каком-то смысле, там нет нормального цикла обработки сообщений

карта сообщений диалогового окна отличается от карты SDI-based? не очень понял...

в любом случае сделал
Цитата

Пока сделал блокировку ввода для всех окон через CWinApp::PreTranslateMessage c фильтром на мышиные и клавиатурные сообщения, за счет этого убрал портящие все CWnd::EnableWindow(FALSE/TRUE).

вроде это решило проблему малой кровью

PM MAIL ICQ   Вверх
Earnest
Дата 26.6.2013, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(deniska @  25.6.2013,  08:29 Найти цитируемый пост)
карта сообщений диалогового окна отличается от карты SDI-based? не очень понял...

Причем здесь карта сообщений? Ты поинтересуйся, как устроено тру-виндоус-приложение. Так вот, dialog-based - это такая нашлепка на спине слона. Все оно работает фактически во время инициализации виндоус-приложения, которое потом так и не стартует.


--------------------
...
PM   Вверх
deniska
Дата 26.6.2013, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



Цитата

dialog-based - это такая нашлепка на спине слона. Все оно работает фактически во время инициализации виндоус-приложения, которое потом так и не стартует

все это конечно красиво... кроме наличия/отсутствия "документ-вид" между SDI и диалоговым окном гугл мне отличий не дал, про это я был в курсе...

если есть желание - распишите чутка подробнее, что имели ввиду, или ссылку. с удовольствием прочту.
в любом случае СПАСИБО за участие smile 

Это сообщение отредактировал(а) deniska - 26.6.2013, 08:56
PM MAIL ICQ   Вверх
Earnest
Дата 27.6.2013, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Написала я достаточно подробно и совершенно конкретно, детали можно увидеть в коде, который мастер тебе сгенерировал. Не все же у Гугла спрашивать.  
Кроме отсутствия документа-вида у диалогового приложения напрочь отсутствует диспетчеризация командных сообщений. Которая, на мой взгляд, является едва ли не самым полезным в MFC-оболочке. И которая позволяет вполне изящно решать задачи, подобные твоей, а не лепить горбатого.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.