我要用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;
}

解决方案 »

  1.   

    List控件的样式为:WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_OWNERDATA
    扩展样式为:
    LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES真的有点郁闷,因为是运行时发送错误,跟踪都不知道往哪里跟踪。
      

  2.   

    1.出错时,直接选择重试 ,然后选择中断,再选择调用堆栈,也不行吗?
    2.vc6.0和vc2005的编码方式不一样,一个是Unicode,一个是ANSI
    lstrcpyn(pItem->pszText, "1", pItem->cchTextMax);不知道LZ的pItem->cchTextMax设置的多大,如何计算的?因为在使用该函数的时候,unicode和ansi是不同的.
      

  3.   

    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"
      

  4.   

    dyw(道不同不相为谋) 正解,是忘记了if (pItem->mask & LVIF_TEXT)这个条件判断,看过别的例子用这个判断,自己用的时候没在意,不是很清楚这个条件是判断什么的。