当前位置:   article > 正文

MFC 的List Control控件实现可编辑_mfc listcontrol 可编辑

mfc listcontrol 可编辑

亲测可用,如果出现问题,请留言


所谓List Contro l,就是用来做LIist的,至于编辑,估计MS也没提供这个功能。比较诡异的是在给List Control 设置属性的时候居然看到Edit Label ,处于好奇点了点,发现只能修改第一列,改了之后失去焦点又变 回原来的文本。没有深入试下去,我估计可以修改第一列的数据。
其实要实现编辑功能,只要做一个Edit Control 就可以了,当需要编辑的时候,把这个Edit Control 动态显示到需要显示的地方。看效果图:
双击输入框:
在这里插入图片描述
输入完成,点击空白处:
在这里插入图片描述
列表的所选属性如下:
在这里插入图片描述
另外需要为控件绑定一个控件变量,此处控件变量名为m_List。相添加完成后,可以看到在头文件中自动添加了如下代码。

	CListCtrl m_List;
  • 1

另外,在CPP文件中也会自动添加部分代码,此处就不在做演示工作了。


然后,添加响应List Control的双击事件:
注意,在相关的头文件中需要先添加如下成员变量:

	CEdit editItem;
	int hitRow;
	int hitCol;
  • 1
  • 2
  • 3
void CDlgCourseInfoModify::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
	LVHITTESTINFO info;
	info.pt = pNMItemActivate->ptAction;
	
	if (m_List.SubItemHitTest(&info) != -1)
	{
		hitRow = info.iItem;
		hitCol = info.iSubItem;
		if (editItem.m_hWnd == NULL){
			RECT rect;
			rect.left = 3;
			rect.top = 3;
			rect.bottom = 3;
			rect.right = 3;
			editItem.Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this, 101);
			editItem.SetFont(this->GetFont(), FALSE);
		}
		CRect rect;
		m_List.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect);
		rect.top += 12;
		rect.left += 13;
		rect.right += 13;
		rect.bottom += 12;
		editItem.SetWindowText(m_List.GetItemText(info.iItem, info.iSubItem));
		editItem.MoveWindow(&rect, TRUE);
		editItem.ShowWindow(TRUE);
		editItem.SetFocus();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

在这个代码里面先得到鼠标双击的位置,判断是否击中了单元格,击中就调用Edit Control ,大小就是选中的单元 格,至于为什么rect要+12啊+13什么的,那是因为他出来的输入框跟单元格没对齐,导致很丑,这里可以根据自己的界面进行调整。最后再给这个Edit Control 一 个焦点,就可以直接输入了。
另外,为了能使输入之后有所反应,我们还要做一个鼠标的单击事件响应函数。

void CDlgCourseInfoModify::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;   
	if (editItem.m_hWnd != NULL){
		editItem.ShowWindow(0);
		if (hitRow != -1){
			CString text;
			editItem.GetWindowText(text);
			m_List.SetItemText(hitRow, hitCol, text);
		}
	}
	hitCol = hitRow = -1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/301833
推荐阅读
相关标签
  

闽ICP备14008679号