其实很简单, 用控件的SubItemHitTest方法确定选定子项, 然后调用EditLabel方法. 再将EditLabel方法进行子类化处理, 无非就是处理控件的LvnBeginlabeledit和LvnEndlabeledit消息, 源代码如下:
void CMultiPublishDlg::OnNMDblclkListCustomer(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
m_iItem = -1;
m_iSubItem = -1;
LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;
if(lpNMItemActivate != NULL)
{
m_iItem = lpNMItemActivate->iItem;
m_iSubItem = lpNMItemActivate->iSubItem;
}
//m_list_customer.EditLabel(nItem);//默认情况下,只能编辑主项
LVHITTESTINFO lvhit;
lvhit.pt = lpNMItemActivate->ptAction;
m_list_customer.SubItemHitTest(&lvhit);
if (lvhit.flags & LVHT_ONITEMLABEL)
{
//m_list_customer.SetItemText(lvhit.iItem, lvhit.iSubItem, NULL);
if (m_iItem != -1 && (lvhit.flags & LVHT_ONITEM))
{
if( m_iItem == lvhit.iItem && m_iSubItem == lvhit.iSubItem)
m_list_customer.EditLabel(m_iItem);//需要将EditLabel进行子类化处理,以控制它出现的位置
}
else
{
}
}
}
void CMultiPublishDlg::OnLvnBeginlabeleditListCustomer(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (m_iSubItem >= 0)
{
ASSERT(m_iItem == pDispInfo->item.iItem);
CRect rcSubItem;
m_list_customer.GetSubItemRect( pDispInfo->item.iItem, m_iSubItem, LVIR_BOUNDS, rcSubItem);
//get edit control and subclass
//HWND hWnd = (HWND)SendMessage(LVM_GETEDITCONTROL);
HWND hWnd = m_list_customer.GetEditControl()->m_hWnd;
ASSERT(hWnd != NULL);
VERIFY(m_edtItemEdit.SubclassWindow(hWnd));
//move edit control text 4 pixel to the right of org label,
//as Windows does it...编辑框定位
m_edtItemEdit.m_iXPos = rcSubItem.left + 4;
m_edtItemEdit.m_iWidth = rcSubItem.Width();
m_edtItemEdit.SetWindowText(m_list_customer.GetItemText(pDispInfo->item.iItem, m_iSubItem));
}
*pResult = 0;
}
void CMultiPublishDlg::OnLvnEndlabeleditListCustomer(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
LV_ITEM *plvItem = &pDispInfo->item;
// TODO: 在此添加控件通知处理程序代码
if (m_iSubItem >= 0)
{
if (plvItem->pszText != NULL )
{
m_list_customer.SetItemText(plvItem->iItem,m_iSubItem, plvItem->pszText);
}
VERIFY(m_edtItemEdit.UnsubclassWindow()!=NULL);
*pResult = 0;
}
//编辑文本时对控件父窗口操作(如单击其它控件)引发"OnEndlabeledit"时刷新控件
CRect rect;
GetWindowRect(&rect);
CPoint point;
::GetCursorPos(&point);
if(!rect.PtInRect(point))
{
m_iItem = -1;
m_iSubItem = -1;
//m_bFocus = FALSE;
//m_bHighLight = FALSE;
}
//*pResult = TRUE;//允许更改item主项
}
至于其它效果, 以后再研究.
参考了vckbase.com的一篇文章才搞出来. 可能说法上不太一样.