3

我正在使用 MFC Feature Pack 构建一个项目。这个项目是否我有一个包含 的窗口CView,其中包含一个CListCtrl衍生对象。该对象包括LVS_EDITLABELS标志。

不知何故,我无法CListCtrl通过两次单击(不是双击)图标标签来编辑图标标签。在我通过单击选择项目后,第二次单击只会使项目闪烁(向下按钮将文本背景变为白色,向上按钮将其变为蓝色)并且编辑控件永远不会出现。

我将这个问题简化为最简单的形式,即使使用普通CListCtrl对象我也无法编辑标签。

我还发现:

  • 这个问题出现在VS2008中。在VS2003内置的类似项目中不会出现这种情况。

  • 如果我构建 aCListView而不是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我只需将其替换CViewCListViewand m_lstTerminaisby GetListCtrl(),并删除OnCreateandOnSize实现。这样它就起作用了。

注意:vwTerminaisTeste是从 -派生类中创建CSplitterWndEx的。CMDIChildWndEx

4

2 回答 2

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);
}
于 2009-06-16T12:11:57.077 回答
1

好吧,没有人解决这个问题,但我设法通过将 CView 更改为 CFormView 并使用 ListView 控件构建资源对话框,将其附加到 CListCtrl 派生类来解决它。

如果有人仍然对我如何完全解决这个问题有任何建议,我将不胜感激。

于 2009-04-29T12:20:47.667 回答