MFC之列表控件ListCtrl

MFC列表控件ListCtrl如图:
在这里插入图片描述
列表控件ListCtrl样式属性(风格)有:
Icon大图标,SmallIcon小图标、List列表、Report报告 ,但今天只谈Report报告样式:

一:基本操作

1.

(1)InsertItem --- 插入一个主项(行) 
(2)DeleteItem --- 删除一个主项 (行) 
(3)InsertColumn --- 插入一个列 
(4)DeleteColumn --- 删除一个列 (索引从0开始)
(5)SetItemText --- 设置子项文本
(6)GetItemText --- 获得子项文本
(7)GetItemCount --- 获得项目的总数(总行数目) 
(8)SetImageList --- 把图像列表与列表控件关联(设置列表图标需要)
-------------------------------------------------------
用法:
(1)InsertItem()  //插入一行

// 可以插入图片(失败则图片不能显示)
int InsertItem(const LVITEM* pItem);

 // 插入文字
int InsertItem(
				int nItem,  //第几行
				LPCTSTR lpszItem  //该行第1列的文字
				);

-------------------------------------------------------
(2)DeleteItem(iItem); //根据行号删除某行。
注意:若要删除多行时,需要从后面开始删除,因为如果从前面开始删除的话,下面的行会往上移,原来第1行就变成了第0行。

错误删法:
 m_listctrl.DeleteItem(0);
 m_listctrl.DeleteItem(1)
 
正确删法:
m_listctrl.DeleteItem(1);
m_listctrl.DeleteItem(0);
-------------------------------------------------------
(3)InsertColumn() //插入1列
int InsertColumn(
			     int nCol,     // 第几列
				 LPCTSTR lpszColumnHeading,   //列名
				 int nFormat = LVCFMT_LEFT,  // 对齐的方式
				 int nWidth = -1,  //该列的宽度
				 int nSubItem = -1  //子项的索引与列(一般缺省默认即可,可不填)
				 );

对齐的方式有3种:
			LVCFMT_LEFT (左对齐)
			LVCFMT_CENTER (居中)
			LVCFMT_RIGHT (右对齐)
-------------------------------------------------------
(4)DeleteColumn --- 删除一个列 (索引从0开始)
//注意:删除多列要从后往前删,否则出错 
for(int k=2;k>=0;k--) 
	m_ListCtrl.DeleteColumn(k); 

-------------------------------------------------------
(5)SetItemText()  //设置文字
BOOL SetItemText(
			 int nItem,  //第几行
			 int nSubItem,  //低级列
			 LPCTSTR lpszText  //文字内容
			 );

-------------------------------------------------------



2.设置列表控件的扩展样式

SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES) ;

常用的扩展样式:
LVS_EX_GRIDLINES---网格线

LVS_EX_CHECKBOXES---每一行的最前面带个复选框

LVS_EX_FULLROWSELECT---整行选中

LVS_EX_HEADERDRAGDROP---列表头可以拖动(改变位置)


二:用法案例

1.如图,布局界面
在这里插入图片描述
2.关联变量
在这里插入图片描述
“备注”编辑框ID改为:IDC_EDIT_DATA5
“总数”编辑框ID改为:IDC_EDIT2_TOTAL

3.在对话框初始化函数OnInitDialog()中设置列表控件的风格、插入表头、设置列宽等
代码如下:

BOOL CTestListCtrlDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
 	//XXXXXX
 	//默认代码
 	//XXXXXX
	
	// TODO: Add extra initialization here
	
	EnableWindowSet(FALSE); //默认某些按钮初始化为禁用
	
	//属性:网格线、整行选中、CheckBox、列表头可以拖动(改变位置)
	m_ListData.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES |LVS_EX_HEADERDRAGDROP);

	//插入表头/列名
	m_ListData.InsertColumn(0,_T("日期"),LVCFMT_CENTER);
	m_ListData.InsertColumn(1,_T("星期"),LVCFMT_CENTER);
	m_ListData.InsertColumn(2,_T("时间"),LVCFMT_CENTER);
	m_ListData.InsertColumn(3,_T("Data1"),LVCFMT_CENTER);
	m_ListData.InsertColumn(4,_T("Data2"),LVCFMT_CENTER);
	m_ListData.InsertColumn(5,_T("Data3"),LVCFMT_CENTER);
	m_ListData.InsertColumn(6,_T("Data4"),LVCFMT_CENTER);
	m_ListData.InsertColumn(7,_T("备注"),LVCFMT_CENTER);

	//设置列宽
	m_ListData.SetColumnWidth(0,80);
	m_ListData.SetColumnWidth(1,80);
	m_ListData.SetColumnWidth(2,80);
	m_ListData.SetColumnWidth(3,95);
	m_ListData.SetColumnWidth(4,95);
	m_ListData.SetColumnWidth(5,95);
	m_ListData.SetColumnWidth(6,95);
	m_ListData.SetColumnWidth(7,80);

	if (m_ListData.GetItemCount()<=0)
	{
		//总数默认为0
	   GetDlgItem(IDC_EDIT2_TOTAL)->SetWindowText(_T("0"));
	}

	return TRUE;  // return TRUE  unless you set the focus to a control
}

4.为按钮“插入数据”添加单击事件:

void CTestListCtrlDlg::OnButtonInsert() 
{
    EnableWindowSet(TRUE); //启用右边按钮等控件
}

EnableWindowSet函数:

//禁用或启用相关控件
void CTestListCtrlDlg:: EnableWindowSet(BOOL show)
{

	if (show)
	{
	  GetDlgItem(IDC_STATIC1)->EnableWindow(TRUE);
	  GetDlgItem(IDC_EDIT_DATA1)->EnableWindow(TRUE);

	  GetDlgItem(IDC_STATIC2)->EnableWindow(TRUE);
	  GetDlgItem(IDC_EDIT_DATA2)->EnableWindow(TRUE);

	  GetDlgItem(IDC_STATIC3)->EnableWindow(TRUE);
	  GetDlgItem(IDC_EDIT_DATA3)->EnableWindow(TRUE);
	  
	  GetDlgItem(IDC_STATIC4)->EnableWindow(TRUE);
	  GetDlgItem(IDC_EDIT_DATA4)->EnableWindow(TRUE);
	  
	  GetDlgItem(IDC_Tip)->EnableWindow(TRUE);
	  GetDlgItem(IDC_EDIT_DATA5)->EnableWindow(TRUE);
	
	  GetDlgItem(IDC_BUTTON_ENSURE_INSERT)->EnableWindow(TRUE);
	  GetDlgItem(IDC_BUTTON_OK)->EnableWindow(TRUE);

	}else{
	
	  GetDlgItem(IDC_STATIC1)->EnableWindow(FALSE);
	  GetDlgItem(IDC_EDIT_DATA1)->EnableWindow(FALSE);

	  GetDlgItem(IDC_STATIC2)->EnableWindow(FALSE);
	  GetDlgItem(IDC_EDIT_DATA2)->EnableWindow(FALSE);

	  GetDlgItem(IDC_STATIC3)->EnableWindow(FALSE);
	  GetDlgItem(IDC_EDIT_DATA3)->EnableWindow(FALSE);

	  GetDlgItem(IDC_STATIC4)->EnableWindow(FALSE);
	  GetDlgItem(IDC_EDIT_DATA4)->EnableWindow(FALSE);

	  GetDlgItem(IDC_Tip)->EnableWindow(FALSE);
	  GetDlgItem(IDC_EDIT_DATA5)->EnableWindow(FALSE);

	  GetDlgItem(IDC_BUTTON_ENSURE_INSERT)->EnableWindow(FALSE);
	  GetDlgItem(IDC_BUTTON_OK)->EnableWindow(FALSE);
	
	
	}
}


隐藏或显示相关控件为:
在这里插入图片描述
5.“插入数据”按钮:

//确定插入数据
void CTestListCtrlDlg::OnButtonEnsureInsert() 
{
	//或取系统时间
	SYSTEMTIME SystemTime;
	GetLocalTime(&SystemTime);

	//年月日
	CString strDate;
	strDate.Format(_T("%d/%d/%d"),SystemTime.wYear,SystemTime.wMonth,SystemTime.wDay);
	
	//星期
	CString strDayOfWeek;
	switch(SystemTime.wDayOfWeek) {
	case 1 :strDayOfWeek = _T("星期一");
		break;
	case 2 :strDayOfWeek = _T("星期二");
		break;
	case 3 :strDayOfWeek = _T("星期三");
		break;
	case 4 :strDayOfWeek = _T("星期四");
		break;
	case 5 :strDayOfWeek = _T("星期五");
		break;
	case 6 :strDayOfWeek = _T("星期六");
		break;
	case 7 :strDayOfWeek = _T("星期日");
		break;
	default:;
	}
//从右侧编辑框中获取输入的数据,再插入到列表框中
   	CString TempmData1;
	CString TempmData2;
	CString TempmData3;
	CString TempmData4;
	CString TempmData5;
	GetDlgItem(IDC_EDIT_DATA1)->GetWindowText(TempmData1);
	GetDlgItem(IDC_EDIT_DATA2)->GetWindowText(TempmData2);
	GetDlgItem(IDC_EDIT_DATA3)->GetWindowText(TempmData3);
	GetDlgItem(IDC_EDIT_DATA4)->GetWindowText(TempmData4);
	GetDlgItem(IDC_EDIT_DATA5)->GetWindowText(TempmData5);

	int Num = m_ListData.GetItemCount();//获取项目的总数(总行数目) 
	CString str;
	str.Format(_T(" %d"),Num+1);
    GetDlgItem(IDC_EDIT2_TOTAL)->SetWindowText(str);
	TempmData5+=str;

    //插入数据   注意:ListView控件第一列无法居中,如果需要第一列居中,则第一列宽度设为0,从第二开始使用。
	CString strTime;
	strTime.Format(_T("%2d:%02d:%2d"),SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond);

	m_ListData.InsertItem(0,strDate);//插入一个主项(行) 并将数据(日期)写入第一列
	m_ListData.SetItemText(0,1,strDayOfWeek);//设置子项文本:星期
	m_ListData.SetItemText(0,2,strTime);     //时间
	m_ListData.SetItemText(0,3,TempmData1);
	m_ListData.SetItemText(0,4,TempmData2);
	m_ListData.SetItemText(0,5,TempmData3);
	m_ListData.SetItemText(0,6,TempmData4);
	m_ListData.SetItemText(0,7,TempmData5);


  CString strWarn;
  strWarn = m_ListData.GetItemText(0, 7);//获得子项文本:第一行第7个内容
  //AfxMessageBox(strWarn);

    GetDlgItem(IDC_EDIT_DATA5)->SetWindowText(_T(""));//清空备注
	UpdateData(FALSE);

}

6.“完成”按钮:

void CTestListCtrlDlg::OnButtonOk() 
{
	EnableWindowSet(FALSE);  //禁用右边按钮等控件
}

运行,点击“插入数据”按钮,右边控件启用,输入数据及备注,点击插入即可完成数据的插入:
在这里插入图片描述
注意:表头有复选框是因为初始化时,LVS_EX_CHECKBOXES 风格的作用:

m_ListData.SetExtendedStyle(
		LVS_EX_GRIDLINES|
		LVS_EX_FULLROWSELECT|
		LVS_EX_CHECKBOXES  //复选框

7.增加“全选”,“反选”,“全不选”功能:
添加3个单选框radio,通过类向导为其添加点击事件:

“全选”:
void CTestListCtrlDlg::OnRADIO_AllSELECT() 
{	
	 for (int i=0;i<m_ListData.GetItemCount();i++)
	 {
		 m_ListData.SetCheck(i,TRUE); //全部设置为选中状态
		 m_ListData.SetItemState(i,LVIS_SELECTED, LVIS_SELECTED);
	 }
}

“反选”

void CTestListCtrlDlg::OnRadio_Unselect() 
{
	BOOL state;
	for (int i=0;i<m_ListData.GetItemCount();i++)
	 {
		state = m_ListData.GetCheck(i);//获取复选框的状态(打钩否)
		if (state == FALSE) //若未选中,则全选中
		{
		   m_ListData.SetCheck(i,TRUE);//设置复选框的状态(打钩否)
		   m_ListData.SetItemState(i,LVIS_SELECTED, LVIS_SELECTED);//设置某一行的状态(选中否)
		                                   //GetItemState()获取某一行的状态(选中否) 
		}else
		{
			m_ListData.SetItemState(i, ~LVIS_SELECTED, LVIS_SELECTED);
			m_ListData.SetCheck(i, FALSE);

		}
	
	 }
	
}

“全不选”

void CTestListCtrlDlg::OnRADIO_AllNOSELECT() 
{

	for (int i=0;i<m_ListData.GetItemCount();i++)
	{
		m_ListData.SetCheck(i,FALSE);
		m_ListData.SetItemState(i,LVIS_SELECTED, LVIS_SELECTED);
	}
	
}

8.增加“删除选中”功能:

void CTestListCtrlDlg::OnButtonDeletedata() 
{

	int nItem;
	POSITION pos;
	while (pos = m_ListData.GetFirstSelectedItemPosition())
	{ 

		nItem = -1;
		nItem = m_ListData.GetNextSelectedItem(pos);
		if (nItem >= 0 && m_ListData.GetSelectedCount() > 0)
		{
			m_ListData.DeleteItem(nItem);
			CString strNum1;
			strNum1.Format(_T("%d"),nItem+1);
		//	AfxMessageBox(strNum1);

		int i=m_ListData.GetSelectionMark();//获得选中行的行标
		//  m_ListData.SetSelectionMark(-1);//取消选中行
		CString strNum;
		strNum.Format(_T("%d"),i);
    	GetDlgItem(IDC_EDIT_LINENUM)->SetWindowText(strNum) ;
	

		//m_List.GetItemState();//从后向前遍历数据,获取被选中行的行号iItem
		}

	}
		
}

运行,插入数据:
在这里插入图片描述
点击“删除选中”
在这里插入图片描述
可同时删除多行:
在这里插入图片描述
点击“删除选中”:
在这里插入图片描述

结语:谢谢!
  • 19
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MFC是Microsoft Foundation Classes的缩写,是微软为了简化Windows编程而开发的一套C++类库。ListCtrlMFC中的一个控件,用于显示和编辑数据的列表。 要在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控件。需要注意的是,在实际应用过程中可能还需要处理其他事件、进行数据校验等操作,具体实现可根据需求进行扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随心漂流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值