Я строю проект с помощью MFC Feature Pack. В этом проекте у меня есть окно, которое включает CView
, которое включает CListCtrl
-приведенный объект. Объект включает флаг LVS_EDITLABELS
.
Каким-то образом я не могу отредактировать ярлыки значков CListCtrl
, дважды щелкнув (а не дважды щелкнув) ярлык значка. После того, как я выбрал элемент одним щелчком, второй щелчок просто мигает (кнопка превращает фон текста в белый, кнопка вверх превращает его в синий), и элемент управления редактированием никогда не появляется.
Я сократил эту проблему до самой простой формы, и даже с простым CListCtrl
объектом я не могу редактировать метки.
Я также обнаружил, что:
Эта проблема возникает в VS2008. Это не происходит в аналогичном проекте, построенном в VS2003.
Я могу редактировать метки, если я строю CListView
вместо CView
+ CListCtrl
.
Я также могу редактировать метки, если я создаю CFormView
и помещаю CListCtrl
в диалоговое окно ресурсов.
Вот код в простейшей форме: файл .h:
// vwTerminaisTeste.h
//
#pragma once
// vwTerminaisTeste view
class vwTerminaisTeste : public CView
{
DECLARE_DYNCREATE(vwTerminaisTeste)
protected:
vwTerminaisTeste(); // protected constructor used by dynamic creation
virtual ~vwTerminaisTeste();
CListCtrl m_lstTerminais;
protected:
DECLARE_MESSAGE_MAP()
virtual void OnDraw(CDC* /*pDC*/);
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
};
и файл .cpp:
// vwTerminaisTeste.cpp : implementation file
//
#include "stdafx.h"
#include "vwTerminaisTeste.h"
// vwTerminaisTeste
IMPLEMENT_DYNCREATE(vwTerminaisTeste, CView)
vwTerminaisTeste::vwTerminaisTeste()
{
}
vwTerminaisTeste::~vwTerminaisTeste()
{
}
BEGIN_MESSAGE_MAP(vwTerminaisTeste, CView)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
// vwTerminaisTeste message handlers
void vwTerminaisTeste::OnDraw(CDC* /*pDC*/)
{
CDocument* pDoc = GetDocument();
}
int vwTerminaisTeste::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
m_lstTerminais.Create(WS_CHILD | WS_VISIBLE | LVS_EDITLABELS, CRect(0,0,1,1), this, 0);
m_lstTerminais.InsertItem(0, "Teste", 0);
return 0;
}
void vwTerminaisTeste::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (IsWindow(m_lstTerminais.GetSafeHwnd()))
m_lstTerminais.MoveWindow(0, 0, cx, cy);
}
Таким образом, я не могу редактировать метки.
Чтобы изменить его на CListView
, я просто заменил CView
на CListView
и m_lstTerminais
на GetListCtrl()
и удалил реализации OnCreate
и OnSize
. Таким образом, это сработало.
Примечание: vwTerminaisTeste
создается из CSplitterWndEx
в * CMDIChildWndEx
-обработанном классе.