На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Предупреждение о calling DestroyWindow in CWnd::~CWnd , Выдается предупреждение при закрытии приложения, не пойму где искать причину.
    Выдается предупреждение при закрытии приложения, не пойму где искать причину. Вот сообщение:
    ExpandedWrap disabled
      Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.

    Просмотрел деструкторы всех классов программы, везде virtual. Или причина в другом?
      Тут описано, из за чего может проявится твоя проблема:
      https://msdn.microsoft.com/ru-ru/library/5zba4hah.aspx

      Ты удаляешь окно неправильно, судя по всему.
        Цитата a_n_y_a @
        Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.

        Просмотрел деструкторы всех классов программы, везде virtual. Или причина в другом?


        DestroyWindow нельзя вызывать в деструкторе класса-наследника от CWnd, потому что там будут вызываны другие вмртуальные методы.
        Сообщение отредактировано: Олег М -
          Цитата Олег М @
          Цитата 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 я создаю несколько, а предупреждение приходит только одно, или это предупреждение вообще?
            Цитата 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 я создаю несколько, а предупреждение приходит только одно, или это предупреждение вообще?

            Вот код.
            В хедере главного класса диалога:
            ExpandedWrap disabled
              CShkalaRight *m_sr;  //  Класс наследник CWnd

            В OnInitDialog главного класса диалога:
            ExpandedWrap disabled
                  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);

            В деструкторе главного класса диалога
            ExpandedWrap disabled
                  if(m_sr!=NULL) delete m_sr;


            Таких объектов (классов) у меня несколько.
            Не пойму почему выдает предупреждение. Может перед delete надо что то делать с окном?
              Цитата a_n_y_a @
              Не пойму почему выдает предупреждение. Может перед delete надо что то делать с окном?

              Да, скорее всего вызвать DestroyWindow, но перед этим нужно проверить хендл окна, если он валидный, то вызвать DestroyWindow.

              Добавлено
              А еще лучше уйти от указателей. Тогда проблемы и не возникнет.

              Добавлено
              Просто в том примере, который ты привел, там нет смысла использовать указатель.
                Цитата a_n_y_a @
                Не пойму почему выдает предупреждение. Может перед delete надо что то делать с окном?

                Попробуй сделать

                ExpandedWrap disabled
                  if (m_sr != NULL)
                  {
                     m_sr->DestroyWindow();
                     delete m_sr;
                  }


                Передупреждение выдаётся скорее всего потому, что если ты до delete не уничтожил окно, через DestroyWindow, то этот метод будет вызван в деструкторе.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0280 ]   [ 16 queries used ]   [ Generated: 28.03.24, 10:09 GMT ]