Botón Cerrar en tabControl

¿Hay alguien que pueda decirme cómo agregar el botón Cerrar en cada pestaña al usar tabControl en C #? planeo usar la imagen del botón para reemplazar [x] en mi pestaña.

gracias

Sin derivar una clase, aquí hay un fragmento claro: http://www.dotnetthoughts.net/implementing-close-button-in-tab-pages/

Establezca la propiedad DrawMode del control de tabulación en OwnerDrawFixed. Esta propiedad decide si el sistema o el desarrollador pintan los subtítulos. Agregue el código en el evento DrawItem del control de tabs: este evento se invocará para pintar cada página de tabs.

//This code will render a "x" mark at the end of the Tab caption. e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - 15, e.Bounds.Top + 4); e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4); e.DrawFocusRectangle(); 

Ahora para la acción del botón de cierre, necesitamos agregar el siguiente código al evento MouseDown del control de tabs.

 //Looping through the controls. for (int i = 0; i < this.tabControl1.TabPages.Count; i++) { Rectangle r = tabControl1.GetTabRect(i); //Getting the position of the "x" mark. Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7); if (closeButton.Contains(e.Location)) { if (MessageBox.Show("Would you like to Close this Tab?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { this.tabControl1.TabPages.RemoveAt(i); break; } } } 

Agregando a las otras respuestas … ¿por qué iterar a través de todas las tabs en el evento clic del mouse cuando podemos simplemente detectar la pestaña actual con .SelectedIndex y .SelectedTab?

Al igual que:

 private void tabControl1_MouseDown(object sender, MouseEventArgs e) { Rectangle r = tabControl1.GetTabRect(this.tabControl1.SelectedIndex); Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7); if (closeButton.Contains(e.Location)) { this.tabControl1.TabPages.Remove(this.tabControl1.SelectedTab); } } 

Lo que parece suceder es que, en el momento en que hace clic en una tabPage para cerrarla, también se selecciona, lo que permite que el botón Cerrar cierre la pestaña derecha. Para mí funciona, pero por favor tómenlo con cuidado adicional, ya que no estoy completamente seguro de posibles inconvenientes (mi oración inicial no era una pregunta completamente retórica ya que soy algo nuevo en .Net …).

Prueba este código:

  private Point _imageLocation = new Point(13, 5); private Point _imgHitArea = new Point(13, 2); private void Form1_Load(object sender, EventArgs e) { tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; tabControl1.DrawItem += tabControl1_DrawItem; CloseImage = WindowsFormsApplication3.Properties.Resources.closeR; tabControl1.Padding = new Point(10, 3); } private void TabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { try { Image img = new Bitmap(CloseImage); Rectangle r = e.Bounds; r = this.tabControl1.GetTabRect(e.Index); r.Offset(2, 2); Brush TitleBrush = new SolidBrush(Color.Black); Font f = this.Font; string title = this.tabControl1.TabPages[e.Index].Text; e.Graphics.DrawString(title, f, TitleBrush, new PointF(rX, rY)); if (tabControl1.SelectedIndex >= 1) { e.Graphics.DrawImage(img, new Point(rX + (this.tabControl1.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y)); } } catch (Exception) { } } private void TabControl1_Mouse_Click(object sender, System.Windows.Forms.DrawItemEventArgs e) { TabControl tc = (TabControl)sender; Point p = e.Location; int _tabWidth = 0; _tabWidth = this.tabControl1.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X); Rectangle r = this.tabControl1.GetTabRect(tc.SelectedIndex); r.Offset(_tabWidth, _imgHitArea.Y); r.Width = 16; r.Height = 16; if (tabControl1.SelectedIndex >= 1) { if (r.Contains(p)) { TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex]; tc.TabPages.Remove(TabP); } } } 

Mira este fragmento de código