昨天搞定了CListCtrl的編輯子項的問題

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

發佈了53 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章