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

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

20081010日星期五

要实现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(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作为基类就可以了。

 

运行结果图如下:

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
MFC是Microsoft Foundation Classes的缩写,是微软为了简化Windows编程而开发的一套C++类库。ListCtrl是MFC的一个件,用于显示和编辑数据的列表。 要在MFC实现编辑ListCtrl件,可以按照以下步骤进行操作: 1. 在对话框资源添加一个ListCtrl件,并设置其属性,如样式、列数等。可以使用件向导来简化这一过程。 2. 在对话框类的头文件声明一个ListCtrl对象,用于对件进行操作。例如,在CDialog派生类添加如下成员变量: ```cpp CListCtrl m_listCtrl; ``` 3. 在OnInitDialog函数获取ListCtrl件的指针,并进行初始化操作。例如: ```cpp m_listCtrl.SubclassDlgItem(IDC_LISTCTRL, this); //将件与IDC_LISTCTRL关联起来 m_listCtrl.InsertColumn(0, _T("列1"), LVCFMT_LEFT, 100); //插入列 ``` 4. 通过ListCtrl对象的成员函数,可以实现的数据进行操作。例如,添加一行数据的代码如下: ```cpp m_listCtrl.InsertItem(0, _T("数据1")); //在第0行插入一行数据 m_listCtrl.SetItemText(0, 1, _T("数据2")); //设置第0行、第1列的数据 ``` 5. 若要实现编辑功能,可以通过响应鼠标双击、单击或其他事件,在合适的位置进行编辑操作。例如,在双击某一项时弹出对话框进行编辑: ```cpp int index = m_listCtrl.GetSelectionMark(); //获取当前选的项 CString data = m_listCtrl.GetItemText(index, 1); //获取选项的数据 CEditDialog editDlg; //自定义的对话框类 editDlg.m_editCtrl.SetWindowText(data); //将数据显示在对话框的编辑 if (editDlg.DoModal() == IDOK) { CString newData; editDlg.m_editCtrl.GetWindowText(newData); //获取对话框编辑框的数据 m_listCtrl.SetItemText(index, 1, newData); //更新ListCtrl的数据 } ``` 通过以上步骤,就可以实现在MFC编辑ListCtrl件。需要注意的是,在实际应用过程可能还需要处理其他事件、进行数据校验等操作,具体实现可根据需求进行扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值