MFC可编辑列表框控件功能实现

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shufac/article/details/52336544

MFC可编辑列表框控件功能实现

引言

列表控件主要用来以各种方式显示一组数据记录供用户进行各种操作,是最常见的控件之一。WindowsXP资源管理器中的“查看”菜单下的 “图标|平铺|列表|详细信息”就是一个非常典型的应用。MFC中的CListCtrl类提供了对列表控件操作的基本方法,包括插入一个新的项目InsertItem、删除一个项目DeleteItem、排序项目SortItems等,但CListCtrl类不支持对项目的直接编辑,只能用SetItem或者SetItemText来输入数据,使用起来非常不方便。

实际开发中需要用到列表框控件中的值可编辑,实现下图所示的功能:

图1 列表框控件可编辑功能示意图
下面介绍在Visual Studio2010中以CListCtrl类为基类构建可直接编辑的列表控件类的方法,并提供一个可运行的实例。

CEditListCtrl类的定义和实现

首先,在VS2010中新建一个MFC功能,打开类向导,在工程中添加类,设置基类为CLlistCtrl,派生类为CEditListCtrl。在CEditListCtrl类中定义四个数据成员:
CEdit * m_edit;//指向编辑框,初值为NULL
BOOL * m_isedit;//允许进行编辑的列,初值为NULL
int m_item;//当前编辑的行号,初值为-1
int m_subitem;//当前编辑的列号,初值为-1
在构造函数CEditListCtrl::CEditListCtrl()中进行初值的设定
    m_edit = NULL;//编辑框的指针,初始为NULL,表示无编辑框
    m_isedit = NULL;//标志哪些列可编辑的标志维数组,初始为NULL
    m_item = -1;//当前编辑的行号,初值为-1
m_subitem = -1;//当前编辑的列号,初值为-1
    定义一个常量ID_LISTEDIT作为m_edit所指向的编辑框的ID号:
在Resource.h中,
#define ID_LISTEDIT   1100   //自己给可编辑列表定义一个ID常量。
头文件如下:

#pragma once

// CEditListCtrl
class CEditListCtrl : public CListCtrl
{
	DECLARE_DYNAMIC(CEditListCtrl)


public:
	CEditListCtrl();
	virtual ~CEditListCtrl();


protected:
	DECLARE_MESSAGE_MAP()
public:
	CEdit * m_edit;//指向编辑框,初值为NULL
	BOOL * m_isedit;//允许进行编辑的列,初值为NULL
	int m_item;//当前编辑的行号,初值为-1
	int m_subitem;//当前编辑的列号,初值为-1
	afx_msg void OnNMClick(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMSetfocus(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	void SetEditColomn(int col,BOOL edit);
	afx_msg void OnDestroy();
};

完成的代码获取地址:http://download.csdn.net/detail/shufac/9614710

CEditListCtrl类的测试

    在上述工程的主对话框中添加一个ListCtrl控件,设置控件的显示方式为LVS_REPORT方式,ID为 :IDC_LIST_EDIT(一定要和前面定义的常量ID对应)给该控件定义一个CEditListCtrl类型的对象m_list,记得要在主对话框中加入#include "EditListCtrl.h"
再在对话框的初始化函数中添加初始化代码:
m_list.InsertColumn (0,"学号", LVCFMT_LEFT,50);
m_list.InsertColumn (1,"姓名", LVCFMT_LEFT,90);
m_list.InsertColumn (2,"年龄", LVCFMT_LEFT,50);
m_list.InsertItem (0,"1");
m_list.SetItemText (0,1,"王明");
m_list.SetItemText (0,2,"23");
m_list.InsertItem (1,"2");
m_list.SetItemText (1,1,"赵可");
m_list.SetItemText (1,2,"20");
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_list.SetEditColomn (0,TRUE);//允许第0列可直接编辑
m_list.SetEditColomn (1,TRUE); //允许第1列可直接编辑
m_list.SetEditColomn (2,TRUE); //允许第2列可直接编辑

本文中的编码在VS2010中调试通过,运行结果:当两次不连续地单击列表控件中的一个子项目后,该子项目便呈现编辑状态。向编辑框中输入数据后单击列表控件,便完成对子项目的编辑。编辑值完成之后可以获取对应单元格中的值,取值方法如下:CString str=m_ctrlList.GetItemText(1,2);//获取列表框第1行第2列



展开阅读全文

没有更多推荐了,返回首页