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

优化 MFC CGridCtrl 的表格布局与功能

在使用 MFC 的 CGridCtrl 控件创建表格时,遇到的一个典型问题是,当表格滚动条出现时,最后一列会显示空白。这篇博客将记录解决这一问题的详细过程,同时总结了 CGridCtrl 初始化及优化的关键步骤,帮助开发者快速搭建一个功能完善的用户管理表格。


问题描述

在开发用户管理模块时,使用了 MFC 的 CGridCtrl 控件,遇到以下问题:

  1. 当添加的数据超过表格的可视范围,出现垂直滚动条后,表格的最后一列显示空白。
  2. 如果调整某列的宽度,最后一列的内容又可以正常显示。
  3. 通过分析,发现滚动条的宽度未正确考虑到表格的列宽调整逻辑中,导致最后一列被“覆盖”。

解决方法

方法 1:手动调整最后一列宽度

通过监听滚动条的显示状态,在需要时动态调整最后一列的宽度,确保内容可见。或者在添加删除函数中使用调整列宽和填充最后一列。

void CUserManagerDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);if (m_gridUserManager.GetSafeHwnd()) {m_gridUserManager.ExpandColumnsToFit(FALSE); // 调整列宽m_gridUserManager.ExpandLastColumn();        // 填充最后一列}
}

方法 2:限制列总宽度

将所有列的总宽度限制为表格的客户区宽度减去滚动条宽度。这种方法更加精确,但实现较为复杂。


优化表格初始化的代码

CGridCtrl 的初始化过程中,我们需要设置表格的行列数、样式以及默认单元格的背景色、字体颜色等属性。以下是经过优化后的初始化代码:

void CUserManagerDlg::InitUserManager()
{if (m_gridUserManager.GetSafeHwnd() == NULL)return;// 清空表格数据m_gridUserManager.DeleteAllItems();m_gridUserManager.SetVirtualMode(FALSE); // 设置为非虚拟模式// 配置默认单元格样式m_gridUserManager.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor); // 固定行背景色m_gridUserManager.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor); // 固定列背景色m_gridUserManager.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor);   // 普通单元格背景色m_gridUserManager.SetFixedTextColor(g_nGridFixFontColor); // 固定行/列字体颜色// 设置表格行列数int nRows = 1; // 初始只有标题行int nCols = 7; // 包含固定列的总列数m_gridUserManager.SetRowCount(nRows);m_gridUserManager.SetColumnCount(nCols);m_gridUserManager.SetFixedRowCount(1);m_gridUserManager.SetFixedColumnCount(0);// 配置表头int nColIdx = 0;m_gridUserManager.SetColumnWidth(nColIdx, 30); // 列宽m_gridUserManager.SetItemText(0, nColIdx++, _T("No."));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx++, _T("用户名"));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx++, _T("密码"));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx++, _T("权限"));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx++, _T("会话超时(分钟)"));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx++, _T("会话过期(小时)"));m_gridUserManager.SetColumnWidth(nColIdx, 100);m_gridUserManager.SetItemText(0, nColIdx++, _T("最后一次登录时间"));// 配置交互属性m_gridUserManager.SetEditable(TRUE);m_gridUserManager.SetRowResize(FALSE);m_gridUserManager.SetColumnResize(TRUE);m_gridUserManager.SetFixedRowSelection(FALSE);m_gridUserManager.SetFixedColumnSelection(FALSE);m_gridUserManager.SetListMode(TRUE);m_gridUserManager.SetSingleRowSelection(TRUE);// 自动调整列宽m_gridUserManager.ExpandColumnsToFit(TRUE);m_gridUserManager.ExpandLastColumn();// 填充表格数据FillUserManager();
}

初始化中的关键点

  1. 清空表格数据
    使用 DeleteAllItems() 确保表格在初始化前处于空状态。

  2. 设置默认样式
    使用 GetDefaultCell() 设置单元格背景色、字体等全局样式,减少逐个单元格设置的重复工作。

  3. 列宽自动调整
    调用 ExpandColumnsToFit()ExpandLastColumn() 确保列宽自适应表格宽度,避免多余的滚动条。

  4. 交互属性

    • 禁用行高调整:SetRowResize(FALSE)
    • 启用列宽调整:SetColumnResize(TRUE)
    • 只允许选择单行:SetSingleRowSelection(TRUE)

总结

在开发过程中,通过方法 1 手动调整最后一列宽度,成功解决了最后一列显示空白的问题。同时,通过优化 CGridCtrl 的初始化代码,表格的功能更加完善,交互体验也得到了提升。希望这篇文章能为 MFC 开发者提供参考。

相关文章:

优化 MFC CGridCtrl 的表格布局与功能

在使用 MFC 的 CGridCtrl 控件创建表格时,遇到的一个典型问题是,当表格滚动条出现时,最后一列会显示空白。这篇博客将记录解决这一问题的详细过程,同时总结了 CGridCtrl 初始化及优化的关键步骤,帮助开发者快速搭建一个…...

koa-body 的详细使用文档

目录 koa-body install Features Hello World - Quickstart Usage with koa-router Usage with unsupported text body type Options 关于 parsedMethods 的说明 文件支持 关于未解析请求主体的说明 一些强大的选择 使用总结 koa-body 功能齐全的 koa body 解析器中…...

信息系统与互联网中的安全、隐私及伦理问题

1 伦理(Ethics) 1.1 伦理框架(Ethical Frameworks) 自然法与权利(Natural Law and Rights) 定义:基于人类自然权利的伦理思想,强调生命、自由和财产等基本权利。应用:隐…...

Java安全—log4j日志FastJson序列化JNDI注入

前言 log4j和fastjson都是这几年比较火的组件,前者是用于日志输出后者则是用于数据转换,今天我们从源码来说一下这两个组件为何会造成漏洞。 实验环境 这里的idea要进行一下配置,因为我们要引用第三方组件,而这些第三方组件都是…...

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN?2.2 CMSIS-NN是什么?2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM…...

Python中如何判断一串文本是不是数字

目录 1. 内置函数2. 尝试类型转换3. 正则表达式 在编程中,我们经常需要确定一段文本是否为数字。 这不仅关系到数据的准确性,还涉及到后续的计算和处理。 1. 内置函数 在Python中,可以使用str.isdigit()、str.isnumeric()和str.isdecimal()…...

基于YOLOv8深度学习的智慧农业山羊行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智慧农业的快速发展,利用先进的技术手段对牲畜的行为进行自动化监测和管理,已经成为现代农业中的重要研究方向之一。在传统的农业管理模式中,牲畜的行为监测通常依赖于人工观测,耗时耗力且难以实现大规模实时监控。然而&#…...

Redis环境部署(主从模式、哨兵模式、集群模式)

一、概述 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库…...

高阶C语言之六:程序环境和预处理

本文介绍程序的环境,在Linux下对编译链接理解,较为简短,着重在于编译的步骤。 C的环境 在ANSI C(标准C语言)的任何一种实现中,存在两个不同的环境。 翻译环境:在这个环境中,源代码…...

Vue 3 国际化 (i18n) 最佳实践指南

1. 安装依赖 npm install vue-i18n@9 2. 项目结构建议 src/ ├── i18n/ │ ├── index.ts # i18n 配置文件 │ ├── languages/ # 语言文件目录 │ │ ├── zh-CN.ts # 中文 │ │ ├── en-US.ts # 英文 │ │ └─…...

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书: Acme PHP | Rob…...

获取DOM 节点的四大方式

前言: 在 Vue 中,获取 DOM 节点可以通过多种方式,如自定义属性、ref 引用、类选择器和 ID 选择器等。 一、使用 ref 获取 DOM 实例 ref 是 Vue 中推荐的获取 DOM 节点的方式,它为每个节点分配一个唯一的引用,可以直…...

ROS2 Humble 机器人建模和Gazebo仿真

一.Ubuntu22.04系统虚拟机安装 1.下载镜像并安装 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.安装选英文版,安装类型选清除磁盘。 3.遇到无法复制windows内容到虚拟机里。需安装VMware tools。VMware tools安装不了&a…...

docker容器镜像的制作、使用以及传递

目录 制作容器镜像使用Dockerfile制作镜像准备所需文件构建镜像怎么不使用基础镜像来构建容器镜像 使用容器镜像传递容器镜像 这篇文章讨论一下怎么使用docker制作容器镜像,容器镜像的使用,以及怎么传递容器镜像。 制作容器镜像 docker制作容器镜像推荐…...

一种由于吸入硅酸盐粉尘而引起的肺部疾病:pneumonoultramicroscopicsilicovolcanoconiosis

有人说,pneumonoultramicroscopicsilicovolcanoconiosis是英语中最长的单词,这是一个医学词汇,意思是指:一种由于吸入硅酸盐粉尘而引起的肺部疾病。 pneumonoultramicroscopicsilicovolcanoconiosis [ˈnju:mənəuˌʌltrəˌmai…...

百度AI人脸检测与对比

1.注册账号 打开网站 https://ai.baidu.com/ &#xff0c;注册百度账号并登录 2.创建应用 3.技术文档 https://ai.baidu.com/ai-doc/FACE/yk37c1u4t 4.Spring Boot简单集成测试 pom.xml 配置&#xff1a; <!--百度AI--> <dependency> <groupId>com.baidu.…...

贴代码框架PasteForm特性介绍之outer,outers,object,objects,outerdisplay

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…...

sql数据库-权限控制-DCL

目录 常用权限类别 查询用户权限 举例 授予用户权限 删除权限 常用权限类别 权限说明ALL,ALL PRIVILEGES所有权限SELECT查询数据INSERT插入数据UPDATE修改数据DELETE删除数据ALTER修改表DROP删除数据库/表/视图CREATE创建数据库/表 查询用户权限 show grants for 用户名…...

【计组笔记】目录

【计组笔记】机器数表示及运算https://blog.csdn.net/Resurgence03/article/details/142673325?sharetypeblog&shareId142673325&sharereferAPP&sharesourceresurgence03&sharefromlink 【计组笔记】指令系统https://blog.csdn.net/Resurgence03/article/det…...

深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器

在深度学习的计算机视觉任务中&#xff0c;提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作&#xff0c;能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理&#xff0c;…...

ArcGIS 10.2 保姆级安装与破解教程(含License Manager启动失败解决方案)

ArcGIS 10.2 完整安装指南&#xff1a;从零开始到完美运行 1. 准备工作与环境检查 在开始安装ArcGIS 10.2之前&#xff0c;确保你的系统满足以下基本要求&#xff1a; 操作系统&#xff1a;Windows 7/8/10&#xff08;32位或64位&#xff09;硬件配置&#xff1a;至少4GB RAM&a…...

Memor:为LLM对话构建结构化记忆引擎,实现可重现、可移植的AI交互管理

1. 项目概述&#xff1a;Memor&#xff0c;为LLM对话赋予结构化记忆如果你和我一样&#xff0c;长期和各类大语言模型打交道&#xff0c;从早期的GPT-3到现在的Claude、Gemini&#xff0c;一个绕不开的痛点就是&#xff1a;对话历史的管理。默认的聊天界面里&#xff0c;历史记…...

传统认为越早进入行业越占优势,编程统计入行时间,行业红利数据,行业成熟期入行风险更低收益更稳。

“入行时间与行业红利期的匹配关系分析” 为主题&#xff0c;给出一套工程化、可教学、可复现的分析示例。一、实际应用场景描述&#xff08;Business Context&#xff09;在职业规划、行业研究与人才策略中&#xff0c;普遍存在一种观点&#xff1a;“越早进入一个行业&#x…...

怎样高效清理电脑内存:3个实用技巧让你的电脑飞起来

怎样高效清理电脑内存&#xff1a;3个实用技巧让你的电脑飞起来 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你是…...

技术深度解析CoverM在PacBio HiFi宏基因组测序数据覆盖率分析中的应用

技术深度解析CoverM在PacBio HiFi宏基因组测序数据覆盖率分析中的应用 【免费下载链接】CoverM Read alignment statistics for metagenomics 项目地址: https://gitcode.com/gh_mirrors/co/CoverM CoverM作为一款专门用于计算基因组覆盖率的生物信息学工具&#xff0c;…...

告别配置烦恼!Qt 5.14.2下QCustomPlot源码集成与QChart开箱即用全攻略

Qt 5.14.2图表库极简集成指南&#xff1a;QCustomPlot源码直连与QChart零配置实战 刚接手一个需要快速实现数据可视化的Qt项目时&#xff0c;开发者往往会在图表库的选择和集成上耗费大量时间。传统方案如Qwt需要繁琐的编译配置&#xff0c;而官方文档又常常默认读者已经熟悉Qt…...

终极ComfyUI视频插件指南:从零开始构建AI视频生成工作流

终极ComfyUI视频插件指南&#xff1a;从零开始构建AI视频生成工作流 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 你是否曾梦想过让静态图片“活”起来&#xff0c;或者让文字描述直接变成生动…...

从JLink驱动安装失败,聊聊老旧Win7系统下嵌入式工具链的“版本锁定”现象

从JLink驱动安装失败看嵌入式工具链的版本锁定困境 当你在Windows 7系统上尝试安装最新版JLink驱动时&#xff0c;那个顽固的黄色感叹号是否曾让你抓狂&#xff1f;这看似简单的驱动问题背后&#xff0c;隐藏着一个困扰嵌入式开发领域多年的系统性难题——工具链的版本锁定现象…...

常闭式防火门,关严才是安全门|90% 的火灾隐患源于忽视它

常闭式防火门&#xff0c;关严才是真正的安全门&#xff01;现实里 90% 的消防火灾隐患&#xff0c;都源于常闭式防火门长期敞开、随意封堵、私自固定不关。很多人觉得开门方便通行、搬货省事&#xff0c;却忽略了它的核心作用&#xff1a;防火隔烟、阻隔火势、延缓蔓延、守护疏…...

Cursor编辑器集成OpenAPI Agent:让AI编程助手具备真实API调用能力

1. 项目概述&#xff1a;当你的代码编辑器学会“思考”最近在开发者社区里&#xff0c;一个名为neordinary/cursor-openapi-agent的项目引起了我的注意。乍一看&#xff0c;这名字有点长&#xff0c;但拆解一下就能明白它的野心&#xff1a;cursor是那款风头正劲的、集成了AI能…...