TabPages从右到左TabControl的关闭按钮c#

时间:2015-12-29 09:28:30

标签: c# winforms tabcontrol right-to-left tabpage

我想向TabPages的{​​{1}}添加关闭按钮。我尝试使用这个代码,它可以正常使用Left To Right TabControl:

TabControl

但是,当我设置属性private Point _imageLocation = new Point(13, 5); private Point _imgHitArea = new Point(13, 2); this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; tabControl2.DrawItem += TabControl2_DrawItem; private void TabControl2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { try { Image img = new Bitmap(GestionP.Properties.Resources.Close); Rectangle r = e.Bounds; r = this.tabControl2.GetTabRect(e.Index); r.Offset(2, 2); Brush TitleBrush = new SolidBrush(Color.Black); Font f = this.Font; string title = this.tabControl2.TabPages[e.Index].Text; e.Graphics.DrawString(title, f, TitleBrush, new PointF(r.X, r.Y)); if (tabControl2.SelectedIndex >= 1) { e.Graphics.DrawImage(img, new Point(r.X + (this.tabControl2.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y)); } } catch (Exception) { } } private void tabControl2_MouseClick(object sender, MouseEventArgs e) { TabControl tc = (TabControl)sender; Point p = e.Location; int _tabWidth = 0; _tabWidth = this.tabControl2.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X); Rectangle r = this.tabControl2.GetTabRect(tc.SelectedIndex); r.Offset(_tabWidth, _imgHitArea.Y); r.Width = 16; r.Height = 16; if (tabControl2.SelectedIndex >= 1) { if (r.Contains(p)) { TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex]; tc.TabPages.Remove(TabP); } } } RightToLeftLayout = true时,它不起作用,RightToLeft = true标题不会出现,也会关闭按钮。

那么如何以接受TabPage属性的方式修复代码?

2 个答案:

答案 0 :(得分:5)

您可以创建一个函数将矩形的坐标转换为容器中的RTL坐标:

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

在RTL模式下绘画时,以这种方式计算坐标:

tabRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, tabRect);

此外,您应该使用StringFormat绘制字符串,并在处于RTL模式时将其设置为使用StringFormatFlags.DirectionRightToLeft,并使用字符串格式在翻译的矩形中绘制字符串:

e.Graphics.DrawString(this.tabControl2.TabPages[e.Index].Text, 
                      this.Font, Brushes.Black, tabRect, sf);

您可以将所有代码封装在CustomTabControl继承TabControl

<强>截图

enter image description here enter image description here

整个代码可以是:

我想您在Properties.Default.Close之类的地方有一张贴图,并将其分配给this.CloseImage。这是我使用的图像:enter image description here

我还设置this.tabControl2.Padding = new Point(10, 3);以提供额外的可用空间来绘制图像。

此外,您只需添加不关闭第一个标签的条件。

Image CloseImage;

private void Form1_Load(object sender, EventArgs e)
{
    this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
    tabControl2.DrawItem += TabControl2_DrawItem;
    tabControl2.MouseClick += tabControl2_MouseClick;
    CloseImage = Properties.Resources.Close;
    this.tabControl2.Padding = new Point(10, 3);
}


private void TabControl2_DrawItem(object sender, 
                                  System.Windows.Forms.DrawItemEventArgs e)
{
    try
    {
        var tabRect = this.tabControl2.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.tabControl2.RightToLeft == System.Windows.Forms.RightToLeft.Yes &&
            this.tabControl2.RightToLeftLayout == true)
        {
            tabRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, tabRect);
            imageRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, imageRect);
            sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
        }

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

    }
    catch (Exception) { }
}

private void tabControl2_MouseClick(object sender, MouseEventArgs e)
{

    for (var i = 0; i < this.tabControl2.TabPages.Count; i++)
    {
        var tabRect = this.tabControl2.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.tabControl2.TabPages.RemoveAt(i);
            break;
        }
    }
}

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

答案 1 :(得分:0)

无需覆盖绘图:
1.选择标签控件 2.将RightToLeft属性设置为yes AND RightToLeftLayout属性为true

现在所有标签页都是从右到左对齐的(诀窍是RightToLeftRightToLeftLayout属性必须设置为更改,不知道为什么微软这样做了......)