MFC UI表格制作从专家到入门

文章目录

  • CListCtrl
    • 常见问题
  • 增强版CGridCtrl(第三方)
  • 第三方库
    • ReoGrid

CListCtrl

默认情况下,CListCtrl不支持直接编辑单元格,需通过消息处理实现。

1.添加控件到资源视图
在对话框资源编辑器中拖入List Control控件,设置ID(如IDC_LIST),样式选择Report

2.绑定控件

CListCtrl m_listCtrl;
DDX_Control(pDX, IDC_LIST, m_listCtrl);

3.初始化表格样式与列头
在对话框的OnInitDialog()中初始化控件(8行2列):

//启用整行选择和网格线
m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);  
//添加列
m_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);
m_listCtrl.InsertColumn(1, _T("年龄"), LVCFMT_CENTER, 50);
//插入行数据
for (int i = 0; i < 8; i++)
{m_listCtrl.InsertItem(i, _T("张三"));m_listCtrl.SetItemText(i, 1, _T("18"));
}

PS:默认在控件区域内填满行,行数、行高均无法直接控制。

4.控制行数:插入透明图片占位

CRect rcListCtrl(0,0,0,0);
m_listCtrl.GetClientRect(&rcListCtrl);
CImageList m_ImageList;
m_ImageList.Create(1, rcListCtrl.Height() / 8 - 1, ILC_COLOR32, 1, 0);  // 创建透明图标(高度=总高/8)
m_listCtrl.SetImageList(&m_ImageList, LVSIL_SMALL);  // 关联图像列表for (int i = 0; i < BP_COUNT; i++)
{m_listCtrl.InsertItem(i, _T("张三"));m_listCtrl.SetItem(i, 0, LVIF_IMAGE, NULL, 0, 0, 0, 0);m_listCtrl.SetItemText(i, 1, _T("18"));
}

3.实现编辑功能

CEdit m_edit;          //编辑框控件
int m_nEditRow;        //当前编辑行
int m_nEditCol;        //当前编辑行//消息映射
ON_NOTIFY(NM_CLICK, IDC_LIST, &XXX::OnClickList)
ON_EN_KILLFOCUS(IDC_EDIT, &XXX::OnKillFocusEdit)//单元格点击事件
void XXX::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);m_nEditRow = pNMItemActivate->iItem;m_nEditCol = pNMItemActivate->iSubItem;// 仅允许编辑第2、3列if (m_nEditRow >= 0 && (m_nEditCol == 1 || m_nEditCol == 2)) {CRect rectCell;m_listCtrl.GetSubItemRect(m_nEditRow, m_nEditCol, LVIR_BOUNDS, rectCell);m_listCtrl.ClientToScreen(&rectCell);ScreenToClient(&rectCell);  //控件坐标-> 屏幕坐标-> 父窗体坐标//修改编辑框位置rectCell.DeflateRect(2, 2);m_edit.MoveWindow(rectCell);m_edit.SetWindowText(m_listCtrl.GetItemText(m_nEditRow, m_nEditCol));m_edit.ShowWindow(SW_SHOW);m_edit.SetFocus();m_edit.SetSel(0, -1);}*pResult = 0;
}//保存数据
void XXX::OnKillFocusEdit()
{if (m_nEditRow >= 0 && m_nEditCol >= 0) {CString strText;m_edit.GetWindowText(strText);m_listCtrl.SetItemText(m_nEditRow, m_nEditCol, strText); // 更新列表内容}m_edit.ShowWindow(SW_HIDE);m_nEditRow = -1;m_nEditCol = -1;
}

常见问题

1.焦点管理
编辑控件需正确处理焦点丢失事件,避免内存泄漏(如动态创建的CEdit需在EN_KILLFOCUS中销毁)。

2.性能优化
大数据量时启用虚拟模式(LVS_OWNERDATA),按需加载数据。

4.数据验证
LVN_ENDLABELEDIT消息中校验输入格式(如数字、日期)。

增强版CGridCtrl(第三方)

支持直接编辑。内置支持文本框、下拉框、日期选择器等编辑器,无需手动处理消息。

1.集成控件到项目
下载CGridCtrl源码,将头文件和实现文件加入项目。

2.在对话框中添加控件

// .h
CGridCtrl m_grid;// .cpp
m_grid.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(10,10,400,200), this, IDC_GRID);
m_grid.SetRowCount(10);     // 设置行数
m_grid.SetColumnCount(3);   // 设置列数
m_grid.SetItemText(0, 0, _T("数据"));  // 填充单元格

第三方库

ReoGrid

适用于需要Excel级功能的场景。支持公式计算、样式定制等高级功能。

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

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

相关文章

数字后端APR innovus sroute到底是如何选取宽度来铺power rail的?

吾爱IC社区新一期IC训练营将于7月初开班&#xff08;07.06号晚上第一次直播课&#xff09;&#xff01;社区所有IC后端训练营课程均为直播课&#xff01;全网唯一一家敢开后端直播课的&#xff08;口碑不好招生一定存在困难&#xff0c;自然就无法开直播课&#xff09;&#xf…

LVS集群技术

LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux内核的高性能、高可用性服务器集群技术&#xff0c;它通过负载均衡将客户端请求分发到多台后端真实服务器&#xff0c;实现 scalability 和 fault tolerance。LVS工作在传输层&#xff08;OSI Layer 4&#xff…

git项目,有idea文件夹,怎么去掉

要从Git项目中排除.idea文件夹&#xff08;IntelliJ IDEA的配置文件目录&#xff09;&#xff0c;可以通过以下步骤操作&#xff1a; 1. 添加.gitignore规则 在项目根目录创建或编辑.gitignore文件&#xff0c;添加以下内容&#xff1a; .idea/2. 从Git缓存中删除已跟踪的.idea…

springboot+swagger2文档从swagger-bootstrap-ui更换为knife4j及文档接口参数不显示问题

背景 已有springboot项目,且使用的是swagger2+swagger-bootstrap-ui的版本 1.pom依赖如下 <!-- Swagger接口管理工具 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9…

mysql数据库表只能查询,对于插入、更新、删除操作一直卡住,直到报错Lost connection to MySQL server during query

诊断步骤1. 查看阻塞进程SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;SELECT * FROM sys.schema_table_lock_waits;2. 查看当前活动事务SELECT * FROM information_schema.INNODB_TRX;3. 查看进程列表SHOW PROCESSLIST;通过SELECT * FROM in…

Redis BigKey 深度解析:从原理到实战解决方案

引言&#xff1a;什么是 BigKey&#xff1f;在 Redis 的使用场景中&#xff0c;BigKey&#xff08;大键&#xff09;是指那些数据量异常庞大的键值&#xff0c;通常表现为&#xff1a;String 类型&#xff1a;值大小超过 10KBHash/Set 等&#xff1a;元素数量超过 5000List/ZSe…

Qt 实现新手引导

Qt实现新手引导 对于一个新安装的软件或者一个新的功能&#xff0c;提供一个新手引导步骤&#xff0c;能够让用户快速熟悉。这是最终效果&#xff0c;每一个按钮都会有一个简单引导&#xff0c;通过点击上一步、下一步来切换不同的指导。当前引导的功能&#xff0c;会有一个高光…

Maven+Spring

一、Maven 相关- 本地仓库设置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以设置 Maven 的本地仓库路径&#xff0c;本地仓库用于存储从远程仓库下载的依赖库&#xff0c;方便项目重复使用。- 仓库关系&#xff1a;- 项目&#xff1a;开发中的项目&…

Android Handler 消息机制

常用场景&#xff1a; 子线程发送Message 主线程处理Message 子线程发送消息 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {Message msg Message.obtain();msg.what what;return sendMessageDelayed(msg, delayMillis);}public final boole…

day9 串口通信

1串口通信串口通信是嵌入式系统和电子设备中最常用的 异步串行通信 方式&#xff0c;核心是通过 TX&#xff08;发送&#xff09; 和 R&#xff08;接收&#xff09; 两根线实现全双工数据传输。2通信协议分类2.1同步/异步通信同步和异步是串行通信中两种根本不同的数据传输方式…

面向对象的设计模式

一、设计模式简介1、什么是设计模式针对反复出现的问题所总结归纳出的通用解决方设计模式是指在软件开发过程中案。这些方案是众多软件开发人员经过大量实践总结出来的&#xff0c;具有高效性、可维护性和可扩展性等优点。使用设计模式可以帮助开发者更高效地构建软件系统&…

每日钉钉API探索:chooseDepartments专注于部门维度的选择接口

在企业级应用开发过程中&#xff0c;针对组织架构中的部门进行操作是非常常见的需求。今天我们要介绍的是钉钉的chooseDepartments API&#xff0c;它允许用户以部门为单位进行选择&#xff0c;并返回所选部门的相关信息。&#x1f4cc; 功能概述chooseDepartments API主要用于…

生产环境CI/CD流水线构建与优化实践指南

生产环境CI/CD流水线构建与优化实践指南 目录 业务场景描述技术选型过程实现方案详解 流水线结构设计并行构建与缓存策略部署策略&#xff1a;滚动、蓝绿、金丝雀回滚与告警自动化 踩过的坑与解决方案总结与最佳实践 业务场景描述 某大型电商平台&#xff0c;为了保证代码持续交…

腾讯云和火山云优劣势对比

从问题本身看&#xff0c;用户没有限定具体场景&#xff0c;说明可能需要一个全面的横向对比。不过云计算服务涉及面太广&#xff0c;我最好先搭建一个框架性的分析结构&#xff0c;再填充具体细节。 首先想到从几个核心维度切入&#xff1a;基础能力&#xff08;计算存储网络&…

Augment AI 0.502.0版本深度解析:Task、Guidelines、Memory三大核心功能实战指南

Augment AI 0.502.0版本深度解析&#xff1a;Task、Guidelines、Memory三大核心功能实战指南 augment最新版辅助功能全解析续杯免费额度再用满教程|memory|userguidlines|tasksaugment最新插件功能教程前言 在AI辅助编程领域&#xff0c;Augment AI作为一款强大的VS Code插件&…

docker搭建、小皮面板搭建、bp使用、msf

docker搭建Vulhub靶场 docker安装 apt-get install docker.io docker-compose#设置docker代理&#xff1a;创建文件夹以及对应的文件 mkdir /etc/systemd/system/docker.service.d#在该文件中配置自己的代理ip以及代理端口 vim /etc/systemd/system/docker.service.d/http-p…

AI优化器美国VPS集成:智能算力部署与性能调优指南

在当今数字化浪潮中&#xff0c;AI优化器与高性能VPS的融合正成为企业技术架构的核心竞争力。本文将深入解析美国VPS服务器如何通过AI驱动的智能优化技术实现算力突破&#xff0c;从资源配置算法到实时流量调度&#xff0c;全面揭示这种创新组合在跨境电商、大数据分析等场景中…

【保姆级图文详解】Spring AI 中的工具调用原理解析,工具开发:文件操作、联网搜索、网页抓取、资源下载、PDF生成、工具集中注册

目录前言一、Spring AI 中的工具调用&#xff08;Tool Calling&#xff09;1.1、概念1.2、工作原理1.3、技术选型1.4、原理解析1.4.1、实现接口1.4.2、工具调用二、工具调用&#xff08;Tool Calling&#xff09;开发2.1、文件操作2.1.1、概念描述2.1.2、概念描述2.2、联网搜索…

Redis客户端使用(Client、Java、SpringBoot)

上篇文章&#xff1a; Redis数据类型之zsethttps://blog.csdn.net/sniper_fandc/article/details/149139955?fromshareblogdetail&sharetypeblogdetail&sharerId149139955&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 Redis客户端…

Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(一

引言 ** 在工业自动化领域&#xff0c;Modbus 协议犹如一座桥梁&#xff0c;连接着各种电子设备&#xff0c;实现它们之间高效的数据交互。从可编程逻辑控制器&#xff08;PLC&#xff09;到人机界面&#xff08;HMI&#xff09;&#xff0c;再到各类智能传感器&#xff0c;M…