C# TabControl实现为每一个TabPage添加关闭按钮

news2024/10/7 2:20:07

默认情况下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的Name
  private 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;

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

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

相关文章

千兆光模块和万兆光模块的发展前景与市场分析

随着互联网技术的不断发展&#xff0c;千兆光模块和万兆光模块作为网络传输的核心部件&#xff0c;在数据传输领域已得到广泛的应用。本文将从发展历程、市场前景和应用案例三个方面详细分析千兆光模块和万兆光模块的优势和未来发展前景。 一、千兆光模块和万兆光模块的发展历…

Ubuntu配置网络与静态IP地址的常见方法

这里的环境是虚拟机中的Ubuntu18版本的网络配置&#xff0c;使用虚拟机比较常见&#xff0c;因为主机一般是有线直连&#xff0c;配置很简单 1、NAT模式 虚拟机最简单的联网就是勾选“NAT模式”&#xff0c;不需要任何配置&#xff0c;主机能上网&#xff0c;虚拟机就可以上网…

电脑丢失dll文件一键修复的方法,一分钟快速解决dll问题

动态链接库&#xff08;DLL&#xff09;在Windows操作系统中起到至关重要的作用。DLL文件能够在程序的运行期间提供所需的代码和数据&#xff0c;以参与和影响程序的执行。如果电脑中的某个或多个DLL文件丢失&#xff0c;或遭到破坏&#xff0c;那么涉及到这些文件的程序可能会…

windows cmake x86 x64 下载与安装

cmake 下载路径&#xff1a;cmake 下载选择&#xff1a; 界面下拉选取适合自己的版本 这里是windows x86 x64 &#xff08;x86是32位系统&#xff1b;x64是64位系统&#xff09; 安装&#xff1a; 点击安装。 此处选择添加环境变量 命令提示符 验证查看 cmake 桌面可以…

在Python中使用deepfakes实现AI换脸功能

目录 一、Deepfakes技术原理 二、Deepfakes技术实现方法 三、Deepfakes技术应用与实现代码 四、结论 近年来&#xff0c;深度学习技术在图像处理、计算机视觉和人工智能领域取得了显著的进步。其中&#xff0c;Deepfakes技术是一种基于深度学习的图像合成技术&#xff0c;可…

After Effects 2024 v24.0.2(AE2024)

After Effects 2024是视频特效和动态图形设计软件。以下是After Effects 2024的主要功能和特点&#xff1a; 支持创建各种令人惊叹的视觉效果&#xff0c;例如粒子系统、合成特效、绿屏抠像等。支持动画制作&#xff0c;包括关键帧动画、形状动画、运动跟踪等工具&#xff0c;…

若依框架详细教程

一、若依下载以及配置启动 1、下载地址 2、打开样式 3、数据库引入及配置 导入数据库 配置后端数据库 同时还要redis redis安装教程&#xff1a;安装教程 要是修改端口的话都需要改 打开前端package.json下载这个会提示 4、启动 后端启动 前端启动

超好用的IDEA插件推荐

写完代码还得重复打字编写接口文档&#xff1f;代码量大定位接口定义方法太难找&#xff1f;麻烦&#xff01;写完代码还得复制粘贴到postman进行调试&#xff1f; 这三点太麻烦&#xff1f;今天给大家推荐一款IDEA插件&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;…

2010年3月18日Go生态洞察:从语言的简化到社区的成长

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

智能井盖传感器助力建设数字化城市

在推进智慧城市建设过程中&#xff0c;多个城市在打造数字化管理平台&#xff0c;因为通过科学技术手段统一管理城市各种基础设施建设&#xff0c;可以缓解传统人工不足所导致的执法困难的问题&#xff0c;而且可以方便城市管理及时响应。在智慧城市建设过程中&#xff0c;城市…

Jprofiler/ VisualVM 定位内存溢出OOM

下载,接受协议下一步下一步,最后选择与IDEA集成OK ej-technologies - Java APM, Java Profiler, Java Installer Builder IDEA配置参数: # F:\study\spring-test\dump 为dump文件保存路径-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathF:\study\spring-test\dumppackage …

LeetCode - #88 合并两个有序数组

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

JavaSE23——JDBC

JDBC 一、什么是 JDBC&#xff1f; JDBC 是 Java Database Connectivity 的缩写&#xff0c;它是 Java 语言用于与关系型数据库进行连接和交互的一种标准接口。 JDBC 提供了一种统一的方式&#xff0c;使得 Java 应用程序能够通过标准的 API 与各种不同的数据库进行通信&…

GoLong的学习之路(二十二)进阶,语法之并发(go最重要的特点)(channel的主要用法)

这一章是接上一章内容继续&#xff0c;上一章说到协程也就是goroutine&#xff0c;如何使用它&#xff0c;这一张是讲一种数据结构。当然这个章节的数据结构非常重要。可以说这个数据结构就是为了方便协程&#xff0c;才制作出来的。 单纯地将函数并发执行是没有意义的。函数与…

AWK语言第二版 3.4 Unicode数据 3.5 基本图表 3.6 总结

3.4 Unicode数据 啤酒是不分国界的饮料&#xff0c;与之相称的是&#xff0c;啤酒的名字中也使用了很多非ASCII字符。下面的 Awk 程序 charfreq 统计了输入中每个不同的 Unicode 代码点&#xff08;code point&#xff09;的出现次数。&#xff08;代码点通常是一个字符&#…

Deep Freeze冰点还原2024中文免费版恢电脑数据恢复工具

相信大家都认同更新日志&#xff1a;支持Win 10功能更新&#xff0c;Win更新的恢复升级&#xff0c;将系统驱动器从深度冻结保护中排除&#xff0c;全支持NVME驱动器&#xff0c;支持ISCSI驱动器。人所共知的是集成性和兼容性&#xff1a;Deep Freeze 冰点可兼容多种硬盘驱动器…

vulnhub打靶日记:接口和传参的信息收集技巧

目录 总结 边界突破 信息收集 主机发现 端口扫描&#xff0c;服务探测 web渗透 目录扫描 参数爆破 php封装器写入文件尝试 ssh爆破 内网渗透 提权 免费领取安全学习资料包&#xff01; 靶机&#xff1a;https://download.vulnhub.com/evilbox/EvilBox---One.ova 攻…

Vue路由重定向

一、Vue路由-重定向 1.问题 网页打开时&#xff0c; url 默认是 / 路径&#xff0c;如果未匹配到组件时&#xff0c;会出现空白 2.解决方案 重定向 → 匹配 / 后, 强制跳转 /home 路径 3.语法 { path: 匹配路径, redirect: 重定向到的路径 }, 比如&#xff1a; { path:/ …

idea 2023 设置启动参数、单元测试启动参数

找到上方的editconfigration&#xff0c; 如下图&#xff0c;如果想在启动类上加&#xff0c;就选择springboot&#xff0c;如果想在单元测试加&#xff0c;就选择junit 在参数栏设置参数&#xff0c;多个参数以空格隔开 如果没有这一栏&#xff0c;就选择就可以了。 然后&…

JavaScript爬虫程序爬取游戏平台数据

这次我用一个JavaScript爬虫程序&#xff0c;来爬取游戏平台采集数据和分析的内容。爬虫使用了爬虫IP信息&#xff0c;爬虫IP主机为duoip&#xff0c;爬虫IP端口为8000。以下是每行代码和步骤的解释&#xff1a; // 导入所需的库 const axios require(axios); const cheerio …