当前位置: 首页 > 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 初始化及优化的关键步骤,帮助开发者快速搭建一个…...

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台,执行 Addressable Build 运行,加载 bundle 内的预制体 显示正常 2.Unit…...

直播预告| 深入探索 DB-GPT GraphRAG 的设计解读与优化

前言 感谢DB-GPT的社区朋友持续关注我们的源码解读系列~在前几期的直播中,我们深入探讨了DB-GPT的架构设计、智能体工作流、Agent开发等话题,受到了热烈反响。 本期,我们邀请到了社区的老朋友,也是DB-GPT GraphRag的维…...

C语言:指针变量作为函数参数

在c语言中,函数的参数不仅可以是整数,小数、字符等具体的数据,还可以是指向他们的指针,用指针变量做函数,参数可以将函数外部的地址传递给函数内部,使得在函数内部可以操作函数外部的数据,并且这…...

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项(曼哈顿距离) 2.3.2…...

RecyclerView详解——(四)缓存复用机制

稍微看了下源码和部分文章,在此做个小小的总结 RecyclerView,意思为可回收的view,那么相对于listview,他的缓存复用肯定是一大优化。 具体而言,当一个列表项被移出屏幕后,RecyclerView并不会销毁其视图&a…...

向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)

1.Locality Sensitive Hashing (LSH) 使用 Shingling MinHashing 进行查找 左侧是字典,右侧是 LSH。目的是把足够相似的索引放在同一个桶内。 LSH 有很多的版本,很灵活,这里先介绍第一个版本,也是原始版本 Shingling one-hot …...

速盾:CDN缓存的工作原理是什么?

CDN(内容分发网络)是一种将内容分发到全球不同地理位置的网络架构,以提供更快速、可靠的内容传输。其核心原理是利用缓存技术,将数据内容分布到离用户最近的边缘节点上。当用户请求内容时,CDN将根据用户的IP地址&#…...

使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变

作者:来自 Elastic Greg Crist Elasticsearch 推出了一项新功能:Elastic AI Assistant for Search。你可以将其视为 Elasticsearch 和 Kibana 开发人员的内置指南,旨在回答问题、引导你了解功能并让你的生活更轻松。在 Microsoft AI Services…...

SQL基础语法介绍-基于MySQL

文章目录 一、SQL分类二、SQL语法1.数据库字段类型1.1.数值类型1.2 字符类型1.3 日期类型 2.字段约束2.1约束介绍2.2 非空约束(not null)2.3 唯一约束(unique)2.4 主键约束(primary key)2.5 自增长主键2.6 …...

android 性能分析工具(03)Android Studio Profiler及常见性能图表解读

说明:主要解读Android Studio Profiler 和 常见性能图表。 Android Studio的Profiler工具是一套功能强大的性能分析工具集,它可以帮助开发者实时监控和分析应用的性能,包括CPU使用率、内存使用、网络活动和能耗等多个方面。以下是对Android …...

【STM32项目】基于STM32设计的震动马达超声波电机高频震动——高级定时器PWM互补输出带死区控制

高级定时器PWM互补输出带死区控制 前言:实现高级定时器互补输出带死区控制,实现震动/超声波电机/马达,高频震动。使用 STM32F103 芯片输出两路互补 PWM,并带有死区和刹车控制功能。 定时器 1 通道 1 及其互补通道输出 PWM,且带死区控。当定时器 1 的刹车输入引脚被拉…...

深入探索Golang的GMP调度机制:源码解析与实现原理

在Golang(又称Go语言)的并发编程模型中,GMP调度模型扮演着举足轻重的角色。GMP分别代表Goroutine(协程)、M(Machine,即内核线程)和P(Processor,即逻辑处理器&…...

Django如何配置多个环境的MySQL数据库

在 Django 项目中配置多个环境的 MySQL 数据库是一个常见的需求,特别是在开发、测试和生产环境中使用不同的数据库配置。你可以通过在 settings.py 文件中使用条件语句或环境变量来实现这一点。 1. 使用环境变量 使用环境变量是一种灵活且安全的方式来配置多个环境…...

数据结构(链栈——c语言实现)

链式栈(Linked Stack)是一种基于链表数据结构实现的栈。它利用链表节点的指针来存储元素,并通过指针的链接关系来维护栈的后进先出(LIFO, Last In First Out)特性。 链式栈的优点 动态大小: 链式栈…...

FPGA实现串口升级及MultiBoot(九)BPI FLASH相关实例演示

本文目录索引 区别一:启动流程的区别区别二:高位地址处理区别三:地址映射例程说明总结例程地址之前一直都是以SPI FLASH为例进行相关知识讲解,今天我们介绍另一款常用的配置FLASH-BPI FLASH。 今天的讲解以简洁为主,主打个能用一句话不说两句话。以和SPI区别为主,实例演…...

Android 网络通信(三)OkHttp实现登入

学习笔记 目录 一. 先写XML布局 二、创建 LoginResponse 类 :封装响应数据 目的和作用: 三、创建 MyOkHttp 类 :发送异步请求 代码分析 可能改进的地方 总结 四、LoginActivity 类中实现登录功能 详细分析与注释: 总结: 改进建议: 零、响应数据样例 通过 P…...

java基础概念37:正则表达式2-爬虫

一、定义 【回顾】正则表达式的作用 作用一:校验字符串是否满足规则作用二:在一段文本中查找满足要求的内容——爬虫 二、本地爬虫VS网络爬虫 2-1、本地爬虫 示例: 代码优化: public static void main(String[] args) {// 大…...

【大数据学习 | Spark-Core】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中,存在许多迭代式计算,这些应用场景的共同之处是,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。但是,目前的MapReduce框架都是把中间结果写入到HDFS中&…...

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的:学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号:这是电子元器件的图形表示,用于在原理图中表示特定的元器件。例…...

[Redis#2] 定义 | 使用场景 | 安装教程 | 快!

目录 1. 定义 In-memory data structures 在内存中存储数据 2. 优点!快 Programmability 可编程性 Extensibility 扩展性 Persistence 持久化 Clustering 分布式集群 High availability 高可用性 ⭕快速访问的实现 3. 使用场景 1.Real-time data store …...

docker pull命令拉取镜像失败的解决方案

docker pull命令拉取镜像失败的解决方案 简介: docker pull命令拉取镜像失败的解决方案 docker pull命令拉取镜像失败的解决方案 一、执行docker pull命令,拉取镜像失败 报错信息:error pulling image configuration: Get https://produc…...

漫步北京小程序构建智慧出行,打造旅游新业态模式

近年来,北京市气象服务中心持续加强推进旅游气象服务,将旅游气象监测预警基础设施纳入景区配套工程,提升气象和旅游融合发展水平,服务建设高品质智慧旅游强市。 天气条件往往影响着旅游景观的体验,北京万云科技有限公…...

DNS域名解析服务器

一、dns简介及域名 DNS(Domain Name System) : 作为将域名和IP地址相互映射的一个分布式数据库,能便捷互联网的访问。使用53端口,通常以UDP较快的数据传输协议来查询,如果没有查询到,将再次启动TCP重新查询,两者同时启…...

MySQL数据存储详解

1. MySQL 的数据存放位置 当我们在 MySQL 数据库中创建一个表时,MySQL 会在数据库对应的文件夹下生成三个文件: 1.1 db.opt 文件 是什么: 每个数据库都有一个 db.opt 文件,这个文件保存了数据库的配置信息。作用: 记…...

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一,Maven的概述 Maven的作用:专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,发布……)提…...

和为 K 的子数组(java)

题目描述: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2: 输入&#xf…...

关于Redux的学习(包括Redux-toolkit中间件)

目录 什么是 Redux ? 我为什么要用 Redux ? 我什么时候应该用 Redux ? Redux 库和工具 React-Redux Redux Toolkit Redux DevTools 拓展 一个redux小示例 代码示例(很有用): Redux 术语 Actions Reducers Store Dis…...

MIT 6.S081 | 操作系统 | Lab1: Xv6 and Unix utilities

Lab1: Xv6 and Unix utilities 文章目录 Lab1: Xv6 and Unix utilities实验任务1.启动XV6(easy)2.Sleep(easy)-练手的,就是熟悉一下怎么在xv6项目中加.c文件,生成可执行程序并进行测试的1.解析rm.c2.argc 如何被赋值3.Sleep代码4.makefile编辑5.通过make…...

04 - 尚硅谷 - MQTT 客户端编程

1.在Java中使用MQTT 1.1 Eclipse Paho Java Client 具体步骤&#xff1a; 1、创建一个Spring Boot项目&#xff0c;添加如下依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>…...

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型&#xff08;ADT&#xff09;是一种数据类型&#xff0c;它定义了一组数据以及可以在这组数据上执行的操作&#xff0c;但隐藏了数据的具体存储方式和实现细节。在C语言中&#xff0c;抽象数据类型&#xff08;ADT&#xff09;是一种非常重要的概念&…...

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;13届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每…...

【Docker】快速部署 Pikachu:一个包含常见 Web 安全漏洞的渗透测试练习靶场

系统介绍 Pikachu是一个带有漏洞的Web应用系统&#xff0c;在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习&#xff0c;那么Pikachu可能正合你意。 Pikachu上的漏洞类型列表如下&#xff1a; Burt Force(暴力破解漏洞) XSS…...

【解决】Unity TMPro字体中文显示错误/不全问题

问题描述&#xff1a;字体变成方块 原因&#xff1a;字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源&#xff08;蓝色的大F&#xff09; 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…...

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…...

【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理

中远大昌统一发票共享平台上线三个多月以来&#xff0c;实现&#xff1a; 5000份 60000元 发票开具 成本节约 客户简介及需求分析 北京中远大昌汽车服务有限公司&#xff08;以下简称“中远大昌”&#xff09;成立于2002年&#xff0c;是中远海运集团所属香远&#xff08;北…...

Windows系统运行库软件游戏修复工具

本页面下载的资源包包括PC电脑常用的运行库和电脑必备组件&#xff0c;如您的电脑出现应用打不开&#xff0c;缺少dll链接库、闪退等现象可以尝试用下面软件修复。 本资源永久有效。 软件安装基本常识科普&#xff1a; 为什么要安装运行库&#xff1f;运行库默认安装到C盘&…...

解决.DS_Store 在项目一致无法排除,.gitignore里也不生效

.DS_Store 是 macOS 操作系统创建的隐藏文件&#xff0c;通常用于存储目录的属性&#xff0c;比如视图设置、图标位置等。它通常不应包含在代码仓库中&#xff0c;因此需要排除它。你提到即使将其添加到 .gitignore 文件中&#xff0c;仍然无法排除它&#xff0c;可能是由于以下…...

C#里怎么样判断文件是否存在?

C#里怎么样判断文件是否存在? 判断文件是否存在,也是一个常用的功能。 因为文件如果不存,直接去操作,就会抛出异常。 比如要拷贝一个文件到另外一个目录里,如果文件已经存在那个文件夹里,也会抛出异常。 所以提前判断,就可以减少很多不必要的异常抛出,同时程序写得更加…...

汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力

故障现象  一辆2012款路虎揽胜运动版车&#xff0c;搭载3.0T柴油发动机&#xff08;型号为306DT&#xff09;&#xff0c;累计行驶里程约为10.2万km。车主进厂反映&#xff0c;车辆行驶中加速无力&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;发动…...

JAVA基础

JAVA基础 JAVA的变量 变量是什么 内存中存储的&#xff0c;数值可以改变的数据 定义变量 语法 数据类型 变量名 值&#xff1b; 变量的命名&#xff1a; 必须由字母、数字、下划线和$组成&#xff1b;开头不能是数字规范的命名是小驼峰命令&#xff1a;studentName要做…...

ssh无法连接Ubuntu

试了多次ssh都无法连接&#xff0c;明明可以上网 网卡、防火墙、端口都没有问题&#xff0c;就是连接不上 结果是这个版本Ubuntu镜像默认没有安装ssh服务 安装SSH服务&#xff1a;apt-get install openssh-server 开启SSH服务&#xff1a;/etc/init.d/ssh start 就可以连接…...

spi 回环

///tx 极性0 &#xff08;sclk信号线空闲时为低电平&#xff09; /// 相位0 (在sclk信号线第一个跳变沿进行采样) timescale 1ns / 1ps//两个从机 8d01 8d02 module top(input clk ,input rst_n,input [7:0] addr ,input …...

MongoDB 更新集合名

MongoDB 更新集合名 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;它使用集合&#xff08;collections&#xff09;来存储文档&#xff08;documents&#xff09;。集合在 MongoDB 中相当于关系型数据库中的表。在 MongoDB 中&#xff0c;集合名是可以在某些情况下进行更新的…...

常见面试题----深入源码理解MQ长轮询优化机制

引言 在分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;扮演着至关重要的角色。MQ不仅实现了应用间的解耦&#xff0c;还提供了异步消息处理、流量削峰等功能。而在MQ的众多特性中&#xff0c;长轮询&#xff08;Long Polling&#xff09;机制因其…...

Firewall防火墙配置

文章目录 一、firewalld简介二、firewalld特性三、firewalld相关文件及目录四、firewalld配置五、firewalld配置实例一、firewalld简介 firewalld 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 ipv4, ipv6 防火墙设置以及以太网…...

我做了一份斯坦福CS229吴恩达机器学习笔记

吴恩达教授的机器学习课程&#xff0c;可以说是AI领域的一块金字招牌。这门在斯坦福大学开设的课程&#xff0c;历经十余年&#xff0c;依旧是机器学习入门的经典之作。 记得当年&#xff0c;这门课火爆到吴恩达教授不得不将其搬到线上&#xff0c;结果不仅在斯坦福&#xff0c…...

TESSY单元测试工具详解与操作演示:ISO 26262合规性、自定义测试用例、详细测试报告等

在嵌入式系统开发中&#xff0c;安全性和可靠性至关重要&#xff0c;尤其是在汽车、医疗和工业控制等高风险行业。为了确保代码在实际运行中满足安全标准&#xff0c;开发者需要一套完善全面的测试工具&#xff0c;来严格检测代码的安全性和可靠性。 TESSY作为一款已获得IEC 61…...

C++语言之函数对象与算法

在 C 中&#xff0c;函数对象&#xff08;Function Object&#xff09;也叫仿函数&#xff08;Functor&#xff09;&#xff0c;是一个类&#xff0c;这个类重载了()运算符。从概念上讲&#xff0c;它的行为类似于一个函数&#xff0c;可以像调用函数一样来调用这个类的对象。 …...

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…...