我使用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
答案 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);
}