![]() |
|
![]() ![]() ![]() |
|
Rapalex |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Создаю немодальный диалог гдето так:
Удаляю так:
И обработчики OnClose и OnDestroy невызываются. OnDestroy вызвался только когда при открытом немодальном диалоге я нажал на кнопку закрытия главного окна. Вообще задачя сохранить положение и состояние окна в реестре (это проблем не вызовет). -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
||||
|
|||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
Я точно не помню, но вроде немодальное окно при нажатии его крестика не закрывается, а прячится.
|
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Ну на счёт крестика у меня проблемма обычно при нажатии на крестика окна у меня вызывалась функция OnCancel и такой расклад вполне нормален.
А щяс почемуто не вызывается (потом задам такой вопрос если что ![]() -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
vvpC |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 20.5.2006 Где: Москва Репутация: нет Всего: нет |
||||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
vvpC, попробывал тогда WM_DESTROY приходит, это хорошо, спасибо, а другие альтернативы есть?
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
WM_DESTROY всегда посылается перед уничтожением окна. Только вот, если просто делать delete, происходит это в деструкторе CWnd, когда от твоего класса рожки да ножки остались.
Так что vvpC прав: нужно явно вызывать DestroyWindow. Кстати, если бы ты внимательно смотрел сообщения в output-окне, то увидел бы предупреждение, что-то вроде: "Караул! Вызов DestroyWindow в деструкторе CWnd!". Чтобы не писать каждый раз DestroyWindow, можно делать это в деструкторе своего класса. Тогда можно просто писать delete pWnd. -------------------- ... |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
![]() Что и говорить - глупое проектирование MFC. Конструкторы не создают окошки, деструкторы не разрушают ![]() |
|||
|
||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
глупо... не глупо! |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Напиши свой деструктор, который будет разрушать окно. Почему стандартный деструктор C++ должен разрушать какие-то окна? И MFC тут непричем: ее сложно назвать идеалом, но в данном случае - это твоя личная глупость. Нужно просто изучать матчасть. Или писАть на бейсике. -------------------- ... |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Не надо ссорится.
![]() Я (с вашей помощью пришол к выводу) в начяле вызывааю функцию DestroyWindow а потом делаю delete указалелю. Теперь принажатии на крестик приходит событие OnClose и тоже самое делаю при нажатии не кнопку "Отмена". Вроде всё работает, но мне очень не нравится в каждом месте программы писать 2 строчки удаления окна. Если нет других предложений то темму можно закрывать. -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Rapalex, внимательнее читай: добавь вызов DestroyWindow в деструктор своего класса окна, и пиши только одну строчку (delete pWnd).
Есть еще MFC-альтернатива: делать delete this в обработчике PostNcDestroy, как делают многие MFC-классы. Тогда тоже можно будет писать одну строчку (DestroyWindow). Но это не очень хорошо с точки зрения ООП (где-то хранящийся указатель может стал недействительным без видимых причин). Впрочем, раз MFC так делает, то не стоит пытаться быть святее папы римского. Все зависит от контекста: иногда это вполне удобно. -------------------- ... |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
||||
|
||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
Вдруг надо в экземпляр производнова от окна класса записать какие-нибудь настройки и только потом создать окно. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А каким образом компилятор может узнать, что твой класс - это окно, которое нужно разрушить? А может, это база данных, от которой надо отсоединиться? А может - словарь, который надо очистить? Они и предусмотрели: написали в документации и поставили в деструктор CWnd предупреждение. -------------------- ... |
|||
|
||||
Любитель |
|
||||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Ну и пусть вызываются всякие виртуальные функции вроде PreCreateWindow. ![]()
Млин, ну я же не совсем дурак... Я имею в виду, что это должен делать класс CWnd => и все наследованные от него (хотя конструктор наследуемого класса можно конечно и игнорить). Во всех библиотеках делается именно так, по моему, достаточно разумно. Ещё лучше пусть будет метод Create. Безаргументным конструктором он не вызывается, но есть конструктор с аргументами автоматом вызывающий Create. Аналогично можно разрушать окошко когда хотим, но если мы этого не сделали, то пусть деструктор будет добр поработать за нас. Вспомните классы std::fstream - мы можем сразу открыть файл, а можем и не открывать; можем закрыть, если нужно, а можем смело забить на это. Таким образом класс действительно инкапсулирует в себе все нужные операции. MFC-шные классы окошек спроектированы так, будто окошко существует независимо оот объекта. Допустим оно действительно может существовать независимо, но это совсем другая история... Проектируя библиотеку ГУИ надо было позаблтиться о единстве объекта и физического окошка. |
||||
|
|||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
Любитель, На самом деле можно найти пример когда кто-нибудь бы пострадал от создания окон в конструкторах. Объект окна создается, но прежде чем создать окно ждет каких-либо данных.
А вот от того как сделано вряд ли кто-нибудь сильно страдает. |
|||
|
||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Так он это и делает (деструктор CWnd разрушает окно). Но ведь к этому моменту твой класс уже разрушен - сообщение WM_DESTROY посылается, но твоего объекта уже нет, и приходит оно базовому классу, о чем и предупреждается. Это уже С++ - из конструктора-деструктора нельзя вызывать виртуальные функции. Т.е. можно, но получишь не то, что ожидаешь... Что касается класса fstreem - это совсем другое дело. Ты часто создаешь производные от него классы? Или все таки пользуешься именно fstream?
Физическое окошко находится вне компетенции MFC. MFC не является шедевром дизайна (вспомните сколько ей лет), она всего лишь тонкая оболочка над WinAPI, чем и ценна, с моей точки зрения. -------------------- ... |
||||
|
|||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
Вот, да это основное великолепие. Именно этого не могут понять люди переходящие с VCL, за сложностью не видят гибкости. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Попробуй найти! В конце концов можно создавать объекты на хипе. Согласен. Из-за привязанности к WinAPI в MFC получается на мой взгляд слабая привязанность к нормальной объектно-ориентированной модели. Это не есть плохо, но есть неприятно... |
|||
|
||||
lemax |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 14.10.2007 Репутация: нет Всего: 1 |
НАПОМИНАНИЕ.
В ДИСТРУКТОРЕ ЗАПРЕЩЕН КОД КОТОРЫЙ МОЖЕТ СОЗДАВАТЬ ИСКЛЮЧЕНИЯ Почему: При исключении начинает высвобождаться память. А так как память объекта на который указат this , еще не высвобождено, то повторно будет вызываться диструктор (*this). Может зациклит не по детски. В конструкторе тоже не стоит использовать код, бросающий исключения |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
lemax, это в том смысле, что ты еще в июле 2006 впал в анабиоз, и вот только очнулся???
Только дата поста может извинить его ... гм... глубокомыслие ![]() -------------------- ... |
|||
|
||||
lemax |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 14.10.2007 Репутация: нет Всего: 1 |
А при чем здесь дато поста? Когда я пытаюсь найти решение своей проблемы, то мне по барабану на дату, когда ее решили. А в этой теме есть кадры, которые порываются возложить на диструктор обязанности, которые ему не свойственны, и это очень опасно. Надо же образумить чуваков. Мало ли кто еще (как я) зайдет сюда лет через 200. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |