我要用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;
}
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;
}
扩展样式为:
LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES真的有点郁闷,因为是运行时发送错误,跟踪都不知道往哪里跟踪。
2.vc6.0和vc2005的编码方式不一样,一个是Unicode,一个是ANSI
lstrcpyn(pItem->pszText, "1", pItem->cchTextMax);不知道LZ的pItem->cchTextMax设置的多大,如何计算的?因为在使用该函数的时候,unicode和ansi是不同的.
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"