Невозможно редактировать метки в CListCtrl - PullRequest
3 голосов
/ 17 апреля 2009

Я строю проект с помощью 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 -обработанном классе.

Ответы [ 2 ]

1 голос
/ 16 июня 2009

Похоже, что это может быть проблема фокуса или маршрутизации команд, хотя это не объясняет, почему она работает нормально в 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);
}
1 голос
/ 29 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...