На главную Наши проекты:
Журнал   ·   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
  
> Подключение CListView к CWnd (падение при закрытии ПО)
    VS 2013
    Стандартное Шаблонное MFC приложение с кучей боковых окошек с информацией.
    Центральное окно class CChildView : public CWnd
    Хочу прикрутить к нему CListView
    ExpandedWrap disabled
      class CChildView : public CWnd
      {
      // Создание
      public:
          CChildView();
      public:
          CListView                   m_wndListView;
          protected:
          virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
      public:
          virtual ~CChildView();
      protected:
          afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
          afx_msg void OnPaint();
          DECLARE_MESSAGE_MAP()
      };

    ExpandedWrap disabled
      int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
      {
          if (CWnd::OnCreate(lpCreateStruct) == -1)
              return -1;
          CRect rect;
          GetClientRect(rect);
          if (!m_wndListView.Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_ICON | LVS_REPORT, rect, this, ID_VIEW_MAIN_LIST))
          {
              TRACE0("Не удалось создать окно представлений\n");
              return -1;
          }
       
          CListCtrl &list = m_wndListView.GetListCtrl();
          list.InsertColumn(0, L"#", LVCFMT_LEFT, 40);
          list.InsertColumn(1, L"MAC", LVCFMT_LEFT, 120);
          list.InsertColumn(2, L"TIME", LVCFMT_LEFT, 110);
          list.InsertItem(0, L"1");
          list.SetItemText(0, 1, L"11-22-33-44-55-66");
          list.SetItemText(0, 2, L"01.01.1111 22:33");
       
          return 0;
      }

    Все отображается, нет проблем.
    Закрываем приложение и программа падает с ошибкой в куче: HEAP[NetConsole.exe]: Invalid address specified to RtlValidateHeap( 007B0000, 007D8870 ) в методе void CMainFrame::OnClose()
    Из того, что удалось вычитать, что у кого-то была проблема с неверным использованием WS_CHILD и указанием ссылки на прародителя, что вызывало проблемы при последовательном удалении элементов, т.е. удаление элементы производилось дважды, во втором случае hwnd уже был NULL.
    Провел тест (сделал свой класс с наследованием): согласно стека вызова, деструктор CListView вызывается из CMainFrame.

    Как правильно создать и подключить CListView к CChildView?
    В шаблоне по аналогии сделан COutputWnd + COutputList
    Сообщение отредактировано: Black_Dragon -
      Вообщем отладкой прошелся при закрытии приложения.
      CFrameWndEx::OnClose() вызывает где-то дальше уничтожение CListView, а от него по наследованию CView::Destroy, где вызывается delete this, и тут происходит падение.
      Подозреваю, что класс CListView должен использоваться как главное окно, заменил его на CListCtrl.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0259 ]   [ 17 queries used ]   [ Generated: 28.03.24, 23:44 GMT ]