C# TabControl实现为每一个TabPage添加关闭按钮
默认情况下TabControl是无法通过界面关闭TabPage的

有些情况下我们需要手动关闭任意一个TabPage,如下图所示

TabControl控件自带属性是无法满足以上需求,下面简单介绍实现过程
1、首先需要对TabPage进行重绘,其目的是为了在TabPage上画出来一个"❌"符号。
(1)重绘前需要将TabControl的 DrawMode属性设置为OwnerDrawFixed。否则DrawDown事件不起作用
(2)在窗体Load事件中设置TabControl的Padding属性(增加TabPage的显示宽度,为"❌"符号让出位置): tabc.Padding = new Point(10, 0);
//tabc是TabControl的Nameprivate void tabc_DrawItem(object sender, DrawItemEventArgs e){Graphics g = e.Graphics;g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;Rectangle rect = tabc.GetTabRect(e.Index);TabPage page = tabc.TabPages[e.Index];SolidBrush brushBack;SolidBrush brushFront;string text = page.Text;//TabPage被选中时显示不同的前景色和背景色if (tabc.SelectedTab == page){brushBack = new SolidBrush(Color.Black);brushFront = new SolidBrush(Color.White);}else{brushBack = new SolidBrush(Color.White);brushFront = new SolidBrush(Color.Black);}g.FillRectangle(brushBack, rect);Font font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));g.DrawString(text, new Font("宋体", 12f), brushFront, rect.X + 2, rect.Y + 5);g.DrawString("×", font, brushFront, rect.Right - 22, rect.Bottom - 18);}
2、对按钮添加关闭事件(删除TabPage事件)
private void tabc_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Right)return;TabPage page = tabc.SelectedTab;Rectangle rect = tabc.GetTabRect(tabc.SelectedIndex);Rectangle rect1 = new Rectangle(rect.Right - 22, rect.Y, 22, rect.Height);int x = e.X;int y = e.Y;//判断鼠标位置是否位于“❌”的范围内if (x > rect1.X && x < rect1.Right && y > rect1.Y && y < rect1.Bottom){ tabc.TabPages.Remove(page);}}
另附上通过代码对TabControl添加TabPage的实现过程
TabPage tabPage = new TabPage{Name = "name",Text = "text"};tabc.TabPages.Add(tabPage);tabc.SelectedTab = tabPage;
相关文章:
C# TabControl实现为每一个TabPage添加关闭按钮
默认情况下TabControl是无法通过界面关闭TabPage的 有些情况下我们需要手动关闭任意一个TabPage,如下图所示 TabControl控件自带属性是无法满足以上需求,下面简单介绍实现过程 1、首先需要对TabPage进行重绘,其目的是为了在TabPage上画出…...
Win10系统下torch.cuda.is_available()返回为False的问题解决
Q: Win10系统下torch.cuda.is_available()返回为False (l2) D:\opt\l2>pythonPython 3.10.12 | packaged by conda-forge | (main, Jun 23 2023, 22:34:57) [MSC v.1936 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or &q…...
零代码编程:用ChatGPT批量将Mp4视频转为Mp3音频
文件夹中有很多mp4视频文件,如何利用ChatGPT来全部转换为mp3音频呢? 在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个批量将Mp4视频转为Mp3音频的任务,具体步骤如下: 打开文件夹:…...
微服务项目,请求从发出到后端处理器的历程
点击登录按钮,发出 http://localhost:8803/service_6001/admin/login/in请求,这是一个由nginx配置的前端项目 查看配置文件,该条请求会被映射形成对http://localhost:51603/admin/login/in的post请求 upstream heima-admin-gateway {server localhost:51603; } server {liste…...
pandas教程:String Manipulation 字符串处理和正则表达式re
文章目录 7.3 String Manipulation(字符串处理)1 String Object Methods(字符串对象方法)2 Regular Expressions(正则表达式)3 Vectorized String Functions in pandas(pandas中的字符串向量化函…...
Apache Doris 是什么
Apache Doris 是一个开源的、基于MPP(Massively Parallel Processing)架构的SQL数据仓库。它旨在提供高性能、高可靠性的数据分析服务,特别适合处理大规模数据集。 Doris 的主要特点包括: 高性能:通过MPP架构…...
【NeurIPS 2020】基于蒙特卡罗树搜索的黑箱优化学习搜索空间划分
Learning Search Space Partition for Black-box Optimization using Monte Carlo Tree Search 目标:从采样(Dt ∩ ΩA)中学习一个边界,从而最大化两方的差异 先使用Kmeans在特征向量上( [x, f(x)] )聚类…...
面试题:线上MySQL的自增id用尽怎么办?
文章目录 前言表定义自增值idInnoDB系统自增row_idXidInnodb trx_id InnoDB数据可见性的核心思想为什么要加248?为何只读事务不分配trx_id?thread_id 总结 前言 MySQL的自增id都定义了初始值,然后不断加步长。虽然自然数没有上限,…...
Java集合框架:Collection 与 Map 接口深度解析
Java的集合框架提供了丰富的工具和数据结构,其中 Collection 和 Map 接口是这个框架的核心。这两个接口分别用于处理一组对象和键值对的映射关系,是Java编程中不可或缺的部分。让我们深入挖掘这两个接口的特性以及它们的实际应用场景。 1. Collection 接…...
qt多线程例子,不断输出数字
dialog.h #include "dialog.h" #include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog) {ui->setupUi(this); }Dialog::~Dialog() {delete ui; }// 启动线程按钮 void Dialog::on_startButton_clicked() {//conn…...
基于厨师算法的无人机航迹规划-附代码
基于厨师算法的无人机航迹规划 文章目录 基于厨师算法的无人机航迹规划1.厨师搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用厨师算法来优化无人机航迹规划。 1.厨师搜索算法 …...
设计模式的六大原则
1、开闭原则(Open Close Principle) 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代 码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好&…...
原文远知行COO张力加盟逐际动力 自动驾驶进入视觉时代?
11月7日,通用足式机器人公司逐际动力LimX Dynamics官宣了两位核心成员的加入。原文远知行COO张力出任逐际动力联合创始人兼COO,香港大学长聘副教授潘佳博士为逐际动力首席科学家。 根据介绍,两位核心成员的加入,证明一家以技术驱…...
【公益案例展】火山引擎公益电子票据服务——连接善意,共创美好
火山引擎公益案例 本项目案例由火山引擎投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2023中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 捐赠票据是慈善组织接受捐赠后给捐赠方开具的重要凭证&…...
postman中文乱码
在header中添加这两个: Content-Type application/json;charsetUTF-8 Accept application/json;charsetUTF-8...
设计模式简要介绍
设计模式有很多,较为重要的如下 静态和单例模式 单例模式的本质就是类成员中有一个对象实例 public class Animal{public static string Title "Animal" // 类成员public string Name; // 对象成员public const float Pi 3.14f; // 类成员public rea…...
LeetCode-232. 用栈实现队列(C++)
目录捏 一、题目描述二、示例与提示三、思路四、代码 一、题目描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的…...
无人机红外相机的畸变矫正
在项目开展过程中,发现大疆M30T的红外相机存在比较明显的畸变问题,因此需要对红外图像进行畸变矫正。在资料检索过程中,发现对红外无人机影像矫正的资料较少,对此,我从相机的成像原理角度出发,探索出一种效…...
C++编程案例讲解-基于结构体的控制台通讯录管理系统
基于结构体的控制台通讯录管理系统 通讯录是一个可以记录亲人、好友信息的工具,系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人…...
ASP.NETCore6开启文件服务允许通过url访问附件(图片)
需求背景 最近在做一个工作台的文件上传下载功能,主要想实现上传图片之后,可以通过url直接访问。由于url直接访问文件不安全,所以需要手动开启文件服务。 配置 文件路径如下,其中Files是存放文件的目录: 那么&…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
