Necesitamos tu ayuda para extender nuestros ensayos acerca de las ciencias informáticas.
Solución:
Como opción, puede agregar una pestaña adicional que muestra un ícono de agregar
TabPage
antes de eso.También puede evitar seleccionar esa pestaña adicional simplemente usando Selecting
evento de TabControl
. De esta manera, la última pestaña actúa solo como un botón para agregar, como IE y Chrome.
Detalles de implementacion
Usaremos una pestaña de dibujo de propietario para mostrar iconos de cierre en cada pestaña y un icono de agregar en la última pestaña. Usamos DrawItem
para acercarnos y agregar íconos, MouseDown
para manejar haga clic en cerrar y agregar botones, Selecting
para evitar la selección de la última pestaña y HandleCreated
para ajustar el ancho de la pestaña. Puede ver todos los códigos y configuraciones de implementación a continuación.
Inicialización
Establecer relleno y DrawMode
y asignar controladores de eventos para DrawItem
, MouseDown
, Selecting
y HandleCreated
evento.
this.tabControl1.Padding = new Point(12, 4);
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += tabControl1_DrawItem;
this.tabControl1.MouseDown += tabControl1_MouseDown;
this.tabControl1.Selecting += tabControl1_Selecting;
this.tabControl1.HandleCreated += tabControl1_HandleCreated;
Manejar haga clic en el botón cerrar y agregar botón
Puedes manejar MouseDown
o MouseClick
evento y verifique si el rectángulo de la última pestaña contiene el punto en el que se hizo clic con el mouse, luego inserte una pestaña antes de la última pestaña. Los demás comprueban si uno de los botones de cierre contiene la ubicación en la que se hizo clic, luego cierran la pestaña en la que se hizo clic en el botón de cierre:
private void tabControl1_MouseDown(object sender, MouseEventArgs e)
var lastIndex = this.tabControl1.TabCount - 1;
if (this.tabControl1.GetTabRect(lastIndex).Contains(e.Location))
this.tabControl1.TabPages.Insert(lastIndex, "New Tab");
this.tabControl1.SelectedIndex = lastIndex;
else
for (var i = 0; i < this.tabControl1.TabPages.Count; i++)
var tabRect = this.tabControl1.GetTabRect(i);
tabRect.Inflate(-2, -2);
var closeImage = Properties.Resources.DeleteButton_Image;
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.tabControl1.TabPages.RemoveAt(i);
break;
Evitar la selección en la última pestaña
Para evitar la selección de la última pestaña, puede manejar Selecting
evento de control y verifique si la pestaña de selección es la última pestaña, cancele el evento:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
if (e.TabPageIndex == this.tabControl1.TabCount - 1)
e.Cancel = true;
Dibujar botón Cerrar y Agregar botón
Para dibujar el botón de cerrar y agregar el botón, puede manejar DrawItem
evento. Usé estos íconos para agregar y cerca botones.
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
var tabPage = this.tabControl1.TabPages[e.Index];
var tabRect = this.tabControl1.GetTabRect(e.Index);
tabRect.Inflate(-2, -2);
if (e.Index == this.tabControl1.TabCount - 1)
var addImage = Properties.Resources.AddButton_Image;
e.Graphics.DrawImage(addImage,
tabRect.Left + (tabRect.Width - addImage.Width) / 2,
tabRect.Top + (tabRect.Height - addImage.Height) / 2);
else
var closeImage = Properties.Resources.DeleteButton_Image;
e.Graphics.DrawImage(closeImage,
(tabRect.Right - closeImage.Width),
tabRect.Top + (tabRect.Height - closeImage.Height) / 2);
TextRenderer.DrawText(e.Graphics, tabPage.Text, tabPage.Font,
tabRect, tabPage.ForeColor, TextFormatFlags.Left);
Ajustar el ancho de la pestaña
Para ajustar el ancho de la pestaña y dejar que la última pestaña tenga un ancho más pequeño, puede manipular HandleCreated
evento y enviar un TCM_SETMINTABWIDTH
al control y especifique el tamaño mínimo permitido para el ancho de la pestaña:
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int TCM_SETMINTABWIDTH = 0x1300 + 49;
private void tabControl1_HandleCreated(object sender, EventArgs e)
SendMessage(this.tabControl1.Handle, TCM_SETMINTABWIDTH, IntPtr.Zero, (IntPtr)16);
Descargar
Puede descargar el código o clonar el repositorio aquí:
- r-aghaei / TabControlWithCloseButtonAndAddButton
valoraciones y reseñas
Si estás contento con lo expuesto, puedes dejar un escrito acerca de qué le añadirías a este tutorial.