實現ListCtrl控件中數據項可編輯功能
編寫:
要實現ListCtrl可編輯功能,只要在響應鼠標雙擊事件時,獲取List中當前鼠標所在的Iem和SubItem序號,並獲取當前數據項的Point位置,然後在響應的位置即時生成一個編輯框,並將原來數據項中的內容寫入到編輯框中等待編輯,最後將編輯過的內容再保存到數據項中。
爲了實現這個功能,我需要對CListCtrl和CEdit進行子類化。
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作爲基類就可以了。