65.9K
CodeProject 正在变化。 阅读更多。
Home

具有标签页关闭功能的 TabControl

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.68/5 (11投票s)

2005年12月12日

1分钟阅读

viewsIcon

205006

downloadIcon

4330

一个扩展的选项卡控件,在选项卡页面的左侧添加一个关闭“X”:按下它将关闭选项卡页面。

Sample Image

引言

我正在编写一个使用 TabControl 的应用程序。我需要让我的用户能够动态关闭选项卡页面,所以我一直在寻找一个在每个页面上都有关闭标志的选项卡控件,但没有找到。所以我开始开发一个。本次开发的成果是以下类:TabControlEx

使用代码

要使用该选项卡控件,我执行以下操作:

  1. 将一个常规的 TabControl 添加到我的窗体中。
  2. 编辑设计器文件(如果您的窗体名称是 Form1,则需要编辑 Form1.Designer.cs 文件)。

您需要将选项卡控件的类型从“System.Windows.Forms.TabControl”更改为“Yoramo.GuiLib.TabControlEx”。您还需要更改实例化语句(在“InitializeComponent”方法中)以创建正确的选项卡控件类型。

TabControlEx 代码

TabControlEx 继承自 System.Windows.Forms.TabControl。它实现了 OnDrawItem 以在页面上绘制“x”标志(关闭标志),以及 OnMouseClick 以确定是否单击了关闭标志。在构造函数中,我将 DrawMode 更改为 TabDrawMode.OwnerDrawFixed 以激活 OnDrawItem。为了使应用程序能够拒绝关闭选项卡,或者提供一个启用数据保存的事件,我定义了一个名为 PreRemoveTabPage 的事件。

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

namespace Yoramo.GuiLib
{
    public delegate bool PreRemoveTab(int indx);
    public class TabControlEx : TabControl
    {
        public TabControlEx()
            : base()
        {
            PreRemoveTabPage = null;
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
        }

        public PreRemoveTab PreRemoveTabPage;

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            Rectangle r = e.Bounds;
            r = GetTabRect(e.Index);
            r.Offset(2, 2);
            r.Width = 5;
            r.Height = 5;
            Brush b = new SolidBrush(Color.Black);
            Pen p = new Pen(b);
            e.Graphics.DrawLine(p, r.X, r.Y, r.X + r.Width, r.Y + r.Height);
            e.Graphics.DrawLine(p, r.X + r.Width, r.Y, r.X, r.Y + r.Height);

            string titel = this.TabPages[e.Index].Text;
            Font f = this.Font;
            e.Graphics.DrawString(titel, f, b, new PointF(r.X + 5, r.Y));
        }
        protected override void OnMouseClick(MouseEventArgs e)
        {
            Point p = e.Location;
            for (int i = 0; i < TabCount; i++)
            {
                Rectangle r = GetTabRect(i);
                r.Offset(2, 2);
                r.Width = 5;
                r.Height = 5;
                if (r.Contains(p))
                {
                    CloseTab(i);
                }
            }
        }

        private void CloseTab(int i)
        {
            if (PreRemoveTabPage != null)
            {
                bool closeIt = PreRemoveTabPage(i);
                if (!closeIt)
                    return;
            }
            TabPages.Remove(TabPages[i]);
        }
    }
}
© . All rights reserved.