VisualStudio MFC CListCtrl SetItemText失败

时间:2015-04-22 10:58:37

标签: c++ mfc clistctrl

我使用CListCtrl创建了一个MFC Visual Studio项目。我在CDialog类中添加了一些项目,如:

int l_iItem = m_listCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, counter, someString, 0, LVIS_SELECTED, 0, 0);       
m_listCtrl.SetItemText( l_iItem, 1, blockHexChar );  
m_listCtrl.SetItemText( l_iItem, 2, description);

这很好用。

之后我想编辑一个子项目(双击事件)。工作也很好。

如果编辑完成(这是在CListCtrl类中),

OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)

将被调用。看起来像这样

LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pNMHDR;   
LV_ITEM *plvItem = &plvDispInfo->item;
if (plvItem->pszText != NULL)   
{
  bool res = SetItemText(plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
}

我总是回来0,所以SetItemText失败了。

知道我做错了吗?

干杯ehmkey

3 个答案:

答案 0 :(得分:0)

您必须使用WM_USER+NNN内的PostMessage向自己发布用户定义的消息(OnEndLabelEdit)。更改标签以响应该消息。

答案 1 :(得分:0)

LVN_ENDLABELEDIT通过lParam传递指向NMLVDISPINFO的指针。我认为你在处理通知时正在查看错误的结构。使用类向导在VS2013中生成事件处理程序

void CMFCApplication6Dlg::OnLvnEndlabeleditList1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
    // TODO: Add your control notification handler code here
    *pResult = 0;
    }

答案 2 :(得分:0)

感谢您的输入,但问题出在CDialog类的MESSAGE_MAP(....)中。

我在这里有一个成员,它保存列表并直接映射到CListCtrl类。

BEGIN_MESSAGE_MAP(CPeriDialog, CDialog)
  ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST1, &CListCtrl::OnEndLabelEdit)
END_MESSAGE_MAP()

现在我创建了一个包装函数,将事件转发到正确的对象。

BEGIN_MESSAGE_MAP(CPeriDialog, CDialog)
  ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST1, &CPeriDialog::EndEdit)
END_MESSAGE_MAP()

功能简单就像这样

void CPeriDialog::EndEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
  m_listCtrl.OnEndLabelEdit(pNMHDR, pResult);
}