リストビューのラベル上でCtrl+CやCtrl+Vを実行したい

[戻る]
ぷらす 2010/05/26(水) 16:48:12
開発環境
Win XP Pro SP3
VC++ 2005 MFC

SDIでViewをCListViewにして、下記のスタイルにしています。
1.LVS_OWNERDATA を追加して仮想リストビューに
2.LVS_EDITLABELS を追加してラベルを編集可能に

ラベルを編集状態にすると、エディットボックスのような
見た目や動作になりますが、ここでキーボードから
下記の作業を行いたいのです。

Ctrl + C で選択しているテキストをコピー
Ctrl + V で貼り付け


Ctrl+C,Ctrl+V自体は下記のようにしてPreTranslateMessageで
検知することは出来たのですが、選択されている文字列のみのコピーや
貼り付けの方法がわかりません。

BOOL CtestView::PreTranslateMessage(MSG* pMsg)
{
    CListCtrl &listCtrl = GetListCtrl();
                        
    if (pMsg->message == WM_KEYDOWN){                        
            
        switch(pMsg->wParam){
            case 'C':
                if (::GetAsyncKeyState(VK_CONTROL)) {

                }
                break;
            case 'V':
                if (::GetAsyncKeyState(VK_CONTROL)) {
        
                }
                break;
        }
    }
    return CListView::PreTranslateMessage(pMsg);
}


よろしくお願い致します。

仲澤@失業者 2010/05/26(水) 17:58:55
できませんでしたっけ・・・。

キーボードメッセージを監視する方法はやや遠回りかもしれません。
表示されるEditをサブクラス化して、サブクラスエディット(=仮にSubClass_Edit)
に機能を追加するのが良いかもしれません。
SubClass_Editのメッセージマップに

BEGIN_MESSAGE_MAP( SubClass_Edit, CEdit)
  ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
  ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
END_MESSAGE_MAP()

を追加、実体は以下の通り

class
SubClass_Edit
 : public CEdit
{
   〜
public:
  OnEditCopy(){ Copy();}
  OnEditPaste(){ Paste();}
  SubclassEditWindow( ex_hWnd){CEdit::SubclassWindow( ex_hWnd)}
};

サブクラス化タイミングはリストビューのOnClickで
LISTCTRL::OnNMClick(
 NMHDR *   pNMHDR,
 LRESULT * pResult)
{
  NMLISTVIEW *pNMListView = ( NMLISTVIEW *)pNMHDR;
  CEdit * edit = m_pListCtrl->EditLabel( pNMListView->iItem);
  m_SubClassEdit.SubclassEditWindow(edit->m_hWnd);
}

てな感じでど〜でしょう。

仲澤@失業者 2010/05/26(水) 18:02:48
いかん(vv;)。
LISTCTRL::OnLvnEndlabeledit()でサブクラス化の解除をしなければ
いけませんでした。詳細は自分で調べてください。

古いスレッドには追加発言できません。