CListCtrl LPSTR_TEXTCALLBACK 问题

huanchunling 2013-01-10 06:07:20
Hi,
我现在想动态更新CListCtrl里面项的text, 但是不能成功。
代码如下:
DWORD dwStyle =  m_listctrl.GetExtendedStyle();
m_listctrl.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_BORDERSELECT | LVS_EX_SUBITEMIMAGES);

int nIndex = m_listctrl.InsertColumn(0, _T("ICon"), LVCFMT_LEFT, 50
nIndex = m_listctrl.InsertColumn(1, _T("Job"), LVCFMT_LEFT, 200);
nIndex = m_listctrl.InsertColumn(2, _T("ICon"), LVCFMT_LEFT, 50);

LVITEM lvi;
memset(&lvi, 0, sizeof(lvi));

//The first column used display an icon
lvi.mask = LVIF_IMAGE;
lvi.iItem = 0;
lvi.iImage = I_IMAGECALLBACK;
int nItem = m_listctrl.InsertItem(&lvi);

//The second column used for display an icon and a label
memset(&lvi, 0, sizeof(lvi));
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
lvi.iItem = nItem;
lvi.iImage = I_IMAGECALLBACK;
lvi.iSubItem = 1;
m_listctrl.SetItem(&lvi);

//The third column used for display an icon
memset(&lvi, 0, sizeof(lvi));
lvi.mask = LVIF_IMAGE ;
lvi.iItem = nItem;
lvi.iImage = I_IMAGECALLBACK;
lvi.iSubItem = 2;
m_listctrl.SetItem(&lvi);



void CAboutDlg::OnLvnGetdispinfoList(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
*pResult = 0;

if (pDispInfo->item.mask & TVIF_SELECTEDIMAGE
|| pDispInfo->item.mask & TVIF_IMAGE)
{
int nImage = m_BFImageList.Add(::AfxGetApp()->LoadIcon(IDR_MAINFRAME));
pDispInfo->item.iImage = nImage;

if(pDispInfo->item.mask & TVIF_TEXT)
{
if(pDispInfo->item.iSubItem == 1)
m_listctrl.SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, _T("aaa"));
}
}
else if (pDispInfo->item.mask & TVIF_TEXT)
{
m_listctrl.SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, _T("aaa"));
}
// TODO: Add your control notification handler code here
*pResult = 0;
}

当调试的时候发现,第一次"aaa"能正确的设置到列表框,但是以后OnLvnGetdispinfoList的调用都不会再去设置text了,如果我想再一次去更新text, 应该怎么做或者CListCtrl无法实现?
...全文
189 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2013-01-11
  • 打赏
  • 举报
回复
If the LVITEM structure is receiving item text, the pszText and cchTextMax members specify the address and size of a buffer. You can either copy text to the buffer or assign the address of a string to the pszText member. In the latter case, you must not change or delete the string until the corresponding item text is deleted or two additional LVN_GETDISPINFO messages have been sent.
huanchunling 2013-01-11
  • 打赏
  • 举报
回复
牛, 这个你是怎么发现的
Eleven 2013-01-10
  • 打赏
  • 举报
回复
OnLvnGetdispinfoList函数中调用CListCtrl::SetItemText()的代码换成下面这种方式的
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pnmh;
LV_ITEM* pItem= &(pDispInfo)->item;
lstrcpyn(pItem->pszText, _T("aaa"), pItem->cchTextMax);

Eleven 2013-01-10
  • 打赏
  • 举报
回复
你需要动态更新CListCtrl中的东西,直接调用CListCtrl::SetItemText()即可。
lgstudyvc 2013-01-10
  • 打赏
  • 举报
回复
刷新了后也不显示?

15,979

社区成员

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

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