虚拟列表(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://download.csdn.net/detail/denglei265/6533423

参考资料:1、MFC Virtual List Control:http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/MFC-Virtual-List-Control.htm

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值