对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的东西乱糟糟,不好玩。
评论