我有一个实现群组功能的CListCtrl,如:
我希望得到一个元素的索引,但我不希望它的索引基于List Control的元素。我想要的是两个获得两个索引:它所属的组的索引,以及组内元素的索引。
作为图像的一个例子,“Saw”索引为{1,2}
我编写了以下代码来获取索引:
void MyDialog::OnItemChangedListCtrl(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;
if ((pNMListView->uChanged & LVIF_STATE)
&& (pNMListView->uNewState & LVIS_SELECTED))
{
CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_LIST_CONTROL);
if (pListCtrl)
{
int items_before = 0;
int index_group= 0;
int index_inside_group = 0;
LVGROUP lg = { 0 };
lg.cbSize = sizeof(LVGROUP);
lg.mask = LVGF_ITEMS;
for (gr = 0; gr < pListCtrl->GetGroupCount();gr++)
{
pListCtrl->GetGroupInfoByIndex(gr, &lg);
if (pNMListView->iItem >= items_before && pNMListView->iItem < (items_before + (int) lg.cItems))
{
index_inside_group = pNMListView->iItem - items_before;
break;
}
items_before += lg.cItems;
}
DoThings(index_group, index_inside_group);
}
}
}
我正确地得到了两个索引。在index_group
我获得组索引;并且在index_inside_group
中,我获得了它所属的组内项目的索引。
我的问题是:有没有比手动迭代更好的方法来获取索引?它工作正常,因为我的列表目前很小;但如果它变得非常大,我怀疑它是一种有效的方法!