Saltar al contenido

TabControl con botón Cerrar y Agregar

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 Agregar

y verifique cuando el usuario haga clic en esa pestaña, luego inserte una nueva 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.

Pestaña con botón cerrar y agregar

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 Agregar y cerca 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *