可编辑的list control的实现
关键点:用一个cedit控件来实现对应位置的操作
// 头文件 class CMyEdit : public CEdit { public: afx_msg void OnKillFocus(CWnd* pNewWnd); }; // MyEdit.cpp : 实现文件 BEGIN_MESSAGE_MAP(CMyEdit, CEdit) ON_WM_KILLFOCUS() END_MESSAGE_MAP() // CMyEdit 消息处理程序 void CMyEdit::OnKillFocus(CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); // TODO: 在此处添加消息处理程序代码 CWnd* pParent = this->GetParent(); ::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,0,0); } // 头文件 class CMyListCtrl : public CListCtrl { public: afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); afx_msg LRESULT OnEditEnd(WPARAM wParam, LPARAM lParam); public: void ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl); CMyEdit m_edit; private: int m_nItem; int m_nSubItem; }; // MyListCtrl.cpp : 实现文件 BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) ON_WM_LBUTTONDBLCLK() ON_MESSAGE(WM_USER_EDIT_END, &CMyListCtrl::OnEditEnd) END_MESSAGE_MAP() void CMyListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CRect rcCtrl; LVHITTESTINFO lvhti; lvhti.pt = point; m_nItem = CListCtrl::SubItemHitTest(&lvhti); if (m_nItem == -1) return; m_nSubItem = lvhti.iSubItem; if (m_nSubItem !=1) return; CListCtrl::GetSubItemRect(m_nItem,m_nSubItem,LVIR_LABEL,rcCtrl); ShowEdit(TRUE,m_nItem,m_nSubItem,rcCtrl); CListCtrl::OnLButtonDblClk(nFlags, point); } void CMyListCtrl::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_FOR_LISTCTRL); m_edit.ShowWindow(SW_HIDE); CFont tpFont; tpFont.CreateStockObject(DEFAULT_GUI_FONT); m_edit.SetFont(&tpFont); tpFont.DeleteObject(); } if (bShow == TRUE) { CString strItem = 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); } LRESULT CMyListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam) { CString strText; m_edit.GetWindowText(strText); CListCtrl::SetItemText(m_nItem,m_nSubItem,strText); m_edit.ShowWindow(SW_HIDE); return 0; }