2015-12-29 13 views
8

Chcę dodać przycisk zamykania do TabPages z TabControl. Staram ten kod i to działa dobrze z lewej strony do prawej TabControl:Przycisk Zamknij dla stron Tab od prawej do lewej 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); 

      } 
     } 
    } 

Ale kiedy ustawić właściwość RightToLeftLayout = true i RightToLeft = true to nie działa, TabPage tytuły nie pojawiają, a także przycisk zamykania.

Jak naprawić kod w sposób, który akceptuje właściwość RightToLeft?

+0

Rysując na TabControl, oznacza to, że trzeba przetwarzać 'własność RightToLeft' przez siebie, spróbuj edycji kodu w' TabControl2_DrawItem' – J3soon

+0

gdzi edytować? próbowałem zmienić r.offset, ale to działa tylko dla pierwszej zakładki – user4340666

+0

w bloku 'TabControl2_DrawItem', dodaj warunek' if (RightToLeft) ' – J3soon

Odpowiedz

4

Można utworzyć funkcję tłumaczenia współrzędne prostokąta, aby współrzędne RTL w pojemniku:

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

I podczas malowania w trybie RTL, obliczyć współrzędne w ten sposób:

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

Również należy narysować struny przy użyciu StringFormat i ustawić go do używania StringFormatFlags.DirectionRightToLeft, gdy jesteś w trybie RTL i narysować ciąg w przetłumaczonym prostokącie za pomocą formatu ciągu:

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

Można enkapsulować wszystkie kody w CustomTabControl dziedzicząc TabControl.

Zrzut

enter image description here enter image description here

Cały kod może być:

Przypuszczam masz bliski obraz gdzieś jak Properties.Default.Close i przypisać ją do this.CloseImage. Oto obraz, którego użyłem: enter image description here

Ustawię również this.tabControl2.Padding = new Point(10, 3);, aby zapewnić dodatkową wolną przestrzeń do rysowania obrazu.

Możesz także po prostu dodać swoje kryteria nie zamykać pierwszej karty.

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

Bardzo dziękuję to działa bardzo dobrze – user4340666

+0

Serdecznie zapraszamy :) –

+0

@Dotnet Tutaj jest [obraz] (https://i.stack.imgur.com/8kuxe.png). Możesz grać z 'this.tabControl2.Padding = new Point (10, 3);'. –

Powiązane problemy