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 ;
}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC下半篇之整合ssm

4.ssm整合 4.1.创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;4.2.创建工程 4.3.pom.xml <?xml version"1.0" encoding&…

Redis 消息队列和发布订阅

文章目录 基本模式生产者消费者原理&模型redis实现java实现 发布者订阅者原理&模型redis实现java实现 stream模式原理&模型工作原理redis实现Java实现 选型外传 基本模式 采用redis 三种方案&#xff1a; ● 生产者消费者&#xff1a;一个消息只能有一个消费者 ●…

2024.1.20 模拟赛总结

2024.1.20 模拟赛总结 总结时间安排考试结果考试总结 题解T1T2T3T4 总结 时间安排 8 : 00 ∼ 10 : 00 \qquad 8:00\sim 10:00 8:00∼10:00 开 T 1 T1 T1。第一眼看上去并没有明确的思路&#xff0c;简单想了想发现可以直接贪心走&#xff0c;不过好像有点小细节。推了推细节发…

图像分类 | 基于 Labelme 数据集和 VGG16 预训练模型实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对自行车&#xff08;bike&#xff09;和摩托车&#xff08;motorcycle&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接…

AI绘画Stable Diffusion进阶使用

本文讲解&#xff0c;模型底模&#xff0c;VAE美化模型&#xff0c;Lora模型&#xff0c;hypernetwork。 文本Stable Diffusion 简称sd 欢迎关注 使用模型 C站&#xff1a;https://civitai.com/ huggingface&#xff1a;https://huggingface.co/models?pipeline_tagtext-to-…

细说JavaScript事件处理(JavaScript事件处理详解)

js语言的一个特色和就是它的动态性&#xff0c;即一时间驱动的方式对用户输入作出反应而不需要依赖服务器端程序。事件是指人机交互的结果&#xff0c;如鼠标移动、点击按钮、在表单中输入数据或载入新的Web洁面等。 一、什么是事件 1、事件类型 1.1、事件源 1.2、事件处理…

k8s-ingress一

Comfigmap&#xff1a;存储数据 Date&#xff1a; Key&#xff1a;value 挂载的方式&#xff0c;把配置信息传给容器 生产当中的yml文件很长&#xff1a; 有deployment 容器的探针 资源限制 Configmap 存储卷 Service Ingress K8s的对外服务&#xff0c;ingress Se…

YOLOv8算法改进【NO.99】引入最新发布Deformable Convolution v4 (DCNv4)

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

C++ mapset

目录 相关知识介绍&#xff1a; 一、set 1、set的介绍 2、set的使用 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set修改操作 6. 举例演示 二、multiset 1、multiset的介绍 2、multiset的使用 三、map 1、map的介绍 2、map的使用 1.…

基于SpringBoot Vue家政服务预约平台系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

UE5 C++ Slate独立程序的打包方法

在源码版安装目录内找到已编译通过的xxx.exe&#xff0c;&#xff08;\Engine\Binaries\Win64\xxx.exe)&#xff0c;在需要的位置新建文件夹&#xff0c;拷贝源码版Engine内的Binaries、Content、Shaders文件夹到目标文件夹内&#xff0c;将xxx.exe放入对应位置&#xff0c;删除…

【leetcode】回溯总结

本文内容来自于代码随想录https://www.programmercarl.com/ 思想 一棵树中的纵向遍历结束回到上一层的过程&#xff0c;比如&#xff1a; 这个过程通常回伴随恢复现场的过程。 模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集…