在C#Windows窗体的tabpage选项卡标题中添加关闭按钮

Viv*_*ngh 3 c# tabpage winforms

我试图在tabcontrol的tabpage面板上添加关闭按钮或'X',我已经通过阅读此stackoverflow问题成功完成了此操作.

问题是标签页标题和X标志合并在一起.我发现tabpage title面板没有根据标题文本调整大小.

这是代码:

//This code will render a "x" mark at the end of the Tab caption. 
e.Graphics.DrawString("X", e.Font, Brushes.Black, e.Bounds.Right + 15, e.Bounds.Top + 4);
e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left+5, e.Bounds.Top + 4);

e.DrawFocusRectangle();
Run Code Online (Sandbox Code Playgroud)

结果是在这里我改变了e.bounds.right价值,但它仍然没有用.

小智 7

要修复合并的tabPage.Text并另外绘制"X",只需添加:

tabControl.Padding = new System.Drawing.Point(21, 3);
Run Code Online (Sandbox Code Playgroud)

它会在每个tabPage的末尾添加一些额外的空间


Bla*_*rog 5

确保将Tab控件的DrawMode属性设置为OwnerDrawFixed.此属性决定系统或开发人员是否绘制字幕.

以下是使用TabSizeMode = Fixed的代码示例,设置选项卡大小:

public partial class Form1 : Form
{
    const int LEADING_SPACE = 12;
    const int CLOSE_SPACE = 15;
    const int CLOSE_AREA = 15;

    public Form1()
    {
        InitializeComponent();
    }

    private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
    {
        //This code will render a "x" mark at the end of the Tab caption. 
        e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - CLOSE_AREA, e.Bounds.Top + 4);
        e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + LEADING_SPACE, e.Bounds.Top + 4);
        e.DrawFocusRectangle();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // get the inital length
        int tabLength = tabControl1.ItemSize.Width;

        // measure the text in each tab and make adjustment to the size
        for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
        {
            TabPage currentPage = tabControl1.TabPages[i];

            int currentTabLength = TextRenderer.MeasureText(currentPage.Text, tabControl1.Font).Width;
            // adjust the length for what text is written
            currentTabLength += LEADING_SPACE + CLOSE_SPACE + CLOSE_AREA;

            if (currentTabLength > tabLength)
            {
                tabLength = currentTabLength;
            }
        }

        // create the new size
        Size newTabSize = new Size(tabLength, tabControl1.ItemSize.Height);
        tabControl1.ItemSize = newTabSize;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面示例代码的屏幕截图: 选项卡大小在行动中