2015-12-29 14 views
8

Tôi muốn thêm nút đóng vào TabPages của số TabControl. Tôi cố gắng mã này và nó hoạt động tốt với một trái Để Quyền TabControl:Nút đóng cho TabPages of Right To Left TabControl C#

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); 

      } 
     } 
    } 

Nhưng khi tôi thiết lập thuộc tính RightToLeftLayout = trueRightToLeft = true nó không hoạt động, TabPage tiêu đề không xuất hiện và cũng nút đóng.

Vậy làm cách nào để sửa mã theo cách chấp nhận thuộc tính RightToLeft?

+0

Bằng cách vẽ trên một TabControl, nó có nghĩa là bạn cần phải xử lý 'bất động sản RightToLeft' một mình, hãy thử chỉnh sửa mã của bạn trong 'TabControl2_DrawItem' – J3soon

+0

wher để chỉnh sửa? tôi đã thử thay đổi r.offset nhưng công việc này chỉ dành cho tabpage đầu tiên – user4340666

+0

trong khối 'TabControl2_DrawItem', thêm điều kiện' if (RightToLeft) ' – J3soon

Trả lời

4

Bạn có thể tạo một hàm để dịch tọa độ của một hình chữ nhật để RTL tọa độ trong một container:

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

Và khi vẽ trong chế độ RTL, tính toán tọa độ theo cách này:

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

Ngoài ra bạn nên vẽ các chuỗi của bạn bằng cách sử dụng StringFormat và đặt nó để sử dụng StringFormatFlags.DirectionRightToLeft khi bạn đang ở chế độ RTL và vẽ chuỗi trong hình chữ nhật được dịch bằng định dạng chuỗi:

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

Bạn có thể đóng gói tất cả mã trong một CustomTabControl kế thừa TabControl.

Ảnh chụp màn hình

enter image description here enter image description here

Toàn bộ mã có thể là:

Tôi giả sử bạn có một hình ảnh gần như ở đâu đó Properties.Default.Close và gán nó vào this.CloseImage. Đây là hình ảnh tôi đã sử dụng: enter image description here

Tôi cũng đặt this.tabControl2.Padding = new Point(10, 3); để cung cấp thêm dung lượng trống để vẽ hình ảnh.

Ngoài ra, bạn có thể chỉ cần thêm tiêu chí không đóng tab đầu tiên.

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); 
} 
+0

Cảm ơn rất nhiều công việc này rất tốt – user4340666

+0

Bạn được chào đón :) –

+0

@Dotnet Đây là [hình ảnh] (https://i.stack.imgur.com/8kuxe.png). Bạn có thể chơi với 'this.tabControl2.Padding = new Point (10, 3);'. –

Các vấn đề liên quan