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

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.dtcms.com/a/279629.html

相关文章:

  • Cocos Creator 高斯模糊效果实现解析
  • 《星盘接口2:NVMe风暴》
  • C++_编程提升_temaplate模板_案例
  • ether.js—3—contract
  • 高密度PCB板生产厂商深度解析
  • Docker容器操作命令大全
  • C++-linux 7.文件IO(一)系统调用
  • 是时候重估蔚来的技术价值了
  • 【科研绘图系列】R语言绘制世界地图
  • python的小学课外综合管理系统
  • MMpretrain 中的 LinearClsHead 结构与优化
  • 分布式光伏并网中出现的电能质量问题,如何监测与治理?
  • 【数据库】慢SQL优化 - MYSQL
  • 系统调用入口机制:多架构对比理解(以 ARM64 为主)
  • MySQL高级篇(一):从存储引擎到索引优化实战
  • 人工智能正逐步商品化,而“理解力”才是开发者的真正超能力
  • 在数字工厂实施过程中,如何对计划、调度部门进行需求调研
  • 简单排序。
  • 1.连接MySQL数据库-demo
  • 基于Snoic的音频对口型数字人
  • OneCode 3.0 VFS客户端驱动(SDK)技术解析:从架构到实战
  • Kafka 时间轮深度解析:如何O(1)处理定时任务
  • 深度测评|2025年BPM厂商排名及选型指南
  • 设计模式》》门面模式 适配器模式 区别
  • 基于Android的
  • 数据可视化全流程设计指南
  • hi3519dv500开发环境搭建及SDK编译和烧录:
  • Linux从零到一的学习
  • 【DOCKER】-6 docker的资源限制与监控
  • Datawhale AI夏令营——用户新增预测挑战赛