Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2019, 07:47   #1
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию Можно ли по дескриптору окна определить, получала ли оконная процедура WM_CLOSE?

Есть класс окна, назовём его "w", у него есть оконная процедура. Есть ООП-нутый класс, назовём его A. Есть функция, назовём её f, она должна удалять все экземпляры A. Каждому окну класса "w" соответствует экземпляр A и наоборот. При закрытии окна надо вызвать деструктор A, а при удалении экземпляра A надо закрыть окно. Очевидно, что при закрытии окна оно получает сначала WM_CLOSE, потом WM_DESTROY. Очевидно также, что при удалении экземпляра A вызывается деструктор A. Очевидное решение: в ветви case WM_DESTROY: оконной процедуры окна класса "w" вызывать функцию, которая вызовет деструктор A для соответствующего экземпляра A. Казалось бы, всё нормально. Но тогда окна остаются открыты при вызове f. Очевидное решение: в деструкторе A вызывать SendMessage для отправки окну, соответствующему данному экземпляру, сообщения WM_CLOSE, а из оконной процедуры никаких вызывающих деструктор A функций не вызывать. Но тогда при закрытии окна мышью объект продолжит существовать. Если же в ветви case WM_DESTROY: оконной процедуры окна класса "w" вызывать функцию, которая вызовет деструктор A для соответствующего экземпляра A, а в деструкторе A вызывать SendMessage для отправки окну, соответствующему данному экземпляру, сообщения WM_CLOSE, то каждое окно класса "w", закрываемое мышью, получает и WM_CLOSE, и WM_DESROY дважды: при закрытии окна мышью оконная процедура получает WM_CLOSE за ней следует WM_DESTROY, при обработке WM_DESTROY вызывается функция, удаляющая соответствующий экземпляр A, в результате вызывается деструктор A, он посылает сообщение WM_CLOSE, а за ним опять следует WM_DESTROY, снова вызывается функция удаления соответствующего экземпляра A, но она уже не находит, что надо удалять и удалить повторно не пытается. Если же вызвать f, то дублируются не только сообщения, но и деструктор A вызывается дважды для одного экземпляра: f выполняет delete для указателя на экземеляр A, вызывается деструктор A, он посылает WM_CLOSE соответствующему окну, за ним следует WM_DESTROY, оконная процедура вызывает функция удаления соответствующего экземпляра A, снова вызывается деструктор A но для того же экземпляра A, так как именно он соответствует окну, получивишему WM_CLOSE и WM_DESROY при первом вызове деструктора A, он посылает WM_CLOSE соответствующему окну, за ним следует WM_DESTROY и после обработки WM_DESTROY и завершения обоих экземпляров деструтора приложение падает. Можно как-то по дескриптору определить, что WM_CLOSE уже посылалось, чтоб второй раз не посылать?

Последний раз редактировалось taras-proger77; 19.04.2019 в 09:44.
taras-proger77 вне форума Ответить с цитированием
Старый 19.04.2019, 09:12   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Очевидное решение: в ветви case WM_DESTROY: оконной процедуры окна класса "w" вызывать функцию, которая вызовет деструктор A для соответствующего экземпляра A.
++ и отметит что данное окно ("w") в соответствующем A уже уничтожается (=null)
а значит посылать никому ничего не нужно и можно спокойно разрушаться самому (A).
Цитата:
Очевидное решение: в деструкторе A вызывать SendMessage для отправки окну, соответствующему данному экземпляру, сообщения WM_CLOSE, а из оконной процедуры никаких вызывающих деструктор A функций не вызывать.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 19.04.2019, 09:45   #3
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Проблема решена: пометил значением WPARAM источник WM_CLOSE и перенёс вызов из WM_DESTROY в WM_CLOSE.
taras-proger77 вне форума Ответить с цитированием
Старый 19.04.2019, 10:28   #4
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
++ и отметит что данное окно ("w") в соответствующем A уже уничтожается (=null)
а значит посылать никому ничего не нужно и можно спокойно разрушаться самому (A).
Тест показал обратное.
taras-proger77 вне форума Ответить с цитированием
Старый 24.04.2019, 15:39   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Тест показал обратное.
приношу свои извинения
++ и отметить что данное окно ("w") в соответствующем A уже уничтожается (=null)
т.е. сделать это самому.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оконная процедура не получает сообщение о выходе мыши за пределы окна taras-proger Общие вопросы C/C++ 1 12.11.2014 20:39
Как из 32бит проги узнать имя 64бит процесса по дескриптору окна? Diego__ Win Api 2 07.12.2010 20:38
Одна оконная процедура TGrey[WoLf] Win Api 6 22.06.2010 00:30
Оконная процедура HunterMan Win Api 5 04.06.2008 12:10
Нужно получить все компоненты чужого окна по дескриптору 3lander Win Api 12 28.11.2007 20:41