32

ユーザーが CListCtrl で行を選択したときにコードを実行したい (レポート ビュー、他の表示モードは気にしません)。

このイベントをキャッチするにはどうすればよいですか? マップできるメッセージや「OnSelectionChanged」などのメソッドはありますか?

4

4 に答える 4

44

また試してください:

BEGIN_MESSAGE_MAP(cDlgRun, CDialog)
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST2, OnItemchangedList2)
END_MESSAGE_MAP()

/* ... */

void cDlgRun::OnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    if ((pNMListView->uChanged & LVIF_STATE) 
        && (pNMListView->uNewState & LVIS_SELECTED))
    {
        // do stuff...
    }
}
于 2009-09-23T13:40:58.013 に答える
13

何が起こっているかに基づいていくつかの通知があります。

アイテムを選択していて、まだ何も選択されていない場合は、LVIF_STATE変更通知が1つ届きます:uNewState&LVIS_SELECTED。新しく選択されたアイテムは次の場所にあります。

pNMListView->iItem

新しいオブジェクトを選択する前にアイテムを選択すると、次の3つの状態変化が発生します。

最初に、フォーカスされている前のアイテムがフォーカスを失っていることを通知されます。

pNMListView->uOldState & LVIS_FOCUSED

次に、古いアイテムが選択解除されていることが通知されます。

pNMListView->uOldState & LVIS_SELECTED

最後に、新しいアイテムの選択状態が表示されます。

pNMListView->uNewState & LVIS_SELECTED

(新しく選択されたアイテムについては、iItemをもう一度見てください)

したがって、私たちが遭遇した落とし穴は、アイテムの選択を解除すると2つの通知が発生するため、多くの反復的な、時には有害な処理を行っていたということです。最終的には、2番目のメッセージに対してのみこの処理を実行し、(pNMListView->uOldState & LVIS_SELECTED)フォーカスが失われた通知の後で同じ処理をスキップしました。

于 2012-10-19T18:15:03.910 に答える
4

djeidotは正しいです。

ListView は複数選択をサポートしているため、OnSelectionChanged() がないことを追加したいだけです (ただし、これは無効にすることができます)。したがって、単一選択リストビューは、2 つのイベントを送信します: 古い項目が選択されていないことと、新しい項目が選択されていることです。

于 2009-09-25T15:16:31.747 に答える
0

私の Visual Studio 2010 では、ビジュアル エディターは次のようにダイアログ ヘッダー ファイルでコールバックを宣言します。

afx_msg void OnLbnSelchangeListOnvif();

そしてソースファイルで:

BEGIN_MESSAGE_MAP(CDialogOnvif, CDialog)
    ON_LBN_SELCHANGE(IDC_LIST_ONVIF, &CDialogOnvif::OnLbnSelchangeListOnvif)
END_MESSAGE_MAP()

void CDialogOnvif::OnLbnSelchangeListOnvif()
{
    // do stuff...
}
于 2014-06-30T13:30:08.723 に答える