ユーザーが CListCtrl で行を選択したときにコードを実行したい (レポート ビュー、他の表示モードは気にしません)。
このイベントをキャッチするにはどうすればよいですか? マップできるメッセージや「OnSelectionChanged」などのメソッドはありますか?
ユーザーが CListCtrl で行を選択したときにコードを実行したい (レポート ビュー、他の表示モードは気にしません)。
このイベントをキャッチするにはどうすればよいですか? マップできるメッセージや「OnSelectionChanged」などのメソッドはありますか?
また試してください:
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...
}
}
何が起こっているかに基づいていくつかの通知があります。
アイテムを選択していて、まだ何も選択されていない場合は、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)
フォーカスが失われた通知の後で同じ処理をスキップしました。
djeidotは正しいです。
ListView は複数選択をサポートしているため、OnSelectionChanged() がないことを追加したいだけです (ただし、これは無効にすることができます)。したがって、単一選択リストビューは、2 つのイベントを送信します: 古い項目が選択されていないことと、新しい項目が選択されていることです。
私の 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...
}