現在、リストビューのアイテム選択時に、そのインデックスを取得したいと思っており
ます。
選択しているインデックスは取得出来るのですが、リストビューのイベントの何を使え
ば良いのかが分からない状態です。
「LVN_ITEMCHANGED」や「LVN_ITEMCHANGING」でイベントは拾えるのですが、
複数回イベントが発生してしまうため、選択している行のインデックスがうまく拾えて
ない状態です。
環境とコードを以下に記載しておきます。
【環境】WindowsXP、VC2005++、MFC
LVN_ITEMCHANGEDで、
int index = -1;
CString str;
while ((index = m_xclist.GetNextItem
(index, LVNI_ALL | LVNI_SELECTED)) != -1)
{
str = _T(選択index:) + m_xclist.GetItemText(index,1);
AfxMessageBox(str);
}
伺いたい事がうまく説明出来ているのか不安ですが、ご教授お願いいたします。
確認ですが……
複数選択可能なリストビューですか?
複数行選択でなければ、LVN_ITEMCHANGEDのlParam(NMLISTVIEW構造体)のuNewStateメンバ
を確認するコトで処理できるかと。
以前選択していたものから別のものを選択した場合などに複数回通知されますが…
LVIS_SELECTEDフラグが付いているものが選択したアイテムになります。
以前選択していたものの場合、LVIS_SELECTEDフラグが落ちているハズです。
あと、確認はMessageBox()使うのは止めた方がよいかと。
リストビューからフォーカスが奪われた時に、他の通知が飛んでくることになるかと思わ
れますが…
# アイテムの状態にLVIS_FOCUSEDなんてのもありますし……。
リストコントロールの選択アイテムを全て取得するには、
UINT numSelect = list->GetSelectedCount(); // 選択されているアイテム
if( numSelect <= 0) return; // 無ければ終了
int iItem = -1;
for( int i=0 ; i<numSelect ; i++){ //[3]~: チャネル№
iItem = list->GetNextItem( iItem, LVNI_SELECTED);
: // 配列などに追加する
}
のように書きますが、これは「現在選択中のアイテム全体を~する」時に
使います。まず、「~する」を定義して、メニューかコマンドにしましょう。
そのハンドラの中に上記をコードします。
選択アイテムが変化するようなイベントで拾っても意味がありませんよね(笑)。
瀬戸っぷさん
>複数選択可能なリストビューですか?
いえ、単一選択に設定しております。
>複数行選択でなければ、LVN_ITEMCHANGEDのlParam(NMLISTVIEW構造体)の
>uNewStateメンバを確認するコトで処理できるかと。
分かりましたー!
以下のようにする事で解決しました。
void CListTestDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
CString str;
int index = -1;
if((pNMLV->uChanged & LVIF_STATE) &&
(pNMLV->uNewState & LVIS_SELECTED))
{
str.Format(_T(%d), pNMLV->iItem);
AfxMessageBox(str);
}
*pResult = 0;
}
また、いまさらですが、同じような質問が出ておりましたので、
URLをつけておきます。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200708/07080068.txt
ありがとうございました