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


うい  2010-01-26 08:38:51  No: 71313

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

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

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

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

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

よろしくお願いします。


うい  2010-01-26 09:47:07  No: 71314

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

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


仲澤@失業者  2010-01-26 19:09:10  No: 71315

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

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

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

MyEdit.SubclassWindow( edit->m_hWnd);

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


うい  2010-01-27 05:32:25  No: 71316

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

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


仲澤@失業者  2010-01-27 06:14:13  No: 71317

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

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


うい  2010-01-31 20:35:16  No: 71318

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

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 20:36:15  No: 71319

m_cEditはCBaseEditクラスです。


仲澤@失業者  2010-02-04 18:40:50  No: 71320

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加