winform C#自定义tabcontrol关闭按钮

问题描述 投票:-1回答:1

我有一个自定义的tabcontrol,带有一个关闭按钮,它可以正常工作,但不会关闭最后一个标签页,我很想更改标签页的样式以匹配chrome的样式。我的问题是我无法关闭所有表单,总是剩下最后一个无法关闭的表单。

这是我编写的要覆盖的代码

public static Rectangle GetRTLCoordinates(Rectangle container, Rectangle drawRectangle)
{
    return new Rectangle(
        container.Width - drawRectangle.Width - drawRectangle.X,
        drawRectangle.Y,
        drawRectangle.Width,
        drawRectangle.Height);
}
Image CloseImage;

private void frmMain_Load(object sender, EventArgs e)
{
    tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
    tabControl1.DrawItem += tabControl1_DrawItem;
    CloseImage = Pharmacy_Management.Properties.Resources.Close;
    tabControl1.Padding = new Point(10, 3);
}

private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
    try
    {
        var tabRect = this.tabControl1.GetTabRect(e.Index);
        tabRect.Inflate(-2, -2);
        var imageRect = new Rectangle(tabRect.Right - CloseImage.Width,
                                 tabRect.Top + (tabRect.Height - CloseImage.Height) / 2,
                                 CloseImage.Width,
                                 CloseImage.Height);

        var sf = new StringFormat(StringFormat.GenericDefault);
        if (this.tabControl1.RightToLeft == System.Windows.Forms.RightToLeft.Yes &&
            this.tabControl1.RightToLeftLayout == true)
        {
            tabRect = GetRTLCoordinates(this.tabControl1.ClientRectangle, tabRect);
            imageRect = GetRTLCoordinates(this.tabControl1.ClientRectangle, imageRect);
            sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
        }

        e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, this.Font, Brushes.Black, tabRect, sf);
        e.Graphics.DrawImage(CloseImage, imageRect.Location);

    }
    catch (Exception) { }
}

private void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
    for (var i = 1; i < this.tabControl1.TabPages.Count; i++)
    {
        var tabRect = this.tabControl1.GetTabRect(i);
        tabRect.Inflate(-2, -2);
        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;
        }
    }

}

这是我调用新表单并在新面板中显示的代码

private void button4_Click(object sender, EventArgs e)

{
    FRM_AMAT frm = new FRM_AMAT();
    tabControl1.Visible = true;
    frm.TopLevel = false;
    frm.Visible = true;
    frm.FormBorderStyle = FormBorderStyle.None;
    frm.Dock = DockStyle.Fill;
    TabPage tabPage = new TabPage();
    tabPage.Text = frm.Text;
    tabPage.Controls.Add(frm);
    tabControl1.Controls.Add(tabPage);
    tabControl1.SelectedTab = tabPage;
    frm.Show();
}
c# winforms tabcontrol
1个回答
0
投票
for (var i = 0; i < this.tabControl1.TabPages.Count; i++)
            {
                var tabRect = this.tabControl1.GetTabRect(i);
                tabRect.Inflate(-2, -2);
                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);
                    if (i == 0)
                    {
                        this.tabControl1.Visible = false;
                    }

                    break;
                }

            }

var i = 0,它将关闭最后一个选项卡:D:D:D

© www.soinside.com 2019 - 2024. All rights reserved.