2005VC++ MFCです。
縦可変、横3マスのリストコントロールにおいて、
選択した行の値を取得表示させたいのですが、下記コードにおいて
取得される値が正確だったり一つ前に選択した行の値だったりします。
また、選択してもこの関数が呼ばれず表示されない場合と1回のクリックでこの関数が2
回呼ばれる事もあります。
使い方が間違っているのでしょうか?
ちなみに一回の選択で行全部が選択されるようLVS_EX_FULLROWSELECTを設定していま
す。
void CHDlg::OnLvnItemchangedListSearchResult(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
CString str;
int index = -1;
while ((index = m_cList_Alarm.GetNextItem(index, LVNI_ALL |
LVNI_SELECTED)) != -1)
{
str = _T(1:) +m_cList_Alarm.GetItemText(index, 0);
str += _T(2:) +m_cList_Alarm.GetItemText(index, 1);
str += _T(3:) +m_cList_Alarm.GetItemText(index, 2);
MessageBox(str);
}
}
以下のように処理したらご希望の動作でしょうか?
void CHDlg::OnLvnItemchangedListSearchResult(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 = _T(1:) +m_cList_Alarm.GetItemText(pNMLV->iItem, 0);
str += _T(2:) +m_cList_Alarm.GetItemText(pNMLV->iItem, 1);
str += _T(3:) +m_cList_Alarm.GetItemText(pNMLV->iItem, 2);
str += \r\n;
OutputDebugString(str);
}
}
LVN_ITEMCHANGEDはアイテムの状態が変化した時に送られてくるメッセージのようですから
メッセージが来たからといってなんでも処理してしまってはだめだと言うことなんでしょ
うね。
この辺はメッセージがどういう時に送られてくるのかをしっかり抑えておく必要があると
思います。
教えて頂いた様にコードを変更してうまく行きました!
LVN_ITEMCHANGEDについても教えていただきありがとうございます。
てっきりクリックした時に1回だけ呼ばれるものだと思っていたので、、
助かりました。
またインデックスの取得方法についてもpNMLV->iItemで良かったんですね。
ありがとうございました。