登录站点

用户名

密码

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

已有 1969 次阅读  2010-08-12 11:21   标签项可  ListCtrl  控件  数据  功能 
实现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(UINT nFlags, CPoint point);
  afx_msg LRESULT OnEditEnd(WPARAM wParam,LPARAM lParam = FALSE);
public:
  void ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl);
  CListCtrlEdit m_Edit;
};
 
// 双击鼠标左键促发事件
//
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  CRect rcCtrl;
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);
 
      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 CEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
  CString strText;
  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作为基类就可以了。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lixiaomin_235/archive/2009/04/21/4096885.aspx
 
 
下面这篇文章也不错:

上一篇: 用skinmagic给VC6开发的软件换肤 下一篇: VC中添加自定义消息

分享 举报