|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
19.04.2019, 07:47 | #1 |
Заблокирован
Регистрация: 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. |
19.04.2019, 09:12 | #2 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
Цитата:
а значит посылать никому ничего не нужно и можно спокойно разрушаться самому (A). Цитата:
программа — запись алгоритма на языке понятном транслятору
|
||
19.04.2019, 09:45 | #3 |
Заблокирован
Регистрация: 17.12.2018
Сообщений: 514
|
Проблема решена: пометил значением WPARAM источник WM_CLOSE и перенёс вызов из WM_DESTROY в WM_CLOSE.
|
19.04.2019, 10:28 | #4 |
Заблокирован
Регистрация: 17.12.2018
Сообщений: 514
|
|
24.04.2019, 15:39 | #5 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
Цитата:
++ и отметить что данное окно ("w") в соответствующем A уже уничтожается (=null) т.е. сделать это самому.
программа — запись алгоритма на языке понятном транслятору
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Оконная процедура не получает сообщение о выходе мыши за пределы окна | 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 |