VC6.0工程转成64位VS2012,CListView问题咨询【急】

godgogogo 2013-05-23 11:45:24
由于项目需要,将原来的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;
...全文
116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2013-05-23
  • 打赏
  • 举报
回复
ASSERT((GetStyle() & LVS_OWNERDATA)==0); -------- 就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误
godgogogo 2013-05-23
  • 打赏
  • 举报
回复
第一个问题大家就不用管了,主要是第二第三个问题。
godgogogo 2013-05-23
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
[quote=引用 4 楼 godgogogo 的回复:] sorry,看错了。 不设置LVS_OWNERDATA属性SetItemText是OK了。不过OnGetdispinfo函数就进不去了。 [quote=引用 3 楼 VisualEleven 的回复:] [quote=引用 2 楼 godgogogo 的回复:] 试过设置该属性,但无法生效。 [quote=引用 1 楼 VisualEleven 的回复:] ASSERT((GetStyle() & LVS_OWNERDATA)==0); -------- 就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误
[/quote] 如果你设置了,就错~[/quote][/quote] BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo) END_MESSAGE_MAP() 加的对吗?[/quote] 我又测了下WIN32下的,加了测试代码SetItemText也不行。 估计本来就是通过设置LVS_OWNERDATA属性调用OnGetdispinfo函数来给listctrl赋值。
godgogogo 2013-05-23
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
[quote=引用 4 楼 godgogogo 的回复:] sorry,看错了。 不设置LVS_OWNERDATA属性SetItemText是OK了。不过OnGetdispinfo函数就进不去了。 [quote=引用 3 楼 VisualEleven 的回复:] [quote=引用 2 楼 godgogogo 的回复:] 试过设置该属性,但无法生效。 [quote=引用 1 楼 VisualEleven 的回复:] ASSERT((GetStyle() & LVS_OWNERDATA)==0); -------- 就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误
[/quote] 如果你设置了,就错~[/quote][/quote] BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo) END_MESSAGE_MAP() 加的对吗?[/quote] 这个都没问题,因为WIN32下是OK的。 BEGIN_MESSAGE_MAP(CCapItemFileListView, CCommonListView) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo) END_MESSAGE_MAP()
Eleven 2013-05-23
  • 打赏
  • 举报
回复
引用 4 楼 godgogogo 的回复:
sorry,看错了。 不设置LVS_OWNERDATA属性SetItemText是OK了。不过OnGetdispinfo函数就进不去了。 [quote=引用 3 楼 VisualEleven 的回复:] [quote=引用 2 楼 godgogogo 的回复:] 试过设置该属性,但无法生效。 [quote=引用 1 楼 VisualEleven 的回复:] ASSERT((GetStyle() & LVS_OWNERDATA)==0); -------- 就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误
[/quote] 如果你设置了,就错~[/quote][/quote] BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo) END_MESSAGE_MAP() 加的对吗?
godgogogo 2013-05-23
  • 打赏
  • 举报
回复
sorry,看错了。 不设置LVS_OWNERDATA属性SetItemText是OK了。不过OnGetdispinfo函数就进不去了。
引用 3 楼 VisualEleven 的回复:
[quote=引用 2 楼 godgogogo 的回复:] 试过设置该属性,但无法生效。 [quote=引用 1 楼 VisualEleven 的回复:] ASSERT((GetStyle() & LVS_OWNERDATA)==0); -------- 就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误
[/quote] 如果你设置了,就错~[/quote]
Eleven 2013-05-23
  • 打赏
  • 举报
回复
引用 2 楼 godgogogo 的回复:
试过设置该属性,但无法生效。 [quote=引用 1 楼 VisualEleven 的回复:] ASSERT((GetStyle() & LVS_OWNERDATA)==0); -------- 就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误
[/quote] 如果你设置了,就错~
godgogogo 2013-05-23
  • 打赏
  • 举报
回复
试过设置该属性,但无法生效。
引用 1 楼 VisualEleven 的回复:
ASSERT((GetStyle() & LVS_OWNERDATA)==0); -------- 就是需要你没有设置LVS_OWNERDATA属性,如果设置了该属性,这里就会出现ASSERT错误

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧