開発環境
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);
}
よろしくお願い致します。
できませんでしたっけ・・・。
キーボードメッセージを監視する方法はやや遠回りかもしれません。
表示される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);
}
てな感じでど~でしょう。
いかん(vv;)。
LISTCTRL::OnLvnEndlabeledit()でサブクラス化の解除をしなければ
いけませんでした。詳細は自分で調べてください。