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

我想为TabControl TabPages添加一个关闭按钮。 我尝试这个代码,它与左到右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(rX, rY)); if (tabControl2.SelectedIndex >= 1) { e.Graphics.DrawImage(img, new Point(rX + (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 = trueRightToLeft = true它不起作用, TabPage标题不会出现,也会关闭按钮。

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

您可以创建一个函数将矩形的坐标转换为容器中的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); 

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

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

您可以将所有代码封装在inheritanceTabControlCustomTabControl

截图

在此处输入图像描述 在此处输入图像描述

整个代码可能是:

我想你有一个像Properties.Default.Close这样的近似图像,并将它分配给this.CloseImage 。 这是我使用的图像: 在此处输入图像描述

我还设置了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.选择标签控件。
2.将RightToLeft属性设置为yes ,将 RightToLeftLayout属性设置为true

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