具有标签页关闭功能的 TabControl






3.68/5 (11投票s)
2005年12月12日
1分钟阅读

205006

4330
一个扩展的选项卡控件,在选项卡页面的左侧添加一个关闭“X”:按下它将关闭选项卡页面。
引言
我正在编写一个使用 TabControl
的应用程序。我需要让我的用户能够动态关闭选项卡页面,所以我一直在寻找一个在每个页面上都有关闭标志的选项卡控件,但没有找到。所以我开始开发一个。本次开发的成果是以下类:TabControlEx
。
使用代码
要使用该选项卡控件,我执行以下操作:
- 将一个常规的
TabControl
添加到我的窗体中。 - 编辑设计器文件(如果您的窗体名称是
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]);
}
}
}