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);

csharp 复制代码
  //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事件)

csharp 复制代码
 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的实现过程

csharp 复制代码
 TabPage tabPage = new TabPage
 {
      Name = "name",
      Text = "text"
  };
  tabc.TabPages.Add(tabPage);
  tabc.SelectedTab = tabPage;
相关推荐
何以解忧唯有撸码6 小时前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp
学逆向的7 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi8 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
OpenAnolis小助手9 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
阿尼卡~10 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
hhhjhl11 小时前
Undici 跨端三方库仓颉适配全流程
java·开发语言·ubuntu
染指111011 小时前
158.Agent-LangGraph-子图(共享状态和不共享状态模式)
开发语言·人工智能·python·ui·agent·agents
wangchunyu11411 小时前
JAVA JVM内存结构与运行时数据区
java·开发语言·jvm
slongzhang_11 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
云和数据.ChenGuang13 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节