За Xypodilec AND CListCtrl

3 отговора 99 прегледа
#1

За Xypodilec AND CListCtrl

Та Xypodilec,
понеже до мен достигнаха сигнали, че си просветен относно въпросите на CListCtrl класа и по-точно, как да заежда елементите си по-бързо, така че при по-голям брой да не се бави досадно. Бих те помолил да ми го обисаниш малко по-подробно, понеже от предния ти отговор разбрах твърде малко:) (разбира се, ако имаш възможност).
Ще ти бъда много благодарен, ако ми помогнеш...

Отговор
в отговор на Wagner #2

Re: За Xypodilec AND CListCtrl

В общи линии по този начин дори е по-лесно да се работи с CListCtrl.

Чакай да драсна нещо по-конкретно, че тъкмо ставам и пуша :)

Отговор
в отговор на Wagner #3

Re: За Xypodilec AND CListCtrl

Слагаш стил LVS_OWNERDATA на CListCtrl-a.

m_ListCtrl.Create(...|LVS_OWNERDATA, ....);


В този случай самоя контрол не съхранява никакви данни, освен колкото му трябват за селектване и т.н. на item-ите. За всеки item/subitem се праща LVN_GETDISPINFO message. Може да го сложиш от ClassWizarda.


OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

LV_ITEM* pItem= &(pDispInfo)->item;
TIPA_NA_DANNITE *ptr = m_arr_dataptrs[pItem->iItem];

if ( pItem->mask & LVIF_TEXT )
{
if(pItem->iSubItem == 0)
{
lstrcpyn(pItem->pszText, ptr->string_za_item, pItem->cchTextMax);
}
else if(pItem->iSubItem == 1)
{
lstrcpyn(pItem->pszText, ptr->string_za_subitem1, pItem->cchTextMax);
}
else if(pItem->iSubItem == 2)
{
lstrcpyn(pItem->pszText, ptr->string_za_subitem2, pItem->cchTextMax);
}
}

if ( pItem->mask & LVIF_IMAGE )
{
pItem->iImage = nomer_na_image_ot_CImageList;
}

......

}

....


След като добавиш или изтриeш нещо от списъка си:
m_ListCtrl.SetItemCount(novia_broi_items);

Toва го информира да се преизчертае и т.н.

И ще се бави колкото му трябва за заделянето на памет за списъка с данните. С 1 картинка и 3 колони, двеста хиляди items - за 5 секунди, Celeron 366, 128RAM. A по обичайния начин се моташе повече и на само 4000.

Доколкото разбрах (не съм проверявал) в този случай било бавно ако имаш много subitems - някакъв тип беше споменавал за около 500!

Поразгледай в MSDN за LVS_OWNERDATA, LVN_GETDISPINFO и SetItemCount(). Има разни особености от рода на "Therefore, the only valid item state flags that can apply to an item are LVIS_SELECTED and LVIS_FOCUSED. No other state information is stored."

Отговор
в отговор на Xypodilec #4

Re: За Xypodilec AND CListCtrl

Много съм ти благодарен за изчерпателното обяснение:)!!!

Отговор