實現ListCtrl控件中 數據項可編輯功能

 

實現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作爲基類就可以了。

 

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