动态创建CListCtrl可以使用虚拟列表技术吗?
1去23里 2016-04-14 10:36:59 问题1:
动态创建的CListCtrl控件, LVN_GETDISPINFO 消息没响应。
问题2:
CListCtrl动态创建的怎么设置 Owner Data属性。
以下为实现代码,请大神帮帮忙
一、消息映射
BEGIN_MESSAGE_MAP(CCListViewTestView, CListView)
ON_WM_CONTEXTMENU()
ON_WM_RBUTTONUP()
ON_NOTIFY(LVN_GETDISPINFO, 12345, &CCListViewTestView::GetDisplayed)
END_MESSAGE_MAP()
二、映射函数
void CCListViewTestView::GetDisplayed(NMHDR *pNMHDR, LRESULT *pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
if (pItem == NULL)
return;
CString strTmp = _T("");
int iItemIndx= pItem->iItem;
if (pItem->mask & LVIF_TEXT) //字符串缓冲区有效
{
switch(pItem->iSubItem)
{
case 0:
{
strTmp.Format("%d", m_aryLstData[iItemIndx].dwcolIdx);
lstrcpy(pItem->pszText, strTmp);
strTmp = "";
}
break;
case 1:
{
strTmp.Format("%s", m_aryLstData[iItemIndx].chcolValue1);
lstrcpy(pItem->pszText, strTmp);
strTmp = "";
}
break;
case 2:
{
strTmp.Format("%s", m_aryLstData[iItemIndx].chcolValue2);
lstrcpy(pItem->pszText, strTmp);
strTmp = "";
}
break;
case 3:
{
strTmp.Format("%s", m_aryLstData[iItemIndx].chcolValue3);
lstrcpy(pItem->pszText, strTmp);
strTmp = "";
}
break;
}
}
*pResult = 0;
}
三、初始化
void CCListViewTestView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// Gain a reference to the list control itself.
CRect rect;
GetWindowRect(&rect); //整个 视区的 CRect;
m_listCtrl.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,
CRect(0,0,rect.right,rect.bottom), this, 12345);
m_listCtrl.InsertColumn(0,"标题一",LVCFMT_LEFT,100);
m_listCtrl.InsertColumn(1,"标题二",LVCFMT_LEFT,100);
m_listCtrl.InsertColumn(2,"标题三",LVCFMT_LEFT,160);
m_listCtrl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER );
m_listCtrl.SetItemCountEx(100000, LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL);
//Invalidate必须加, 窗口失去焦点时, 不会实时显示数据
m_listCtrl.Invalidate();
m_aryLstData.clear();
DWORD dwAryTotalCount = 0;
for (DWORD dwAryIdx = 0; dwAryIdx < 100000; dwAryIdx++)
{
LST_DATA lstData;
lstData.dwcolIdx = dwAryIdx;
sprintf(lstData.chcolValue1, "%d", dwAryIdx);
sprintf(lstData.chcolValue2, "%d", dwAryIdx);
sprintf(lstData.chcolValue3, "%d", dwAryIdx);
m_aryLstData.push_back(lstData);
}
}