虚拟列表(virtual list control)
当有大数据量要加载到Listctrl列表中时,Listctrl或加载,或刷新都会特别慢,虚拟列表可以加速其显示和刷新。
介绍下虚拟列表的使用方法:
1、添加CObject继承类CLabelItem:
//
//LabelItem.h
//
#pragma once
class CLabelItem : public CObject
{
public:
CLabelItem();
CLabelItem(const CLabelItem& ci);
const CLabelItem& operator=(const CLabelItem& stringSrc);
virtual ~CLabelItem();
CString m_szText[10];
};
//
//LabelItem.cpp
//
CLabelItem::CLabelItem(){}
//赋值
CLabelItem::CLabelItem(const CLabelItem& ci){
for(int i=0;i<10;i++)
m_szText[i] = ci.m_szText[i];
}
CLabelItem::~CLabelItem(){}
//取值
const CLabelItem& CLabelItem::operator=(const CLabelItem &ci){
for(int i=0;i<10;i++)
m_szText[i] = ci.m_szText[i];
return *this;
}
2、在MFC窗口中创建一个ListCtrl控件IDC_LIST_VIRTUAL,勾选上【所有者数据】(Owner Data),样式为列表(Report)。绑定参数:CListCtrl m_List;
3、添加事件:
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST_VIRTUAL, GetDispInfo)
void CDlgXXX::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
CLabelItem rLabel = m_arLabels.ElementAt(pItem->iItem);
if (pItem->mask & LVIF_TEXT) //valid text buffer?
{
// then display the appropriate column
strcpy(pItem->pszText, rLabel.m_strText);
*pResult = 0;
}
4、创建列表:
m_List.InsertColumn(0,"Item",LVCFMT_LEFT,50);
m_List.InsertColumn(1,"Data",LVCFMT_LEFT,150);
5、添加虚拟数据
void CDlgXXX::OnAdd()
{
// Fill class data from dialog.
UpdateData(TRUE);
// Define a set of pseudo fn names for example.
char* pszNames[] = {"main","_main","Startup","Fn1","Fn2"};
char* pszCols[] = {"Item","Data",};
CString strText;
int i;
::AfxGetApp()->DoWaitCursor(1);
// Reset column headers (clear sort order ^).
LVCOLUMN Col;
Col.mask=LVCF_TEXT;
for(i=0; i<2; i++)
{
strText = CString(pszCols[i]);
Col.pszText=strText.GetBuffer(strText.GetLength()+1);
Col.cchTextMax=strText.GetLength()+1;
m_List.SetColumn(i, &Col);
strText.ReleaseBuffer();
}
// Clear and reset the label array.
m_arLabels.RemoveAll();
m_arLabels.SetSize( 5000, 1000 );
// Add the 50,000 items.
CLabelItem Label;
for(i=0; i<50000; i++)
{
Label.m_strText[0].Format("%d",i);
Label.m_strText[1]=pszNames[i%5];
m_arLabels.SetAtGrow(i, Label);
}
m_LabelCount=i;
// Tell the list box to update itself.
m_List.SetItemCountEx(m_LabelCount);
m_List.Invalidate();
::AfxGetApp()->DoWaitCursor(0);
}
参考源码下载:http://www.pudn.com/downloads108/sourcecode/windows/control/listview/detail445661.html
参考资料:1、MFC Virtual List Control:http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/MFC-Virtual-List-Control.htm
- 1
- 2
- 3
- 4
- 5
- 6
前往页