CListCtrl根据它所属的组获取元素的索引

时间:2017-04-04 10:04:40

标签: visual-c++ mfc grouping clistctrl

我有一个实现群组功能的CListCtrl,如:

enter image description here

我希望得到一个元素的索引,但我不希望它的索引基于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中,我获得了它所属的组内项目的索引。

我的问题是:有没有比手动迭代更好的方法来获取索引?它工作正常,因为我的列表目前很小;但如果它变得非常大,我怀疑它是一种有效的方法!

0 个答案:

没有答案