实现ListCtrl控件中 数据项可编辑功能

来源:互联网 发布:网易云课堂 mac 编辑:程序博客网 时间:2024/04/29 20:36

 

实现ListCtrl控件中数据项可编辑功能

编写:

要实现ListCtrl可编辑功能,只要在响应鼠标双击事件时,获取List中当前鼠标所在的IemSubItem序号,并获取当前数据项的Point位置,然后在响应的位置即时生成一个编辑框,并将原来数据项中的内容写入到编辑框中等待编辑,最后将编辑过的内容再保存到数据项中。

为了实现这个功能,我需要对CListCtrlCEdit进行子类化。

1  CEidtListCtrl的实现

class CEditListCtrl : public CListCtrl

{

  DECLARE_DYNAMIC(CEditListCtrl)

 

public:

  CEditListCtrl();

  virtual ~CEditListCtrl();

 

protected:

  DECLARE_MESSAGE_MAP()

public:

  afx_msg void OnLButtonDblClk(UINTnFlags, CPoint point);

  afx_msgLRESULT OnEditEnd(WPARAM wParam,LPARAM lParam = FALSE);

public:

  void ShowEdit(bool bShow, int nItem, int nSubItem,CRect rcCtrl);

  CListCtrlEditm_Edit;

};

 

// 双击鼠标左键促发事件

//

void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPointpoint)

{

  // TODO: 在此添加消息处理程序代码和/或调用默认值

  CRectrcCtrl;

LVHITTESTINFO lvhti;

lvhti.pt = point;

nItem =CListCtrl::SubItemHitTest(&lvhti);

if (nItem == -1) return;

nSubItem =lvhti.iSubItem;

CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);

ShowEdit(TRUE,nItem,nSubItem,rcCtrl);

 

  CListCtrl::OnLButtonDblClk(nFlags,point);

}

 

//--------------------------------------------------------------------------------------------------------------

//

// 函数定义:void ShowEdit(bool bShow, int nItem, int nSubItem,CRect rcCtrl);

// 函数描述:在响应双击消息时,显示编辑框

//

void CEditListCtrl::ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl)

{

  if (m_Edit.m_hWnd== NULL)

  {

      m_Edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,IDC_EDIT);

      m_Edit.ShowWindow(SW_HIDE);

 

      CFonttpFont;

      tpFont.CreateStockObject(DEFAULT_GUI_FONT);

      m_Edit.SetFont(&tpFont);

      tpFont.DeleteObject();

  }

  if (bShow == TRUE)

  {

      CStringstrItem = CListCtrl::GetItemText(nItem,nSubItem);

     m_Edit.MoveWindow(&rcCtrl);

     m_Edit.ShowWindow(SW_SHOW);

     m_Edit.SetWindowText(strItem);

     m_Edit.SetFocus();

     m_Edit.SetSel(-1); 

  }

  else

      m_Edit.ShowWindow(SW_HIDE);

}

 

// 编辑框失去焦点时促发事件

//

LRESULTCEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)

{

  CStringstrText;

  m_Edit.GetWindowText(strText);

  CListCtrl::SetItemText(nItem,nSubItem,strText);

  m_Edit.ShowWindow(SW_HIDE);

 

  return 0;

}

2  CListCtrlEdit的实现

class CListCtrlEdit : public CEdit

{

     DECLARE_DYNAMIC(CListCtrlEdit)

 

public:

     CListCtrlEdit();

     virtual ~CListCtrlEdit();

 

protected:

     DECLARE_MESSAGE_MAP()

public:

     afx_msg void OnKillFocus(CWnd*pNewWnd);

};

 

// 编辑框失去焦点来促发自定义消息函数

//

void CListCtrlEdit::OnKillFocus(CWnd* pNewWnd)

{

     CEdit::OnKillFocus(pNewWnd);

 

     // 发送消息

     CWnd*pParent = this->GetParent();

     ::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,0,0);

}

3  可编辑数据项的实现

只需要将你要实现的ListCtrl使用CEditListCtrl作为基类就可以了。

 

原创粉丝点击