最近要实现CListCtrl的编辑功能,另外还要实现自动填充,在编辑完之后根据输入值自动填充其它列的值。
编辑功能是通过从CListCtrl派生一个类CEditListCtrl实现的。
在CEditListCtrl中响应了LVN_ENDLABELEDIT消息,让其在编辑完成后设置Item的值:
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
void CEditListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO *plvDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM *plvItem = &plvDispInfo->item;
if (plvItem->pszText != NULL && plvItem->iItem != -1)
{
SetItemText(plvDispInfo->item.iItem, plvDispInfo->item.iSubItem, plvDispInfo->item.pszText);
}
*pResult = 0;
}
而自动填充的在对话框类中实现:
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_TUFU, &CDlgEctronicMap::OnEndLabelEdit)
void CDlgEctronicMap::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO *plvDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM *plvItem = &plvDispInfo->item;
if (plvItem->pszText != NULL && plvItem->iItem != -1)
{
int nRow, nCol;
nRow = plvDispInfo->item.iItem;
nCol = plvDispInfo->item.iSubItem;
AuToFillListControl(nRow,nCol);
}
}
结果程序只处理了CEditListCtrl类中的LVN_ENDLABELEDIT,而CDlgEctronicMap中的该消息没有被处理。。。
郁闷过后百度了一下,看到别人用ON_NOTIFY_REFLECT_EX,果断一试,结果两个类的LVN_ENDLABELEDIT都处理了。
修改如下:
ON_NOTIFY_REFLECT_EX(LVN_ENDLABELEDIT, OnEndlabeledit)
BOOL CEditListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO *plvDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM *plvItem = &plvDispInfo->item;
if (plvItem->pszText != NULL && plvItem->iItem != -1)
{
SetItemText(plvDispInfo->item.iItem, plvDispInfo->item.iSubItem, plvDispInfo->item.pszText);
}
*pResult = 0;
return FALSE;//返回false让父类可以继续处理这个消息;
}