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);
}
我创建了一个带有 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);
}