Visual C++ についての質問です。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/08/13 05:30:40
  • 終了:2007/08/13 21:49:37

回答(2件)

id:mj99 No.1

mj99回答回数138ベストアンサー獲得回数382007/08/13 15:03:45

ポイント35pt

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

id:Vacuum

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

2007/08/13 21:44:10
id:wasisan No.2

wasisan回答回数86ベストアンサー獲得回数72007/08/13 16:21:19

ポイント35pt

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


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


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


回答としては,


  • 行をシングルクリックしてアクティブにした(⇔マウスのボタン入力):

OnLButtonDownハンドラを使う

  • ↑↓でアクティブにした(⇔キー入力):

OnKeyDownハンドラを使う


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

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

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

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

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


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

  • id:wasisan
    Visual C++とだけでは,正確な回答ができないと思います.
    使っているのはMFCですか,それともWindows APIですか?
  • id:wasisan
    すみません.Onxxxのハンドラなどと書いていることで
    MFCということは明らかでしたね.
    MFCを使っているという前提で回答することにします.
  • id:mj99
    OnLvnItemActivateList1(LVN_ITEMACTIVATE)について調べたのですが、あまり良い解説が見つかりませんでした。

    OnLvnItemActivateは、リストビューが「ホットトラッキング」に対応している場合のみ発生するイベントです。
    イベントが発生するタイミングは「マウスでクリックしたとき」のみで、キー入力によるイベントは発生しません。

    「ホットトラッキング」とは、マウスカーソルをリストのアイテム上に持っていったとき、アイテムの外観に変化の機会を与える機能です(IEなどで、リンクアンカーにマウスカーソルを合わせたときに見られる挙動に近いです。)

    実物を見たほうが良いでしょう。
    ホットトラッキングを設定するには、リストビューコントロールに拡張スタイルをセットします。

    BOOL CListDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    m_list1.SetExtendedStyle(LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT);

  • id:wasisan
    すみません.完全に間違った回答をしてしまったのでフォローです.ポイントは0で結構です.

    リストビューから親ウィンドウへの通知(WM_NOTIFY)の存在を
    完全に忘れてしました.詳しくは次のリンク参考になる.


    ぬるり。: ListView とアイテムとフォーカスと:
    http://hongliang.seesaa.net/article/16550502.html


    子のリストビュー自体にはイベントハンドラは存在しないのでが,
    親ウィンドウに通知されるイベント(LVN_ITEMCHANGED)のハンドラは設定できるということです.

    この辺り,.NETやJavaに慣れているととても違和感があると思います.今回の回答はこの辺りのことが頭にあってすっかり忘れていました.申し訳ございませんでした.

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません