Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.89.163.120] |
|
Сообщ.
#1
,
|
|
|
VS 2013
Стандартное Шаблонное MFC приложение с кучей боковых окошек с информацией. Центральное окно class CChildView : public CWnd Хочу прикрутить к нему CListView 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() }; 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 |
Сообщ.
#2
,
|
|
|
Вообщем отладкой прошелся при закрытии приложения.
CFrameWndEx::OnClose() вызывает где-то дальше уничтожение CListView, а от него по наследованию CView::Destroy, где вызывается delete this, и тут происходит падение. Подозреваю, что класс CListView должен использоваться как главное окно, заменил его на CListCtrl. |