入力可能なListViewの操作を制御するには?


うい  2010-01-25 23:38:51  No: 71313  IP: [192.*.*.*]

環境は、VC6++ MFC、 WindowsXPです。

ListViewコントロールで
入力可能なものを作成しています。

下記のURLでダウンロードしたサンプルを参考に作っています。
http://www.codeguru.com/cpp/controls/listview/editingitemsandsubitem/article.php/c1077/

EditコントロールをEnterキーで編集し終わった場合と、
マウスなどで他のセルを選択した場合を
分けたいのですが、何かいい方法はありませんでしょうか。

TabKeyなど他の入力はEditのクラスで検出できるのですが、
EnterKeyは編集が終了したとき入力がわかりません。

よろしくお願いします。

編集 削除
うい  2010-01-26 00:47:07  No: 71314  IP: [192.*.*.*]

自己れすになりますが、
NM_ENTERを使えば何とかなるかもしれません。

http://madia.world.coocan.jp/vc/vc_bbs/200311/200311_03110029.html

編集 削除
仲澤@失業者  2010-01-26 10:09:10  No: 71315  IP: [192.*.*.*]

自前でEditを実装していないことを前提とすると。どこかで編集の開始

CEdit *  edit = m_pListCtrl->EditLabel( LineNo);

しているはずですよねぇ。
ここで取得したeditをサブクラス化するのが簡単です。

MyEdit.SubclassWindow( edit->m_hWnd);

MyEditにOnKeyDown()を実装すれば全てのキー入力が監視できます。
リターン認識問題よりも、OnChar()でコードを監視して
エスケープ離脱認識の解決に使われることが多いようです。

編集 削除
うい  2010-01-26 20:32:25  No: 71316  IP: [192.*.*.*]

レスありがとうございます。

サブクラス化してキーコードを取得しようとしたら
EnterKeyの場合は編集が完了するだけで、
OnKeyDownイベントに飛んできませんでした。

編集 削除
仲澤@失業者  2010-01-26 21:14:13  No: 71317  IP: [192.*.*.*]

>OnKeyDownイベントに飛んできませんでした。

コードのどこかに間違いがあります。
今テストしましたが、OnKeyDown()で、0x0Dが取れました。

編集 削除
うい  2010-01-31 11:35:16  No: 71318  IP: [192.*.*.*]

レス遅くなってすいません。

Enterキーを取得できない、状態のソースを載せてみました。
サブクラス化の使い方が違ってますでしょうか。


// サブクラス化に使うクラス

BEGIN_MESSAGE_MAP(CBaseEdit, CEdit)
  ON_WM_KEYDOWN()
END_MESSAGE_MAP()

// CBaseEdit メッセージ ハンドラ

VOID CBaseEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{  // Enter以外は取得できました  
  CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}

// ダイアログ
BOOL CabcDlg::OnInitDialog()
{
  DWORD dwStyle = m_cList2.GetStyle();
  dwStyle &= ~LVS_TYPEMASK;

  dwStyle |= LVS_REPORT;
  dwStyle |= LVS_SINGLESEL;
  dwStyle |= LVS_EDITLABELS;

  m_cList2.ModifyStyle(0, dwStyle);
}

// ダイアログに記述しました
void CabcDlg::OnLvnBeginlabeleditList1(NMHDR *pNMHDR, LRESULT *pResult)
{
  NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
  // TODO : ここにコントロール通知ハンドラ コードを追加します。

         // m_pListCtrl->EditLabel( LineNo);の代わりに記述
  CEdit*pcEdit = m_cList2.GetEditControl();

  m_cEdit.SubclassWindow(pcEdit->m_hWnd); 

  *pResult = 0;
}

編集 削除
うい  2010-01-31 11:36:15  No: 71319  IP: [192.*.*.*]

m_cEditはCBaseEditクラスです。

編集 削除
仲澤@失業者  2010-02-04 09:40:50  No: 71320  IP: [192.*.*.*]

提示のコードで問題のある部分は見つかりませんでした。

VOID CBaseEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   CString str;
   str.Format( "Key = %d\n", nChar);
   ::OutputDebugString( str);
   CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}

として、もう一度リターンキーが取れないかどうか
試してみてはどうでしょう。

編集 削除