虚拟CListCtrl的问题(ownerdata),急
我要用CListCtrl显示大量数据,所以要用虚拟列表,但是用vc6没有问题,在vc2005就出现一个错误,就是选择了多行以后,在选择的行中点击任何一行都会出错,使用的方法都一样,请行家指点一二.
vc6的调用函数:
void OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)-> item;
lstrcpyn(pItem-> pszText, "1 ", pItem-> cchTextMax);
*pResult = 0;
}
vc2005的调用函数
void OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVDISPINFO* pDispInfo = (NMLVDISPINFO*)pNMHDR;
LV_ITEM* pItem = &pDispInfo-> item;
lstrcpyn(pItem-> pszText, "1 ", pItem-> cchTextMax);
*pResult = 0;
}
[解决办法]
lz的写法不太严谨,应总是判断mask位是否存在。参考:
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)-> item;
int iItemIndx= pItem-> iItem;
if (pItem-> mask & LVIF_TEXT) // valid text buffer?
{
switch(pItem-> iSubItem){
case 0: //fill in main text
lstrcpy(pItem-> pszText,
m_Items[iItemIndx].m_strItemText);
break;
case 1: //fill in sub item 1 text
lstrcpy(pItem-> pszText,
m_Items[iItemIndx].m_strSubItem1Text);
break;
case 2: //fill in sub item 2 text
lstrcpy(pItem-> pszText,
m_Items[iItemIndx].m_strSubItem2Text);
break;
}
}
if pItem-> mask & LVIF_IMAGE) //valid image?
pItem-> iImage=
m_Items[iItemIndx].m_iImageIndex;
另外,变量定义与常量都使用可移植类型,一般都不会有问题。即:
1、变量尽量使用TCHAR,而不是char或WCHAR
2、常量总是使用_T宏,如_T( "1 "),而不是 "1 "或L "1 "