c# – 带关闭和添加按钮的TabControl

前端之家收集整理的这篇文章主要介绍了c# – 带关闭和添加按钮的TabControl前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想让一个标签控件有一个“x”(关闭按钮)和“”(新标签按钮).我找到了添加 x button解决方案,该选项卡现在看起来像这样:

但我现在要添加一个黑色圆圈的位置.我不知道如何,我尝试绘制最后一个标签的Paint事件,如下所示:

var p = tabs.TabPages[tabs.TabCount - 1];
p.Paint += new PaintEventHandler(tab_OnDrawPage);

private void tab_OnDrawPage(object sender,PaintEventArgs e)
{
    // e.ClipRectangle.
    e.Graphics.DrawString("+",new Font("verdana",10,FontStyle.Bold),Brushes.Black,e.ClipRectangle.X + 10,e.ClipRectangle.Y + 10);
}

但它并没有显示任何吸引力.我想这与我传递给DrawString()调用的位置有关,但我不知道要使用的正确位置.我用10把它从最后一个标签上画出来.如何解决?我自己没有做过任何自定义绘图,我正在学习它.

解决方法

作为选项,您可以添加一个额外的选项卡,该选项卡显示添加图标,并检查用户何时单击该选项卡,然后在其之前插入新的TabPage.

此外,您可以使用选择TabControl事件来阻止选择该额外选项卡.这样,最后一个标签就像是一个添加按钮,就像IE和Chrome一样.

实施细节

我们将使用所有者绘制选项卡在每个选项卡上显示最后一个选项卡上的添加图标.我们使用DrawItem绘制关闭添加图标,使用MouseDown处理单击关闭添加按钮,选择以防止选择最后一个选项卡,使用HandleCreated调整选项卡宽度.您可以在下面看到所有实施设置和代码.

初始化

设置padding和DrawMode并为DrawItem,MouseDown,Selecting和HandleCreated事件分配事件处理程序.

this.tabControl1.Padding = new Point(12,4);
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;

this.tabControl1.DrawItem += tabControl1_DrawItem;
this.tabControl1.MouseDown += tabControl1_MouseDown;
this.tabControl1.Selecting += tabControl1_Selecting;
this.tabControl1.HandleCreated += tabControl1_HandleCreated;

处理单击关闭按钮并添加按钮

您可以处理MouseDown或MouseClick事件,并检查最后一个选项卡矩形是否包含鼠标单击的点,然后在最后一个选项卡之前插入选项卡.其他函数检查其中一个关闭按钮是否包含单击的位置,然后关闭其单击其关闭按钮的选项卡:

private void tabControl1_MouseDown(object sender,MouseEventArgs e)
{
    var lastIndex = this.tabControl1.TabCount - 1;
    if (this.tabControl1.GetTabRect(lastIndex).Contains(e.Location))
    {
        this.tabControl1.TabPages.Insert(lastIndex,"New Tab");
        this.tabControl1.SelectedIndex = lastIndex;
    }
    else
    {
        for (var i = 0; i < this.tabControl1.TabPages.Count; i++)
        {
            var tabRect = this.tabControl1.GetTabRect(i);
            tabRect.Inflate(-2,-2);
            var closeImage = Properties.Resources.DeleteButton_Image;
            var imageRect = new Rectangle(
                (tabRect.Right - closeImage.Width),tabRect.Top + (tabRect.Height - closeImage.Height) / 2,closeImage.Width,closeImage.Height);
            if (imageRect.Contains(e.Location))
            {
                this.tabControl1.TabPages.RemoveAt(i);
                break;
            }
        }
    }
}

防止selectin最后一个标签

要防止选择最后一个选项卡,您可以处理选择控件事件并检查选择选项卡是否为最后一个选项卡,取消该事件:

private void tabControl1_Selecting(object sender,TabControlCancelEventArgs e)
{
    if (e.TabPageIndex == this.tabControl1.TabCount - 1)
        e.Cancel = true;
}

绘制关闭按钮和添加按钮

要绘制关闭按钮并添加按钮,您可以处理DrawItem事件.我用这些图标添加关闭按钮.

private void tabControl1_DrawItem(object sender,DrawItemEventArgs e)
{
    var tabPage = this.tabControl1.TabPages[e.Index];
    var tabRect = this.tabControl1.GetTabRect(e.Index);
    tabRect.Inflate(-2,-2);
    if (e.Index == this.tabControl1.TabCount - 1)
    {
        var addImage = Properties.Resources.AddButton_Image;
        e.Graphics.DrawImage(addImage,tabRect.Left + (tabRect.Width - addImage.Width) / 2,tabRect.Top + (tabRect.Height - addImage.Height) / 2);
    }
    else
    {
        var closeImage = Properties.Resources.DeleteButton_Image;
        e.Graphics.DrawImage(closeImage,(tabRect.Right - closeImage.Width),tabRect.Top + (tabRect.Height - closeImage.Height) / 2);
        TextRenderer.DrawText(e.Graphics,tabPage.Text,tabPage.Font,tabRect,tabPage.ForeColor,TextFormatFlags.Left);
    }
}

调整标签宽度

要调整选项卡宽度并让最后一个选项卡具有较小的宽度,您可以处理HandleCreated事件并将TCM_SETMINTABWIDTH发送到控件并指定选项卡宽度允许的最小大小:

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd,int msg,IntPtr wp,IntPtr lp);
private const int TCM_SETMINTABWIDTH = 0x1300 + 49;
private void tabControl1_HandleCreated(object sender,EventArgs e)
{
    SendMessage(this.tabControl1.Handle,TCM_SETMINTABWIDTH,IntPtr.Zero,(IntPtr)16);
}

下载

您可以在此处下载代码或克隆存储库:

> r-aghaei/TabControlWithCloseButtonAndAddButton

猜你在找的C#相关文章