Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.70.203] |
|
Сообщ.
#1
,
|
|
|
Выдается предупреждение при закрытии приложения, не пойму где искать причину. Вот сообщение:
Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called. Просмотрел деструкторы всех классов программы, везде virtual. Или причина в другом? |
Сообщ.
#2
,
|
|
|
Тут описано, из за чего может проявится твоя проблема:
https://msdn.microsoft.com/ru-ru/library/5zba4hah.aspx Ты удаляешь окно неправильно, судя по всему. |
Сообщ.
#3
,
|
|
|
Цитата a_n_y_a @ Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called. Просмотрел деструкторы всех классов программы, везде virtual. Или причина в другом? DestroyWindow нельзя вызывать в деструкторе класса-наследника от CWnd, потому что там будут вызываны другие вмртуальные методы. |
Сообщ.
#4
,
|
|
|
Цитата Олег М @ Цитата a_n_y_a @ Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called. Просмотрел деструкторы всех классов программы, везде virtual. Или причина в другом? DestroyWindow нельзя вызывать в деструкторе класса-наследника от CWnd, потому что там будут вызываны другие вмртуальные методы. Я нигде не вызываю DestroyWindow. Единственно в окне диалога создаю свои объекты окон через new, перенаправляю сообщения из ресурса диалога в этот объект, а при закрытии приложения в деструкторе диалога делаю delete раннее созданного объекта. Где грабли? Если не понятно что я делаю, могу выложить код. Но таких объектов по new я создаю несколько, а предупреждение приходит только одно, или это предупреждение вообще? |
Сообщ.
#5
,
|
|
|
Цитата a_n_y_a @ Цитата Олег М @ Цитата a_n_y_a @ Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called. Просмотрел деструкторы всех классов программы, везде virtual. Или причина в другом? DestroyWindow нельзя вызывать в деструкторе класса-наследника от CWnd, потому что там будут вызываны другие вмртуальные методы. Я нигде не вызываю DestroyWindow. Единственно в окне диалога создаю свои объекты окон через new, перенаправляю сообщения из ресурса диалога в этот объект, а при закрытии приложения в деструкторе диалога делаю delete раннее созданного объекта. Где грабли? Если не понятно что я делаю, могу выложить код. Но таких объектов по new я создаю несколько, а предупреждение приходит только одно, или это предупреждение вообще? Вот код. В хедере главного класса диалога: CShkalaRight *m_sr; // Класс наследник CWnd В OnInitDialog главного класса диалога: CRect rt; m_sr=NULL; m_sr=new CShkalaRight(); m_sr->SubclassWindow(GetDlgItem(IDC_CUSTOM_SHKALA_RIGHT)->GetSafeHwnd()); GetDlgItem(IDC_CUSTOM_SHKALA_RIGHT)->GetWindowRect(&(rt)); GetDlgItem(IDC_CUSTOM_SHKALA_RIGHT)->GetClientRect(&(m_sr->Client)); m_sr->Client.left=rt.left; m_sr->Client.right=rt.right; m_sr->MoveWindow(m_sr->Client); В деструкторе главного класса диалога if(m_sr!=NULL) delete m_sr; Таких объектов (классов) у меня несколько. Не пойму почему выдает предупреждение. Может перед delete надо что то делать с окном? |
Сообщ.
#6
,
|
|
|
Цитата a_n_y_a @ Не пойму почему выдает предупреждение. Может перед delete надо что то делать с окном? Да, скорее всего вызвать DestroyWindow, но перед этим нужно проверить хендл окна, если он валидный, то вызвать DestroyWindow. Добавлено А еще лучше уйти от указателей. Тогда проблемы и не возникнет. Добавлено Просто в том примере, который ты привел, там нет смысла использовать указатель. |
Сообщ.
#7
,
|
|
|
Цитата a_n_y_a @ Не пойму почему выдает предупреждение. Может перед delete надо что то делать с окном? Попробуй сделать if (m_sr != NULL) { m_sr->DestroyWindow(); delete m_sr; } Передупреждение выдаётся скорее всего потому, что если ты до delete не уничтожил окно, через DestroyWindow, то этот метод будет вызван в деструкторе. |