3

MFC Feature Pack を使用してプロジェクトを構築しています。このプロジェクトCViewは、CListCtrl派生オブジェクトを含む を含むウィンドウがあります。オブジェクトにはLVS_EDITLABELSフラグが含まれます。

CListCtrlどういうわけか、アイコン ラベルを (ダブルクリックではなく) 2 回クリックしても、アイコン ラベルを編集できません。1 回のクリックで項目を選択した後、2 回目のクリックで項目が点滅し (ボタンを押すとテキストの背景が白に変わり、ボタンを押すと青に戻ります)、編集コントロールは表示されません。

私はこの問題を最も単純な形に減らしました.単純なCListCtrlオブジェクトでもラベルを編集することはできません.

また、次のこともわかりました。

  • この問題は VS2008 で発生します。VS2003 でビルドされた同様のプロジェクトでは発生しません。

  • +のCListView代わりに aを作成すると、ラベルを編集できます。CViewCListCtrl

  • を作成してリソースダイアログ内に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と で置き換えCViewCListViewm_lstTerminaisの実装GetListCtrl()を削除しましたOnCreateOnSizeそうすればうまくいきました。

注: は派生クラス内vwTerminaisTesteから作成されます。CSplitterWndExCMDIChildWndEx

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 に答える