Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Переопределение деструктора CDialog


Автор: Fobos 12.8.2010, 23:58
Пишу в основном на шарпе, если на C++ приходится, то в основном встречаюсь с функциональным программированием, а тут надо написать прогу в MFC и что-то меня заклинило. Задача такая: в приложении надо работать с сетью, у меня возник вопрос когда очищать ресурсы - сокет и библиотеку WSAStartup. Проблема проявляется как бы в двух ипостасях:
Первая: в шарпе я мог перехватить событие OnClose окна и я точно знал, что когда окно будет закрываться - неважно как, я его перехвачу и смогу что-то обработать и дальше оно закроется. В MFC я не смог найти такой обработчик который бы позволил мне всегда выполнять очищающий код. Попробовал сначала ловить OnClose() - получалось что я перехватывал управление только при нажатии крестика в правом углу диалога, а при нажатии кнопок OK и CANCEL не перехватывал. Т.е. получается надо перехватывать еще и их, OnOk() и  OnCancel() и вызывать один и тот же код.
Вторая: Решил тогда так: инициализировать библиотеку бууд в конструкторе окна, а очищать в деструкторе чтобы всегда и в одном месте очищать, а не по трем обработчикам, но задумался. В коде класса диалога я деструктор не нашел, но не может ли MFC генерировать за меня деструктор диалога и там очищать какие-нибудь ресурсы окна? Тогда если я определю свой деструктор, то мне надо очистить помимо своих еще и ресурсы окна,  но я не знаю какие и могу накосячить.
Итого два вопроса: 
1. Какой обработчик нужно вызывать чтобы он всегда вызывался при закрытии окна.
2. Генерирует ли MFC за меня деструктор класса окна диалога и если да, то как бы мне и свою очистку выполнить и то что там система генерирует сделать.
P.S. Ну и буду признателен за предложения по организации проги: когда лучше инициализировать сокеты и когда освободить.

Автор: 13dreams 13.8.2010, 09:01
ON_WM_DESTROY()  должно работать при любом завершении диалога

Автор: Earnest 13.8.2010, 10:17
Во-первых, ты не можешь "переопределить" деструктор - только дополнить, ибо базовый вызывается всегда. 
Можно делать очистку и на деструкторе, но смотря какую. Важно понимать, что деструктор - это разрушение объекта, а не окна. Окно может быть убито и задолго до попадания в деструктор.
Во-вторых, как сказал 13dreams, лови WM_DESTROY, это сообщение приходит всегда, если окно связано с MFC-объектом. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)