WinForm TabControl动态创建TabPage,选中当前TabPage,关闭TabPage

效果图

核心代码

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace TabControlDemo
{
    public class MyTabControl : TabControl
    {
        const int CLOSE_SIZE = 15;
        //原创来自 www.luofenming.com
        public MyTabControl()
        {
            this.Padding = new Point(12, 3);

            ////  DrawMode: 指定用户还是系统来绘制标题
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
            this.HotTrack = true;
            this.DrawItem += new DrawItemEventHandler(this.Control_DrawItem);
            this.MouseDown += new MouseEventHandler(this.Control_MouseDown);
        }

        //绘制“X”号即关闭按钮
        private void Control_DrawItem(object sender, DrawItemEventArgs e)
        {
            try
            {
                //选中的标签页填充成白色
                using (SolidBrush s = new SolidBrush(Color.White))
                {
                    Rectangle rect = this.GetTabRect(this.SelectedIndex);
                    e.Graphics.FillRectangle(s, rect);
                }

                Rectangle tab = this.GetTabRect(e.Index);

                //先添加TabPage属性  
                e.Graphics.DrawString(this.TabPages[e.Index].Text, this.Font, SystemBrushes.ControlText, tab.X + 2, tab.Y + 2);
                //再画一个矩形框
                using (Pen p = new Pen(Color.Transparent))
                {
                    tab.Offset(tab.Width - (CLOSE_SIZE + 3), 2);
                    tab.Width = CLOSE_SIZE;
                    tab.Height = CLOSE_SIZE;
                    e.Graphics.DrawRectangle(p, tab);
                }
                //填充矩形框
                Color recColor = e.State == DrawItemState.Selected ? Color.White : Color.Transparent;
                using (Brush b = new SolidBrush(recColor))
                {
                    e.Graphics.FillRectangle(b, tab);
                }
                //画关闭符号
                using (Pen objpen = new Pen(Color.Black))
                {
                    //自己画X
                    //"\"线
                    Point p1 = new Point(tab.X + 3, tab.Y + 3);
                    Point p2 = new Point(tab.X + tab.Width - 3, tab.Y + tab.Height - 3);
                    e.Graphics.DrawLine(objpen, p1, p2);
                    //"/"线
                    Point p3 = new Point(tab.X + 3, tab.Y + tab.Height - 3);
                    Point p4 = new Point(tab.X + tab.Width - 3, tab.Y + 3);
                    e.Graphics.DrawLine(objpen, p3, p4);
                }
                e.Graphics.Dispose();
            }
            catch (Exception)
            { }
        }

        private void Control_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                int x = e.X, y = e.Y;
                //计算关闭区域  
                Rectangle tab = this.GetTabRect(this.SelectedIndex);
                tab.Offset(tab.Width - (CLOSE_SIZE + 3), 2);
                tab.Width = CLOSE_SIZE;
                tab.Height = CLOSE_SIZE;
                //如果鼠标在区域内就关闭选项卡  
                bool isClose = x > tab.X && x < tab.Right && y > tab.Y && y < tab.Bottom;

                if (isClose == true)
                {
                    if (MessageBox.Show("确认关闭吗", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        this.TabPages.Remove(this.SelectedTab);
                        if (this.TabPages.Count - 1 > 0)
                        {
                            this.SelectedTab = this.TabPages[this.TabPages.Count - 1];
                        }
                    }
                }
            }
        }
        public void AddTabPage(Control userControl, string pageName)
        {//转载请保留出处 www.luofenming.com
            bool isNew = true;
            foreach (TabPage tab in this.TabPages)
            {
                if (tab.Text.Equals(pageName))
                {//如果TabControl 包含 则选择包含的TabPage
                    isNew = false;
                    this.SelectedTab = tab;
                    break;
                }
            }
            if (isNew)//如果TabControl 不包含 则创建新的TabPage 并选中
            {
                TabPage page = new TabPage();
                page.Text = pageName;
                if (userControl is Form)
                {
                    Form form = userControl as Form;
                    form.TopLevel = false;
                    form.Parent = page;
                    form.Dock = DockStyle.Fill;
                    form.FormBorderStyle = FormBorderStyle.None;
                    form.Show();
                    page.Controls.Add(form);
                }
                else
                {
                    userControl.Dock = DockStyle.Fill;
                    page.Controls.Add(userControl);
                }

                this.TabPages.Add(page);
                this.SelectedTab = page;
            }
        }
    }
}

源码地址: https://pan.baidu.com/s/1ECZLpFdoMYu9hrsfZ-RbFg?pwd=5pw4 提取码: 5pw4