ClistCtrl virtual list

写这个文章是因为,之前我在网上找的那些 介绍这个技术的。都不怎么详细。让我浪费了不少时间 。
由于数据过多普通的方式已经 满足不了我们庞大的数据了。
显而此时我们 只能用到虚表了。
下面进入 正题。如何实现。
 绑定变量到ClistCtrl 上 当然 你不喜欢 用  那就用GetDlgItem 来进行插入列。
这里 我使用了 绑定,并定义为m_ListCtrl . 
重点:记住要设置 Owner Data 为TRUE 。
//然后在OninitDialog 中 插入列先、

代码 为、。

	// TODO: 在此添加额外的初始化代码
	m_ListCtrl.InsertColumn(0, L"列1", LVCFMT_CENTER, 40);  
	m_ListCtrl.InsertColumn(1, L"列2", LVCFMT_CENTER, 80);  
	m_ListCtrl.InsertColumn(2, L"列3", LVCFMT_CENTER, 45); 
	m_ListCtrl.InsertColumn(3, L"列4", LVCFMT_CENTER, 45);  
	m_ListCtrl.InsertColumn(4, L"列5", LVCFMT_CENTER, 40);  
	m_ListCtrl.InsertColumn(5, L"列6", LVCFMT_CENTER, 80);  
	//扩展属性 LVS_EX_DOUBLEBUFFER 用来防闪烁  
	m_ListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER ); 


下面要加入个消息

LVN_GETDISPINFO
void CDemoVirtualDlg::OnGetdispinfoList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);              
	LV_ITEM* pItem= &(pDispInfo)->item;  
	if ( pItem->mask & LVIF_TEXT )  
	{         
		CString text;         
		switch (pItem->iSubItem)  
		{  
		case 0:  
			{  
				
				lstrcpyn(pItem->pszText, m_listdata[pItem->iItem].name1, pItem->cchTextMax);  
				break;  
			}  
		case 1:  
			{  
				lstrcpyn(pItem->pszText, m_listdata[pItem->iItem].name2, pItem->cchTextMax);
				break;  
			}  
		case 2:  
			{  
				lstrcpyn(pItem->pszText, m_listdata[pItem->iItem].name3, pItem->cchTextMax);
				break;  
			}  
		case 3:  
			{  
				lstrcpyn(pItem->pszText, m_listdata[pItem->iItem].name4, pItem->cchTextMax);
				break;  
			}  
		case 4:  
			{  
				lstrcpyn(pItem->pszText, m_listdata[pItem->iItem].name5, pItem->cchTextMax);
				break;  
			}  
		case 5:  
			{  
				lstrcpyn(pItem->pszText, m_listdata[pItem->iItem].name6, pItem->cchTextMax);
				break;  
			}                         
		default:  
			break;  
		}     
	}
	*pResult = 0;
}

下面一个未声明的变量就出来 了 那个 是我自定义的一个结构体。 //网上就是漏说了这个 。

class MyData
{
public:
	MyData()
	{
		name1.Format(L"第一列 %d行",num);
		name2.Format(L"第二列 %d行",num);
		name3.Format(L"第三列 %d行",num);
		name4.Format(L"第四列 %d行",num);
		name5.Format(L"第五列 %d行",num);
		name6.Format(L"第六列 %d行",num);
		num++;
	};
	static int num;
	CString name1;
	CString name2;
	CString name3;
	CString name4;
	CString name5;
	CString name6;
};

然后在对话框中 加入 一个变量 
vector<MyData> m_listdata;
 到了这一步基本已经 完成了 ,我们在  OninitDialog 中进行赋值数据。
加入 以下代码


for(int i=0;i<1000;i++)//先加入  1000个数据  
{  
    m_listdata.push_back(MyData());  
}  
m_ListCtrl.SetItemCount(m_listdata.size());//当执行这个函数时就会发送 LVN_GETDISPINFO 这个消息。
//Invalidate必须加, 窗口失去焦点时, 不会实时显示数据    
m_ListCtrl.Invalidate();  


 更多参考:https://workspaces.codeproject.com/user-10825319/using-virtual-lists


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值