当前位置: 首页 > news >正文

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

}

相关文章:

  • element的el-autocomplete组件的使用(模糊匹配、自定义模板、远程搜索)
  • axios原理
  • JVM的组成部分(类加载器、运行时数据区、执行引擎、本地库接口)
  • docker ps -a 要求只显示自己想要的信息
  • docker使用http_proxy配置代理
  • 【Java网络编程02】套接字编程
  • 基于CLIP4Clip的DRL的WTI模块实现
  • Three.js Tri-panner (三面贴图) 材质 两种实现方式
  • 舞动微服务的安全舞伴:服务熔断与服务降级的精妙演绎
  • C#,入门教程(24)——类索引器(this)的基础知识
  • OPENGL光线追踪
  • Kafka-服务端-DelayedOperationPurgatory
  • docker:Java通过nginx获取客户端的真实ip地址
  • 【云原生之kubernetes实战】在k8s环境下部署Mikochi文件管理工具
  • 【STM32调试】寄存器调试不良问题记录持续版
  • 08.Android之View事件问题
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • HTTP请求重发
  • IDEA常用插件整理
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JS专题之继承
  • maven工程打包jar以及java jar命令的classpath使用
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • rabbitmq延迟消息示例
  • Vue.js 移动端适配之 vw 解决方案
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 基于HAProxy的高性能缓存服务器nuster
  • 前端技术周刊 2019-01-14:客户端存储
  • 人脸识别最新开发经验demo
  • 为视图添加丝滑的水波纹
  • 最近的计划
  • HanLP分词命名实体提取详解
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​香农与信息论三大定律
  • #QT项目实战(天气预报)
  • $(selector).each()和$.each()的区别
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一) springboot详细介绍
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)ABI是什么
  • .libPaths()设置包加载目录
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET正则基础之——正则委托
  • @RequestBody与@ResponseBody的使用
  • @Valid和@NotNull字段校验使用
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ 转载 ] SharePoint 资料
  • [Ariticle] 厚黑之道 一 小狐狸听故事