正文

CListCtrl的LVN_GETDISPINFO更新问题2010-11-24 15:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/52050.html

分享到:

    对CListCtrl真是又爱又恨,每用一次都会发现新问题,每解决一个问题都会有新的收获。真想好好一下总结这些年对CListCtrl的知识积累,推出一个小系列。等有空啦。。。

 

    这次碰到的问题是LVN_GETDISPINFO。 我们知道,响应LVN_GETDISPINFO消息后我们可以通过结构体内容去更新列表控件,使更新CListCtrl内容变得非常简单了,尤其是可以定义自己的输出格式,例如小数点几位、字典对应等。但是我发现只有每次插入的时候(InsertItem)会触发该消息,但是当我对已有的item直接改变其关联的内存结构,却发现界面根本没有更新。难道消息没有触发?

 

    我惊讶的发现消息实际上触发了。因此响应函数(OnGetdispinfoList1)里面的代码肯定出了问题。

 

void CNavigationInOutDoorInPutDlg::OnGetdispinfoList1(NMHDR* pNMHDR, LRESULT* pResult)
{
 LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
 // TODO: Add your control notification handler code here

 int iItem = pDispInfo->item.iItem;
 int iSubItem = pDispInfo->item.iSubItem;
 C3DNaviKeyNode *pNode = (C3DNaviKeyNode *)m_inputNodeList.GetItemData(iItem);
 
 if(pDispInfo->item.mask & LVIF_TEXT)
 {
  if(iSubItem == 0)
  {
     ...
  }
  else
  {
   m_inputNodeList.SetItemText(iItem,1,pNode->m_strAliasName);
  }

 } 

 *pResult = 0; 
}

 

我使用了SetItemText来改变其内容。肯定是这里出了问题。翻看自己以前写的工程里面的正确代码发现自己写的是

strcpy(pDispInfo->item.pszText,pNode->m_strAliasName);

 

我恍然大悟。临时决定使用SetItemText看来是我大意了。具体原因暂时没时间去了解了。MFC的东西乱糟糟,不好玩。

阅读(7121) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册