За Xypodilec AND CListCtrl
3 отговора
99 прегледа
За Xypodilec AND CListCtrl
Та Xypodilec,
понеже до мен достигнаха сигнали, че си просветен относно въпросите на CListCtrl класа и по-точно, как да заежда елементите си по-бързо, така че при по-голям брой да не се бави досадно. Бих те помолил да ми го обисаниш малко по-подробно, понеже от предния ти отговор разбрах твърде малко:) (разбира се, ако имаш възможност).
Ще ти бъда много благодарен, ако ми помогнеш...
понеже до мен достигнаха сигнали, че си просветен относно въпросите на CListCtrl класа и по-точно, как да заежда елементите си по-бързо, така че при по-голям брой да не се бави досадно. Бих те помолил да ми го обисаниш малко по-подробно, понеже от предния ти отговор разбрах твърде малко:) (разбира се, ако имаш възможност).
Ще ти бъда много благодарен, ако ми помогнеш...
Re: За Xypodilec AND CListCtrl
В общи линии по този начин дори е по-лесно да се работи с CListCtrl.
Чакай да драсна нещо по-конкретно, че тъкмо ставам и пуша :)
Чакай да драсна нещо по-конкретно, че тъкмо ставам и пуша :)
Re: За Xypodilec AND CListCtrl
Слагаш стил LVS_OWNERDATA на CListCtrl-a.
В този случай самоя контрол не съхранява никакви данни, освен колкото му трябват за селектване и т.н. на item-ите. За всеки item/subitem се праща LVN_GETDISPINFO message. Може да го сложиш от ClassWizarda.
След като добавиш или изтриeш нещо от списъка си:
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."
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."
Re: За Xypodilec AND CListCtrl
Много съм ти благодарен за изчерпателното обяснение:)!!!