Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Немодальное окно диалога! Не могу поймать закрытие!!! 
:(
    Опции темы
Rapalex
Дата 14.7.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



Создаю немодальный диалог гдето так:
Код

    m_poDlg = new CDlg;
    m_poDlg->Create(this);  // Это моя функция
    m_poDlg->ShowWindow(SW_SHOWNORMAL);


Удаляю так:
Код

    delete m_poDlg;
    m_poDlg = NULL;


И обработчики OnClose и OnDestroy невызываются.

OnDestroy вызвался только когда при открытом немодальном диалоге я нажал на кнопку закрытия главного окна.

Вообще задачя сохранить положение и состояние окна в реестре (это проблем не вызовет).
 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Dray
Дата 14.7.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Я точно не помню, но вроде немодальное окно при нажатии его крестика не закрывается, а прячится. 


--------------------
忍者

user posted image
PM MAIL   Вверх
Rapalex
Дата 14.7.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



Ну на счёт крестика у меня проблемма обычно при нажатии на крестика окна у меня вызывалась функция OnCancel и такой расклад вполне нормален.
А щяс почемуто не вызывается (потом задам такой вопрос если что  smile ), я пока поставил кнопку "Отмена" и в ней нодительскому окну посылаю сообщение о просьбе закрыть немодальный диалог и он зарывается набраным мной кодом (см. выше). 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
vvpC
Дата 14.7.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Rapalex @  14.7.2006,  14:27 Найти цитируемый пост)
И обработчики OnClose и OnDestroy невызываются.

это обработчики сообщений винды WM_CLOSE и WM_DESTROY и естественно что они не вызываются - они же не посылаются окну.. Немодальные окна следует уничтожають вызовом DestroyWindow
 
PM MAIL WWW   Вверх
Rapalex
Дата 14.7.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



vvpC, попробывал тогда WM_DESTROY приходит, это хорошо, спасибо, а другие альтернативы есть? 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 14.7.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



WM_DESTROY всегда посылается перед уничтожением окна. Только вот, если просто делать delete, происходит это в деструкторе CWnd, когда от твоего класса рожки да ножки остались.
Так что vvpC прав: нужно явно вызывать DestroyWindow. Кстати, если бы ты внимательно смотрел сообщения в output-окне, то увидел бы предупреждение, что-то вроде: "Караул! Вызов DestroyWindow в деструкторе CWnd!". Чтобы не писать каждый раз DestroyWindow, можно делать это в деструкторе своего класса. Тогда можно просто писать delete pWnd. 


--------------------
...
PM   Вверх
Любитель
Дата 14.7.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



 smile 
Что и говорить - глупое проектирование MFC. Конструкторы не создают окошки, деструкторы не разрушают  smile 
 


--------------------
PM MAIL ICQ Skype   Вверх
Dray
Дата 15.7.2006, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Цитата(Любитель @  14.7.2006,  23:31 Найти цитируемый пост)
деструкторы не разрушают

глупо...
Цитата(Любитель @  14.7.2006,  23:31 Найти цитируемый пост)
Конструкторы не создают окошки

не глупо! 


--------------------
忍者

user posted image
PM MAIL   Вверх
Earnest
Дата 17.7.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Любитель @  15.7.2006,  00:31 Найти цитируемый пост)
Что и говорить - глупое проектирование MFC. Конструкторы не создают окошки, деструкторы не разрушают  

Напиши свой деструктор, который будет разрушать окно. Почему стандартный деструктор C++ должен разрушать какие-то окна? И MFC тут непричем: ее сложно назвать идеалом, но в данном случае - это твоя личная глупость. Нужно просто изучать матчасть. Или писАть на бейсике.
 


--------------------
...
PM   Вверх
Rapalex
Дата 17.7.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



Не надо ссорится.  smile 

Я (с вашей помощью пришол к выводу) в начяле вызывааю функцию DestroyWindow а потом делаю delete указалелю. Теперь принажатии на крестик приходит событие OnClose и тоже самое делаю при нажатии не кнопку "Отмена".

Вроде всё работает, но мне очень не нравится в каждом месте программы писать 2 строчки удаления окна. Если нет других предложений то темму можно закрывать. 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 17.7.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Rapalex, внимательнее читай: добавь вызов DestroyWindow в деструктор своего класса окна, и пиши только одну строчку (delete pWnd). 
Есть еще MFC-альтернатива: делать delete this в обработчике PostNcDestroy, как делают многие MFC-классы. Тогда тоже можно будет писать одну строчку (DestroyWindow). Но это не очень хорошо с точки зрения ООП (где-то хранящийся указатель может стал недействительным без видимых причин). Впрочем, раз MFC так делает, то не стоит пытаться быть святее папы римского. Все зависит от контекста: иногда это вполне удобно. 


--------------------
...
PM   Вверх
Любитель
Дата 17.7.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Цитата(Earnest @  17.7.2006,  08:16 Найти цитируемый пост)
 Почему стандартный деструктор C++ должен разрушать какие-то окна?

Потому что разработчики MFC должны были это предусмотреть ;)

Цитата(Dray @  15.7.2006,  02:32 Найти цитируемый пост)
не глупо!

ПОЧЕМУ??? 


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


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Цитата(Любитель @  17.7.2006,  22:14 Найти цитируемый пост)
ПОЧЕМУ??? 

Вдруг надо в экземпляр производнова от окна класса записать какие-нибудь настройки и только потом создать окно. 


--------------------
忍者

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


Эксперт
****


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

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



Цитата(Любитель @  17.7.2006,  23:14 Найти цитируемый пост)
Потому что разработчики MFC должны были это предусмотреть ;)

А каким образом компилятор может узнать, что твой класс - это окно, которое нужно разрушить? А может, это база данных, от которой надо отсоединиться? А может - словарь, который надо очистить? Они и предусмотрели: написали в документации и поставили в деструктор CWnd предупреждение. 


--------------------
...
PM   Вверх
Любитель
Дата 22.7.2006, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Цитата

Вдруг надо в экземпляр производнова от окна класса записать какие-нибудь настройки и только потом создать окно

Ну и пусть вызываются всякие виртуальные функции вроде PreCreateWindow. smile 

Цитата

А каким образом компилятор может узнать, что твой класс - это окно, которое нужно разрушить? А может, это база данных, от которой надо отсоединиться? А может - словарь, который надо очистить? Они и предусмотрели: написали в документации и поставили в деструктор CWnd предупреждение

Млин, ну я же не совсем дурак... Я имею в виду, что это должен делать класс CWnd => и все наследованные от него (хотя конструктор наследуемого класса можно конечно и игнорить). Во всех библиотеках делается именно так, по моему, достаточно разумно. Ещё лучше пусть будет метод Create. Безаргументным конструктором он не вызывается, но есть конструктор с аргументами автоматом вызывающий Create. Аналогично можно разрушать окошко когда хотим, но если мы этого не сделали, то пусть деструктор будет добр поработать за нас. Вспомните классы std::fstream - мы можем сразу открыть файл, а можем и не открывать; можем закрыть, если нужно, а можем смело забить на это. Таким образом класс действительно инкапсулирует в себе все нужные операции. MFC-шные классы окошек спроектированы так, будто окошко существует независимо оот объекта. Допустим оно действительно может существовать независимо, но это совсем другая история... Проектируя библиотеку ГУИ надо было позаблтиться о единстве объекта и физического окошка. 


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


 




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


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

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