实现列表控件的子条目编辑

翻译|其它|编辑:郝浩|2004-01-16 10:00:00.000|阅读 1824 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


本文译自CodeGuru

环境: VC6 SP5

这篇文章提供了一个子类化列表控件中编辑控件的方法。与其他使用LVM_GETEDITCONTROL进行子类化不同,我使用一种更简捷的方法。步骤如下:

  1. 变量
    public:
      CSubEdit m_editWnd;
      int m_item;
      int m_subitem;
    
    CSubeditListView::CSubeditListView()
    {
      m_subitem = 0;
    }
    
  2. 监视鼠标点击动作
    void CSubeditListView::OnLButtonDown(UINT nFlags, CPoint point)
    {
      LVHITTESTINFO  lvhit;
      lvhit.pt = point;
      int item = GetListCtrl().SubItemHitTest(&lvhit);
    
      //if (over a subitem)
      if (item != -1 && lvhit.iSubItem && (lvhit.flags & 
                        LVHT_ONITEM ))
        {
        //mouse click outside the editbox in an already
        //editing cell cancels editing
        if (m_subitem == lvhit.iSubItem && item == m_item)
          {
          CListView::OnLButtonDown(nFlags, point);
          }
        else
          {
          CListView::OnLButtonDown(nFlags, point);
    
          m_subitem = lvhit.iSubItem;
          m_item = item;
          GetListCtrl().EditLabel(item);
          }
    
        }
      else
        CListView::OnLButtonDown(nFlags, point);
    }
    
  3. 调用OnBeginLabelEdit函数
    void CSubeditListView::OnBeginLabelEdit(NMHDR* pNMHDR,
        LRESULT* pResult)
    {
      LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    
      //if (subitem selected for editing)
      if (m_subitem)
        {
        ASSERT(m_item == pDispInfo->item.iItem);
    
        CRect  subrect;
        GetListCtrl().GetSubItemRect( pDispInfo->item.iItem,
                                      m_subitem,
            LVIR_BOUNDS , subrect );
    
        //get edit control and subclass
        HWND hWnd=(HWND)SendMessage(LVM_GETEDITCONTROL);
        ASSERT(hWnd!=NULL);
        VERIFY(m_editWnd.SubclassWindow(hWnd));
    
        //move edit control text 1 pixel to the right of org label,
        //as Windows does it...
        m_editWnd.m_x=subrect.left + 6; 
        m_editWnd.SetWindowText(GetListCtrl().GetItemText
            (pDispInfo->item.iItem,m_subitem));
    
        //hide subitem text so it don't show if we delete some
        //text in the edit control
        //OnPaint handles other issues also regarding this
        CRect  rect;
        GetListCtrl().GetSubItemRect(pDispInfo->item.iItem,m_subitem,
            LVIR_LABEL ,rect);
        CDC* hDc = GetDC();
        hDc->FillRect(rect,&CBrush(::GetSysColor(COLOR_WINDOW)));
        ReleaseDC(hDc);
    
        }
    
      //return: editing permitted
      *pResult = 0;
    
    }
    
  4. 定位编辑控件
    void CSubEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
    {
      lpwndpos->x=m_x;
    
      CEdit::OnWindowPosChanging(lpwndpos);
    }
    
  5. 调用paint函数
    void CSubeditListView::OnPaint()
    {
      //if (subitem editing)
      if (m_subitem)
        {
    
        CRect  rect;
        CRect  editrect;
    
        GetListCtrl().GetSubItemRect(m_item,m_subitem,LVIR_LABEL,
                                     rect);
    
        m_editWnd.GetWindowRect(editrect);
        ScreenToClient(editrect);
    
        //block text redraw of the subitems text (underneath the
        //editcontrol)
        //if we didn't do this and deleted some text in the edit
        //control, the subitems original label would show
        if (editrect.right < rect.right)
          {
          rect.left = editrect.right ;
          ValidateRect(rect);
          }
    
        //block filling redraw of leftmost item (caused by FillRect)
        GetListCtrl().GetItemRect(m_item,rect,LVIR_LABEL );
        ValidateRect(rect);
        }
    
      CListView::OnPaint();
    }
    
  6. 调用OnSize函数,使列表控件大小改变时不能进行编辑工作
    void CSubeditListView::OnSize(UINT nType, int cx, int cy)
    {
      //stop editing if resizing
      if( GetFocus() != this ) SetFocus();
    
      CListView::OnSize(nType, cx, cy);
    
    }
    
  7. 调用OnEndLabelEdit函数
    void CSubeditListView::OnEndLabelEdit(NMHDR* pNMHDR,
                                          LRESULT* pResult)
    {
      LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pNMHDR;
      LV_ITEM  *plvItem = &plvDispInfo->item;
    
      //if (end of sub-editing) do cleanup
      if (m_subitem)
        {
        //plvItem->pszText is NULL if editing canceled
        if (plvItem->pszText != NULL )
          GetListCtrl().SetItemText(plvItem->iItem,m_subitem,
              plvItem->pszText);
    
        VERIFY(m_editWnd.UnsubclassWindow()!=NULL);
    
        m_subitem = 0;
        //always revert to org label (Windows thinks we are editing
        //the leftmost item)
        *pResult = 0;
        }
      else
        //return: update label on leftmost item
        *pResult = 1;
    
    }
    


    标签:

    本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP