其實很簡單, 用控件的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的一篇文章才搞出來. 可能說法上不太一樣.