您的位置:首页 > 其它

CListCtrl 虚拟列表显示复选框

2015-07-07 19:00 465 查看
今天写了个虚拟列表显示复选框的演示程序,放在了:http://download.csdn.net/detail/daiafei/6617913,有不明白的朋友可以下载一下。

在用ClistCtrl控件显示大量数据的时候速度相当慢,而且对内存的占用也是相当大,特别是针对数据库中数据显示的时候,因为数据库中的数据量一般都比较庞大,所以如果使用默认的CListCtrl控件就显得力不从心了,那么是不是大量数据就不能使用CListCtrl空间进行显示了那,当然不是了,CListCtrl控件支持虚拟列表技术,采用虚拟列表对大量数据进行显示,既可以提高速度(不是一般的快,是非常快),还可以减少内存占用,不过虚拟列表和普通的列表实现显示的方式不太一样,并且在使用虚拟列表之后,你会发现如果你设置了LVS_EX_CHECKBOXES风格想显示复选框,但复选框位置是空白的,并没有显示复选框,这里就教你怎么显示虚拟列表中的复选框。

1、你需要记录当前选择的记录的状态(选中或未选中),这样你才能在列表需要数据的时候得到当前数据的选择状态(虚拟列表中需要自己管理数据的选中状态)

2、在单击事件中处理状态的改变

3、在LVN_GETDISPINFO事件中显示状态

下面给出一些显示时的代码

[html] view
plaincopy





void CTestUndeleteDlg::OnLvnGetdispinfoList1(NMHDR *pNMHDR, LRESULT *pResult)

{

NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);

// TODO: 在此添加控件通知处理程序代码

//Create a pointer to the item

LV_ITEM* pItem= &(pDispInfo)->item;

//Which item number?

int itemid = pItem->iItem; //行号

//Do the list need text information?

if (pItem->mask & LVIF_TEXT)

{

switch (pItem->iSubItem)//列号

{

case 0:

text.Format(L"%d行 %d列",itemid,pItem->iSubItem );

break;

case 1:

text.Format(L"%d行 %d列",itemid,pItem->iSubItem );

break;

case 2:

text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;

case 3:text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;

case 4:text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;

case 5:text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;

}lstrcpyn(pItem->pszText, text, pItem->cchTextMax);//建议使用该函数复制字符给子项,复制的更安全,字符数由pItem->cchTextMax给出 text.Empty();

} pItem->mask |= LVIF_STATE;

pItem->stateMask = LVIS_STATEIMAGEMASK;

if(Itemlist[itemid].bChecked)//判断结构中保存的当前行的选中状态

{

pItem->state |= INDEXTOSTATEIMAGEMASK(2); //取你自己保存的state状态, 需要用到INDEXTOSTATEIMAGEMASK

}else

{

pItem->state |= INDEXTOSTATEIMAGEMASK(1); //未选中

}

*pResult = 0;

}

在单击事件中直接判断Itemlist[itemid].bChecked的选中状态即可,对该值进行取反操作然后更新状态即可完成选中与取消

[html] view
plaincopy





void CTestUndeleteDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult){ NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);

// TODO: 在此添加控件通知处理程序代码

//Create a pointer to the item

LV_ITEM* pItem= &(pDispInfo)->item;

int itemid = pItem->iItem; //行号 Itemlist[itemid].bChecked = !Itemlist[itemid].bChecked;//改变状态

m_ListAll.RedrawItems(itemid , itemid );//重绘当前项 *pResult = 0;}

/article/7882193.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: