【MFC】リストビューの選択イベントについて – プログラミング – Home

【MFC】リストビューの選択イベントに...
 
通知
すべてクリア

[解決済] 【MFC】リストビューの選択イベントについて


らいお
 らいお
(@らいお)
ゲスト
結合: 14年前
投稿: 2
Topic starter  

現在、リストビューのアイテム選択時に、そのインデックスを取得したいと思っており
ます。

選択しているインデックスは取得出来るのですが、リストビューのイベントの何を使え
ば良いのかが分からない状態です。

「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);
}

伺いたい事がうまく説明出来ているのか不安ですが、ご教授お願いいたします。


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 14年前
投稿: 5
 

確認ですが……

複数選択可能なリストビューですか?

複数行選択でなければ、LVN_ITEMCHANGEDのlParam(NMLISTVIEW構造体)のuNewStateメンバ
を確認するコトで処理できるかと。

以前選択していたものから別のものを選択した場合などに複数回通知されますが…
LVIS_SELECTEDフラグが付いているものが選択したアイテムになります。
以前選択していたものの場合、LVIS_SELECTEDフラグが落ちているハズです。
あと、確認はMessageBox()使うのは止めた方がよいかと。
リストビューからフォーカスが奪われた時に、他の通知が飛んでくることになるかと思わ
れますが…
# アイテムの状態にLVIS_FOCUSEDなんてのもありますし……。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

リストコントロールの選択アイテムを全て取得するには、
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);
: // 配列などに追加する
}
のように書きますが、これは「現在選択中のアイテム全体を~する」時に
使います。まず、「~する」を定義して、メニューかコマンドにしましょう。
そのハンドラの中に上記をコードします。
選択アイテムが変化するようなイベントで拾っても意味がありませんよね(笑)。


返信引用
らいお
 らいお
(@らいお)
ゲスト
結合: 14年前
投稿: 2
Topic starter  

瀬戸っぷさん

>複数選択可能なリストビューですか?
いえ、単一選択に設定しております。

>複数行選択でなければ、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

ありがとうございました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました