WEB开发网
开发学院软件开发VC 可编辑子项的CListCtrl类 阅读

可编辑子项的CListCtrl类

 2010-07-06 20:43:53 来源:WEB开发网   
核心提示:单击一次文本高亮,再单击一次文本开始编辑在WM_LBUTTONDOWN消息处理中实现:void CEditListCtrl::OnLButtonDown(UINT nFlags, CPoint point){m_bFocus = TRUE;LVHITTESTINFOlvhit;lvhit.pt = point;int

单击一次文本高亮,再单击一次文本开始编辑在WM_LBUTTONDOWN消息处理中实现:

void CEditListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
  m_bFocus = TRUE;
  LVHITTESTINFO lvhit;
  lvhit.pt = point;
  int item = SubItemHitTest(&lvhit);

  //if (over a item/subitem)
  if (item != -1 && (lvhit.flags & LVHT_ONITEM))
  {
    CListCtrl::OnLButtonDown(nFlags, point);

    if(m_bHighLight && m_iItem == lvhit.iItem && m_iSubItem == lvhit.iSubItem)
    {
      //第二次单击
      EditLabel(m_iItem);
      return;
    }
    else
    {
      //第一次单击
      m_iItem = lvhit.iItem;
      m_iSubItem = lvhit.iSubItem;
      m_bHighLight = TRUE;
    }
  }
  else
  {
    if(m_edtItemEdit.m_hWnd == NULL)
    {
      //未出现文本编辑框时
      m_bHighLight = FALSE;
    }

    CListCtrl::OnLButtonDown(nFlags, point);
  }

  Invalidate(); //强制重绘控件
}

关键的一步,对项文本进行编辑。在以上代码中当执行到EditLabel时将会产生一个编辑框,这时需要将它进行子类化处理,以控制它出现的位置。

void CEditListCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
  LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  if (m_iSubItem >= 0)
  {
    ASSERT(m_iItem == pDispInfo->item.iItem);
    CRect rcSubItem;
    GetSubItemRect( pDispInfo->item.iItem, m_iSubItem, LVIR_BOUNDS, rcSubItem);

    //get edit control and subclass
    HWND hWnd= (HWND)SendMessage(LVM_GETEDITCONTROL);
    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.SetWindowText(GetItemText(pDispInfo->item.iItem, m_iSubItem));
  }
  *pResult = 0;
}
void CEditListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
  LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  LV_ITEM  *plvItem = &pDispInfo->item;

  if (m_iSubItem >= 0)
  {
    if (plvItem->pszText != NULL )
    {
      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;
  }
}

通过以上三个步骤大体实现了本文要达到的目的,但是还不能放松。接下来还要进行一些显示细节方面的处理。这包括对WM_PAINT、WM_SETFOCUS和WM_KILLFOCUS消息的处理,限于篇幅,就不进行细讲了,有兴趣的朋友可以查看本文提供的源代码。最后实现的效果如下图所示:

本文配套源码

上一页  1 2 

Tags:编辑 子项 CListCtrl

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接