VisualStudio MFC CListCtrl SetItemText 失败

VisualStudio MFC CListCtrl SetItemText fails

我创建了一个带有 CListCtrl 的 MFC Visual Studio 项目。我在 CDialog class 中添加了一些项目,例如:

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中class),

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

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

LVN_ENDLABELEDIT passes a pointer to NMLVDISPINFO 通过 lParam。我认为您在处理通知时看错了结构。使用 class 向导在 VS2013 中生成事件处理程序给出

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

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

我这里有一个成员,里面有一个列表,我直接映射到CListCtrl Class。

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);
}