list列表可编辑状态

有时候list需要修改或选择属性,mfc自带的只能显示内容,基本上是不可以修改,为了实现这个功能需求,需要完成一下步骤转换.

第一步记录选择的单元格.

第二步创建一个编辑框CComboBox对象,

设置字体,窗口属性.

第三步获取选中单元格的位置信息.

第四步获取单元格内容信息.

第五步在编辑框上显示,把编辑框显示在单元格上,这样单元格就变成可编辑状态.

这样我们就完成了动态创建,编辑功能,还需要一个函数执行动态创建的销毁回收功能.

void createCobox(NM_LISTVIEW *pEditCtrl, CComboBox *createdit, int &Item, int &SubItem, bool &havecreat)//创建单元格编辑框函数

{

Item = pEditCtrl->iItem;//将点中的单元格的行赋值给"刚编辑过的行"以便后期处理

SubItem = pEditCtrl->iSubItem;//将点中的单元格的行赋值给"刚编辑过的行"以便后期处理

createdit->Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_OEMCONVERT,

CRect(0, 0, 0, 0), this, IDC_COMBO1);//创建编辑框对象,IDC_EDIT_CREATEID为控件ID号3000,在Resource.h中定义

havecreat = true;

createdit->SetFont(this->GetFont(), FALSE);//设置字体,不设置这里的话上面的字会很突兀的感觉

createdit->SetParent(&m_showMeasureResult);//将list control设置为父窗口,生成的Edit才能正确定位,这个也很重要

CRect EditRect;

m_showMeasureResult.GetSubItemRect(m_Row,m_Col, LVIR_LABEL, EditRect);//获取单元格的空间位置信息

EditRect.SetRect(EditRect.left+1, EditRect.top+1, EditRect.left + m_showMeasureResult.GetColumnWidth(m_Col)-1, EditRect.bottom-1);//+1和-1可以让编辑框不至于挡住列表框中的网格线

CString strItem = m_showMeasureResult.GetItemText(m_Row,m_Col);//获得相应单元格字符

createdit->SetWindowText(strItem);//将单元格字符显示在编辑框上

createdit->MoveWindow(&EditRect);//将编辑框位置放在相应单元格上

createdit->ShowWindow(SW_SHOW);//显示编辑框在单元格上面

void distroyCombox(CListCtrl list, CComboBox distroyedit, int &Item, int &SubItem)//销毁单元格编辑框对象

{

CString meditdata;

distroyedit->GetWindowText(meditdata);

list->SetItemText(Item, SubItem, meditdata);//获得相应单元格字符

distroyedit->DestroyWindow();//销毁对象,有创建就要有销毁,不然会报错

}

在list的单击函数中响应,我们的创建函数,就可以实现list可编辑,

void OnNMClickListshowMeasure(NMHDR *pNMHDR, LRESULT *pResult)

{

// TODO: Add your control notification handler code here

复制代码
NM_LISTVIEW  * pEditCtrl = (NM_LISTVIEW *)pNMHDR;


printf("行:%d,列:%d\n",pEditCtrl->iItem,pEditCtrl->iSubItem);
	if((pEditCtrl->iItem >= 0&&pEditCtrl->iSubItem==0)||pEditCtrl->iItem == -1)//点击到非工作区
{
	if (m_haveeditcreate == true)//如果之前创建了编辑框就销毁掉
	{
		distroyCombox(&m_showMeasureResult,&m_combox,m_Row,m_Col);//销毁单元格编辑对象
		m_haveeditcreate = false;
	}
	return;
}
}

*pResult = 0;

}

最后焦点的处理设置,否则会异常

void OnKillfocusCcomboBox()

{

复制代码
if (m_haveeditcreate == true )//如果之前创建了下拉列表框就销毁掉
{
	distroyCombox(&m_showMeasureResult, &m_combox, m_Row, m_Col);
	m_haveeditcreate = false ;
}

}

相关推荐
D e re k ZH2 小时前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
La Pulga5 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
Blockbuater_drug6 小时前
Dify 1.18 本地部署实战:Windows + WSL2 + Docker,从零跑到本地可用
windows·docker·容器·dify·大模型应用平台
番茄味城市甜菜6 小时前
数据结构:双向链表实现,链表与顺序表的对比
数据结构·链表
cc_yy_zh7 小时前
笔记本关机自动重启解决办法
windows
AlanAshley10 小时前
Windows 错误代码 0x80284018:可能原因与解决办法
windows
東隅已逝,桑榆非晚10 小时前
红黑树:从概念到实现
数据结构·c++·笔记·学习
2501_9159090611 小时前
Windows 打开 Xcode 工程,编译调试 Xcode 项目并和 Mac 同事协作
ide·windows·vscode·macos·ios·个人开发·xcode
YSL07012411 小时前
一文通关-----树和二叉树
数据结构·算法
小糯米60111 小时前
数据结构 数组与链表 内存与缓存
数据结构