Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему не вызывается деструктор?

284
15 октября 2005 года
michael_is_98
587 / / 25.02.2005
Я создал класс на основе CframeWnd такой, который бы отображал окно до тех пор,
пока пользователь его не закроет (т.е. программа создает экземпляр этого класса, вызывает метод PokasatModalno() - на этой точке открывается модальный фрейм, возврат из метода - по закрытии фрейма). Т.е. что-то наподобие ShowModal в Delphi.
Вот исходный код
Код:
class CGraphWin: public CFrameWnd
{
public:
    CGraphWin(CWnd *);
    void PokasatModalno();
    afx_msg void OnClose(void);
    afx_msg void OnPaint(void);
    afx_msg void OnSize( UINT, int, int);
    afx_msg void OnDestroy();
    afx_msg void OnCommand_Vihod();
private:
    CWnd *pWnd; // родительское окно, к которому прикрепляется "модальный фрейм"
    ...
}

Вот конструктор
 
Код:
CGraphWin::CGraphWin(CWnd *pWnd_=NULL):CFrameWnd()
{
    pWnd=pWnd_;

    // создание окно фрейма с меню
    Create(NULL, "График", WS_OVERLAPPEDWINDOW, rectDefault, pWnd, "GRAPHMENU");
}

Теперь самое интересное - метод PokasatModalno и обработчик OnClose
Код:
void CGraphWin::PokasatModalno(void)
{
    pWnd->EnableWindow(FALSE);
       
    RunModalLoop(MLF_SHOWONIDLE); // ждет пока не будет вызван EndModalLoop

    BOOL b=pWnd->EnableWindow(TRUE);
}

afx_msg void CGraphWin::OnClose()
{
    // завершить цикл обработки сообщений
    EndModalLoop(0);
}

Таким образом описав этот класс можно его использовать, предположим в главном окне приложения при обработке выбора пункта меню пишем:
 
Код:
afx_msg void CMainWin::OnCommand_Risov()
{
    CGraphWin *gw=new CGraphWin(this);
    gw->PokasatModalno();
    delete gw;

}

Все работает, окно CGraphWin отображается как модальный фрейм, его можно закрывать, снова открывать, но обработчик
OnDestroy в CGraphWin не вызывается!

После закрытия главного окна приложения в окне Output появляется предупреждение
Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.

Кто-нибудь может помочь разобраться, в чем дело?
Страницы:
351
09 ноября 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by michael_is_98
интересует лишь один аспект - это масштабирование.
Проценты и пропорции - к чему это?



к масштабированию.... ты знаешь чем мужчины отличаются от женщин ? ответ : у мужчин более развито абстрактное мышление что дает им способность решать задачи для которых пока еще не было найдено решение никем... так вот тебе надо развивать абстрактное мышление... ООП тебе в этом поможет....

284
10 ноября 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by PitxBull
к масштабированию.... ты знаешь чем мужчины отличаются от женщин ? ответ : у мужчин более развито абстрактное мышление что дает им способность решать задачи для которых пока еще не было найдено решение никем... так вот тебе надо развивать абстрактное мышление... ООП тебе в этом поможет....


У женщин развито конкретное мышление, она более точна в деталях. Этого сейчас не хватает. Масштабирование - решенная задача. Не думаю, что здесь можно создать что-то новое.

284
10 ноября 2005 года
michael_is_98
587 / / 25.02.2005
http://www.codeguru.com/Cpp/controls/controls/chartingandanaloguecontrols/article.php/c9309/

один из компонент для вывода графики. Бегло просмотрев понял, что там используется иной подход - наподобие того, что мы обсуждали ранее.
Т.е. там все организовано с помощью метода наподобие Output(&dc).
351
10 ноября 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by michael_is_98
http://www.codeguru.com/Cpp/controls/controls/chartingandanaloguecontrols/article.php/c9309/

один из компонент для вывода графики. Бегло просмотрев понял, что там используется иной подход - наподобие того, что мы обсуждали ранее.
Т.е. там все организовано с помощью метода наподобие Output(&dc).



Ты наверное когда учился в школе много списывал....не знаю кому как, но я разработчик, и мне доставляет удовольствие решать задачи самому, а не искать готовые ответы, помимо этого сие есть единственный способ развития интеллекта. А масштабирования вообще очень простая задача что б я ее еще раз с кем то обсуждал.... решение очень простое : PixelsPerUnit.

351
10 ноября 2005 года
PitxBull
633 / / 22.12.2004
на тему ссылки.... приведенное там решение очень громоздкое и неуклюжее. Автор конечно может заявить что использовал паттерн Facade, но за этим кроется просто плохое объектно-ориентированное решение. Помимо всего прочего бегло простмотрев не нашел там никаких признаков функции Output, что говорит о перегруженности интерфейса и неправильной декомпозиции задачи.
284
11 ноября 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by PitxBull
Ты наверное когда учился в школе много списывал....не знаю кому как, но я разработчик, и мне доставляет удовольствие решать задачи самому, а не искать готовые ответы, помимо этого сие есть единственный способ развития интеллекта. А масштабирования вообще очень простая задача что б я ее еще раз с кем то обсуждал.... решение очень простое : PixelsPerUnit.


Я спросил у профессора, занимался ли он сглаживанием временных рядов, на что он ответил - никогда в жизни. Тогда я спросил, неужели он не знает как сглаживаются временные ряды, он ответил, что знает и сослался на авторов, которые достигли в этом больших успехов.
К чему это? К тому, что невозможно знать все... Невозможно заниматься всем и знать это до деталей... Компонент для вывода графики не является самоцелью. Я реализовал его в очень упрощенному виде и вижу один из многих его недостатков - масштабирование.
Что такое PixelsPerUnit?

351
12 ноября 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by michael_is_98
Я спросил у профессора, занимался ли он сглаживанием временных рядов, на что он ответил - никогда в жизни. Тогда я спросил, неужели он не знает как сглаживаются временные ряды, он ответил, что знает и сослался на авторов, которые достигли в этом больших успехов.
К чему это? К тому, что невозможно знать все... Невозможно заниматься всем и знать это до деталей... Компонент для вывода графики не является самоцелью. Я реализовал его в очень упрощенному виде и вижу один из многих его недостатков - масштабирование.



:))))))

Цитата:
Originally posted by michael_is_98

Что такое PixelsPerUnit?



ты по английски читать умеешь ? по всей видимости нет.

284
14 ноября 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by PitxBull
:))))))
ты по английски читать умеешь ? по всей видимости нет.


Посмотри ссылку
http://www.rsdn.ru/Forum/Message/77668.htm

351
14 ноября 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by michael_is_98
Посмотри ссылку
http://www.rsdn.ru/Forum/Message/77668.htm



Чем ты хотел меня там удивить ? тривиальное решение тривиальной задачи на уровне наверно 2 или 3 класса средней школы...

351
14 ноября 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by PitxBull
Чем ты хотел меня там удивить ? тривиальное решение тривиальной задачи на уровне наверно 2 или 3 класса средней школы...



имеется ввиду что математический аппарат необходимый и достаточный для решений задачи изучается во 2 или 3 классе средней школы...

351
14 ноября 2005 года
PitxBull
633 / / 22.12.2004
изучив приведенные там решения.... их не в коей мере нельзя назвать профффесиональными решениями... дилетантское решение дилетантских проблем...помимо всего прочего проблема имеет неправильное название... масштабирование осей это совсем другое ( когда например необходмо отобразить какой либо участок графика подробнее ). А это можно назвать автоматическое вычисление шага делений на какой-либо оси. :D :D :D
2.4K
15 ноября 2005 года
dinasok51
219 / / 12.11.2005
michael_is_98

отвечаю на твой главный вопрос
а то за хамской трескотней PitxBullя изначальный смысл темы затерялся.

Вот выдержка из MSDN, которая как раз объясняет твой главный вопрос!!!

Могу, если нужно, ключевые моменты изложить по-русски
==================================================
PRB: "Warning: Calling DestroyWindow in CWnd::~CWnd" Message

Q105081


--------------------------------------------------------------------------------
The information in this article applies to:

The Microsoft Foundation Classes (MFC), used with:
Microsoft Visual C++ for Windows
Microsoft Visual C++ 32-bit Edition

--------------------------------------------------------------------------------


SYMPTOMS
The following warnings are displayed when a debug version of a program is executed and TRACE() diagnostics are enabled:




Warning: calling DestroyWindow in CWnd::~CWnd
OnDestroy or PostNcDestroy in derived class will not be called



CAUSE
The above warnings are displayed by the CWnd::~CWnd() destructor. The warnings indicate the following:



The programmer has most likely called "delete" on a CWnd object rather than DestroyWindow().


An object derived from CWnd is not performing a DestroyWindow() call in its destructor.


Because the DestroyWindow() call is executed in the destructor for CWnd, only the CWnd portion of the CWnd-derived object is remaining when the DestroyWindow() is called. Thus, if you have a CWnd-derived object and receive this warning, the derived object's virtual functions will not exist and the CWnd functions will be called instead.





RESOLUTION
MFC Technote #17 contains more information on how to properly destroy a Window object and states the following cardinal rule:




To destroy a C++ Windows object, use DestroyWindow, not "delete".


Also, examining CWnd::~CWnd() will reveal that the foremost task of the destructor is to ensure that the associated Windows window object has been destroyed. If a program calls DestroyWindow() before the CWnd destructor is called, the m_hWnd data member will be NULL, the TRACE0() messages will not occur, and DestroyWindow() will not be called in CWnd::~CWnd().
===================================================

Остальные проблемы заключаются в том, что когда окно разрушается обработчик событий этого окна уже не работает и бессмыслено уповать на какие-либо MESSAGE

Если интересно, собери все свои вопросы в 1 пост,
попробую на них ответить, т.к. в аналогичную яму сам попадал.
351
15 ноября 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by dinasok51
michael_is_98

отвечаю на твой главный вопрос
а то за хамской трескотней PitxBullя изначальный смысл темы затерялся.

Вот выдержка из MSDN, которая как раз объясняет твой главный вопрос!!!

<skip>
<skip>
<skip>



еще один ламер возомнивший себя гениальныи программистом :))))) если ты внимательно прочитаешь все мои ответы то увидишь что на этот вопрос я уже ответил в гораздо более лаконичной и доступной форме. К тому же проблема связанная с этим вопросом уже давно решена и обсуждение перешло на другие темы.

2.4K
16 ноября 2005 года
dinasok51
219 / / 12.11.2005
michael_is_98

запустил бы ты новую тему
если тебе еще интересно про масштабирование

а то бессодержательные и оскорбительные посты PitxBullя так все замусорили...
284
16 ноября 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by dinasok51
michael_is_98

запустил бы ты новую тему
если тебе еще интересно про масштабирование

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


Спасибо большое коллеги!
Ваша помощь очень важна.
В принципе вопрос можно считать исчерпанным. То, что помимо рассматривалось, к теме действительно не относится, но было нелишне. Скорее тему можно было бы назвать "Граф. библиотека"

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог