写这个文章是因为,之前我在网上找的那些 介绍这个技术的。都不怎么详细。让我浪费了不少时间 。
由于数据过多普通的方式已经 满足不了我们庞大的数据了。
显而此时我们 只能用到虚表了。
下面进入 正题。如何实现。
绑定变量到ClistCtrl 上 当然 你不喜欢 用 那就用GetDlgItem 来进行插入列。
这里 我使用了 绑定,并定义为m_ListCtrl .
重点:记住要设置 Owner Data 为TRUE 。
//然后在OninitDialog 中 插入列先、
下面一个未声明的变量就出来 了 那个 是我自定义的一个结构体。 //网上就是漏说了这个 。
然后在对话框中 加入 一个变量
vector<MyData> m_listdata;
到了这一步基本已经 完成了 ,我们在 OninitDialog 中进行赋值数据。
加入 以下代码
由于数据过多普通的方式已经 满足不了我们庞大的数据了。
显而此时我们 只能用到虚表了。
下面进入 正题。如何实现。
绑定变量到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