2009-04-17 5 views
3

Я создаю проект с Feature Pack MFC. У этого проекта у меня есть окно, которое включает в себя CView, который включает в себя объект CListCtrl. Объект включает в себя флаг LVS_EDITLABELS.Невозможно отредактировать ярлыки в CListCtrl

Как-то я не могу отредактировать ярлыки значков 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.

+0

Просьба указать код. Каковы все флаги стиля (базовые и расширенные) на CListCtr ?. Можете ли вы показать код, заполняющий список? –

+0

Совет. Если вы действительно хотите, чтобы это ответили, пожертвуйте своей репутацией и приложите щедрость к ней. Тогда люди приложат усилия и попытаются воспроизвести ошибку и т. Д. http://stackoverflow.com/questions/483019/how-does-the-bounty-system-work-in-stackoverflow – sharkin

+0

Почему вам особенно нужен CView + CListCtrl вместо CListView? –

ответ

1

Ну, никто не решил эту проблему, но мне удалось обойти ее, изменив CView на CFormView и построив диалог ресурсов с помощью элемента управления ListView, прикрепляя его к классу, созданному CListCtrl.

Если у кого-то еще есть предложения по поводу того, как я могу полностью решить эту проблему, я буду благодарен им.

1

Возможно, это может быть проблема с фокусом или командной маршрутизацией, хотя это не объясняет, почему она работает нормально в VS2003. Вы можете попытаться маршрутизировать сообщения команды и/или фокуса с разделителя ctrl на vwTerminaisTeste и/или из MDIChild в разделитель. Если вы еще этого не сделали, вам может понадобиться получить собственное окно сплиттера. Перемещение команды/фокуса будет ...

BEGIN_MESSAGE_MAP(MySplitter, CSplitterWnd) 
    ON_WM_SETFOCUS() 
END_MESSAGE_MAP(...) 

void MySplitter::OnSetFocus(CWnd* pOldWnd) 
{ 
    // forward focus to the view window 
    m_vwTerminaisTeste.SetFocus(); 
} 

BOOL MySplitter::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
{ 
    // let the view have first crack at the command 
    if (m_vwTerminaisTeste.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) 
    return TRUE; 

    // otherwise, do default handling 
    return MySplitter::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^