人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Visual C++ についての質問です。
リストビューの行をダブルクリックするハンドラはOnNMDblclkList1ですが、行をシングルクリックしてアクティブにした場合・または↑↓でアクティブにした場合のハンドラはなんでしょうか?(OnLvnItemActivateList1かと思ったのですが・・・)


●質問者: Vacuum
●カテゴリ:コンピュータ インターネット
✍キーワード:C++ アクティブ クリック シングル ダブルクリック
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● mj99
●35ポイント

OnLvnItemchangedList1(LVN_ITEMCHANGED)ですね。


一回のクリックで複数回のイベントが発生します。

下記のコードで動きを観察してみると良いでしょう。

void CListDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
 // TODO : ここにコントロール通知ハンドラ コードを追加します。

 static int nEventCount = 0;
 TRACE("OnLvnItemchangedイベント:%04d回目\n", ++nEventCount);

 if ((pNMLV->uNewState & LVIS_SELECTED) && !(pNMLV->uOldState & LVIS_SELECTED)) {
 TRACE("Item=%d:選択ON。\n", pNMLV->iItem); // 文字の背景が青い状態になった
 }
 if (!(pNMLV->uNewState & LVIS_SELECTED) && (pNMLV->uOldState & LVIS_SELECTED)) {
 TRACE("Item=%d:選択OFF。\n", pNMLV->iItem); // 文字の背景が白い状態になった
 }
 if ((pNMLV->uNewState & LVIS_FOCUSED) && !(pNMLV->uOldState & LVIS_FOCUSED)) {
 TRACE("Item=%d:フォーカスON。\n", pNMLV->iItem); // 文字に点線枠がある状態になった
 }
 if (!(pNMLV->uNewState & LVIS_FOCUSED) && (pNMLV->uOldState & LVIS_FOCUSED)) {
 TRACE("Item=%d:フォーカスOFF。\n", pNMLV->iItem); // 文字に点線枠がない状態になった
 }

 *pResult = 0;
}


----

http://msdn2.microsoft.com/en-us/library/ms670575.aspx

◎質問者からの返答

なるほど、たしかに動きますね。ありがとうございます。


2 ● wasisan
●35ポイント

まず,MFCはWindows APIの非常に薄いラッパライブラリなので,


「行の項目がアクティブのときに発生する」


といった抽象度の高いイベントハンドラは存在しません(ちなみに.NETでは「ItemActivate」としてあるのですが).


回答としては,


OnLButtonDownハンドラを使う

OnKeyDownハンドラを使う


と単なるマウス・キーボード入力の判定となります.

実際にアクティブ化されている(⇔アイテムが選択されている)かどうかは

GetNextItemなどのメソッドをハンドラ内で使用して調べるということになります.

詳しいことは,次のリンクなどが参考になると思います.

http://athomejp.com/goldfish/mfc/listview/listview.asp


面倒ですが,MFCが提供するのはこの程度のことなのです.

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ