環境は、VC6++ MFC、 WindowsXPです。
ListViewコントロールで
入力可能なものを作成しています。
下記のURLでダウンロードしたサンプルを参考に作っています。
http://www.codeguru.com/cpp/controls/listview/editingitemsandsubitem/article.php/c1077/
EditコントロールをEnterキーで編集し終わった場合と、
マウスなどで他のセルを選択した場合を
分けたいのですが、何かいい方法はありませんでしょうか。
TabKeyなど他の入力はEditのクラスで検出できるのですが、
EnterKeyは編集が終了したとき入力がわかりません。
よろしくお願いします。
自己れすになりますが、
NM_ENTERを使えば何とかなるかもしれません。
http://madia.world.coocan.jp/vc/vc_bbs/200311/200311_03110029.html
自前でEditを実装していないことを前提とすると。どこかで編集の開始
CEdit * edit = m_pListCtrl->EditLabel( LineNo);
しているはずですよねぇ。
ここで取得したeditをサブクラス化するのが簡単です。
MyEdit.SubclassWindow( edit->m_hWnd);
MyEditにOnKeyDown()を実装すれば全てのキー入力が監視できます。
リターン認識問題よりも、OnChar()でコードを監視して
エスケープ離脱認識の解決に使われることが多いようです。
レスありがとうございます。
サブクラス化してキーコードを取得しようとしたら
EnterKeyの場合は編集が完了するだけで、
OnKeyDownイベントに飛んできませんでした。
>OnKeyDownイベントに飛んできませんでした。
コードのどこかに間違いがあります。
今テストしましたが、OnKeyDown()で、0x0Dが取れました。
レス遅くなってすいません。
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;
}
m_cEditはCBaseEditクラスです。
編集 削除提示のコードで問題のある部分は見つかりませんでした。
VOID CBaseEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString str;
str.Format( "Key = %d\n", nChar);
::OutputDebugString( str);
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
として、もう一度リターンキーが取れないかどうか
試してみてはどうでしょう。