由于项目需要,将原来的VC6.0工程在64位WIN7系统下转成VS2012工程,用x64进行编译。
编译链接均已通过,运行时界面ListCtrl中通过InsertItem加入的内容无法显示。经调试有下面几个问题:
1、执行到下面第二句时assert失败,没获取到LVS_OWNERDATA风格,而且listctrl中内容也没加进去。
不知道是否和风格相关,在之前手工设置下风格也没生效。
请问此问题如何解决,64位下是否有其它替代办法。
int i = ListCtrl.InsertItem(0,"01");
i = ListCtrl.SetItemText(0,0,"chetnao");BOOL CListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
{
ASSERT(::IsWindow(m_hWnd));
ASSERT((GetStyle() & LVS_OWNERDATA)==0);
LVITEM lvi;
lvi.iSubItem = nSubItem;
lvi.pszText = (LPTSTR) lpszText;
return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
}2、调用SetItemState函数不会自动调用OnSelectRow函数。
ListCtrl.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED);3、OnGetdispinfo函数传入参数和所要值不一致。void CCapItemFileListView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;    LV_ITEM* pItem= &(pDispInfo)->item;//这里取pItem时发现错位了4个字节,开始怀疑是前面LV_DISPINFO结构8字节对齐导致,改成一字节对齐后还未生效。
     之后强制改成LV_ITEM* pItem= (LV_ITEM*)((char*)&(pDispInfo)->item + 4);
    pItem中mask,iItem等内容均和32位下匹配,但是往pItem->pszText中赋值时失败,怀疑是该指针未分配内存,不知如何解决?该问题是否也是前面style问题导致?    if ( 0 == (pItem->mask & LVIF_TEXT) )
        return;VC64位Visual Studio 2012Windows 7

解决方案 »

  1.   

    ASSERT((GetStyle() & LVS_OWNERDATA)==0);
    --------
    就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误
      

  2.   

    sorry,看错了。 不设置LVS_OWNERDATA属性SetItemText是OK了。不过OnGetdispinfo函数就进不去了。

    如果你设置了,就错~
      

  3.   


    如果你设置了,就错~
    BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
       ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
    END_MESSAGE_MAP()加的对吗?
      

  4.   


    如果你设置了,就错~
    BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
       ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
    END_MESSAGE_MAP()加的对吗?这个都没问题,因为WIN32下是OK的。
    BEGIN_MESSAGE_MAP(CCapItemFileListView, CCommonListView)
    ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
    END_MESSAGE_MAP()
      

  5.   


    如果你设置了,就错~
    BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
       ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
    END_MESSAGE_MAP()加的对吗?我又测了下WIN32下的,加了测试代码SetItemText也不行。
    估计本来就是通过设置LVS_OWNERDATA属性调用OnGetdispinfo函数来给listctrl赋值。