Cuando en una aplicación Windows Forms diseñamos una barra de herramientas mediante el control ToolStrip, habremos observado que en tiempo de ejecución, al situar el cursor sobre un control ToolStripButton, el color de fondo del mismo cambia para notificar al usuario de tal circunstancia.



Pero no es el control ToolStripButton sobre el que vamos a hablar aquí, sino que lo haremos acerca de un compañero suyo de la barra de herramientas: ToolStripLabel.


Supongamos que la característica visual que acabamos de comentar (cambio de color de fondo al entrar el cursor), queremos aplicarla a un ToolStripLabel.


Como truco rápido, podríamos recurrir a no emplear en absoluto un ToolStripLabel sino un ToolStripButton, configurado para muestre únicamente texto, como vemos en el siguiente código fuente.


 


private void Form1_Load(object sender, EventArgs e)


{


    // proporcionar apariencia de etiqueta al botón


    this.toolStripButton1.Text = «Prueba»;


    this.toolStripButton1.DisplayStyle = ToolStripItemDisplayStyle.Text;


    this.toolStripButton1.AutoToolTip = false;


 


    // asignar un literal a esta etiqueta de la barra de herramientas


    this.toolStripLabel1.Text = «Prueba»;


}


 


En la siguiente imagen podemos ver un formulario con un ToolStrip que contiene, en primer lugar un ToolStripButton, y a continuación un ToolStripLabel.



Aparentemente ambos son iguales, con la excepción del resaltado visual automático que proporciona el ToolStripButton al situar encima el cursor del ratón.


Pero supongamos que este truco no nos vale porque es necesario utilizar obligatoriamente el control ToolStripLabel, y además debemos controlar programáticamente la activación/desactivación del color de fondo utilizado para el resaltado.


Ante tales requerimientos, una solución pasaría por desarrollar una clase derivada de ToolStripLabel, en la que dispusiéramos de una propiedad para controlar el estado de activación del resaltado, otra para establecer el color utilizado al activar dicho estado, y finalmente, un reemplazo para el método OnPaint, en el que pintaríamos el control cuando sea necesario aplicarle el color especial, o bien dejar el comportamiento de dibujo por defecto en el resto de casos. Todo esto lo vemos en el siguiente código fuente.


//….


using System.Windows.Forms;


using System.Drawing;


//….


public class ToolStripEtiqueta : ToolStripLabel


{


    bool bResaltar = false;


    Color clrFondoResaltado = SystemColors.Control;


 


    // activar-desactivar el resaltado


    public bool Resaltar


    {


        get


        {


            return bResaltar;


        }


        set


        {


            bResaltar = value;


            this.Invalidate();


        }


    }


 


    // color para el resaltado del control


    public Color FondoResaltado


    {


        get


        {


            return clrFondoResaltado;


        }


 


        set


        {


            clrFondoResaltado = value;


        }


    }


 


    protected override void OnPaint(PaintEventArgs e)


    {


        base.OnPaint(e);


 


        // si hay que dibujar el control resaltado


        if (bResaltar)


        {


            // obtener el contexto gráfico


            Graphics oGraphics = e.Graphics;


 


            // dibujar la superficie del control


            oGraphics.FillRectangle(new SolidBrush(this.clrFondoResaltado),


                e.ClipRectangle);


 


            // dibujar el texto mostrado por la etiqueta


            oGraphics.DrawString(this.Text,


                this.Font,


                new SolidBrush(this.ForeColor),


                e.ClipRectangle.X + 1,


                e.ClipRectangle.Y + 2);


        }


    }


}


Cabe resaltar en el anterior código, que el método OnPaint recibe como parámetro un tipo PaintEventArgs, gracias al cual, obtenemos acceso al contexto gráfico (un tipo Graphics) del objeto sobre el que hemos de realizar operaciones de dibujo (nuestro control ToolStripEtiqueta). La propiedad Graphics.ClipRectangle, nos devuelve el rectángulo correspondiente al área que ocupa el control, la cual pintamos utilizando el color oportuno y el método FillRectangle. Mientras que para escribir el texto literal de la etiqueta utilizamos el método DrawString.


Llegado el momento de poner en práctica la clase que acabamos de escribir, lo que haremos será añadir a nuestro formulario un ToolStrip y varios controles a este último, uno de ellos será, naturalmente, una instancia de nuestra clase ToolStripEtiqueta. Para demostrar el efecto de aplicación del color controlado por nuestro código, emplearemos un CheckBox, que encargará de cambiar el estado de la propiedad Resaltar del objeto ToolStripEtiqueta. Para facilitar el uso de este ejemplo, todas las operaciones las realizaremos desde código sin usar el diseñador de formularios, por lo que simplemente necesitaremos copiar y pegar los fuentes en un proyecto de Visual Studio.


public partial class frmPruebaEtiqueta : Form


{


    ToolStrip tsBarra;


    CheckBox chkResaltar;


    ToolStripEtiqueta lblEtiquetaPropia;


    ToolStripButton btnBoton;


    ToolStripLabel lblEtiquetaNormal;


 


    public frmPruebaEtiqueta()


    {


        InitializeComponent();


    }


 


    private void frmPruebaEtiqueta_Load(object sender, EventArgs e)


    {


        // crear una barra de herramientas para el formulario


        tsBarra = new ToolStrip();


        tsBarra.Dock = DockStyle.Top;


        this.Controls.Add(tsBarra);


 


        // crear controles para la barra de herramientas:


 


        // crear un control etiqueta personalizado


        lblEtiquetaPropia = new ToolStripEtiqueta();


        lblEtiquetaPropia.Text = «Etiqueta nueva»;


        lblEtiquetaPropia.FondoResaltado = Color.SpringGreen;


 


        // crear un botón y una etiqueta normal


        btnBoton = new ToolStripButton(«Aceptar»);


        btnBoton.DisplayStyle = ToolStripItemDisplayStyle.Text;


        lblEtiquetaNormal = new ToolStripLabel(«Normal»);


 


        // añadir los controles a la barra


        tsBarra.Items.AddRange(new ToolStripItem[] { lblEtiquetaPropia, btnBoton, lblEtiquetaNormal });


 


        // añadir un CheckBox al formulario


        // mediante el que por código activaremos


        // el resaltado para la etiqueta personalizada


        chkResaltar = new CheckBox();


        chkResaltar.Name = «chkResaltar»;


        chkResaltar.Text = «Resaltar»;


        chkResaltar.Location = new Point(75, 75);


        chkResaltar.CheckedChanged += new EventHandler(chkResaltarCheckedChanged);


        this.Controls.Add(chkResaltar);


    }


 


    private void chkResaltarCheckedChanged(object sender, EventArgs e)


    {


        // cambiar el resaltado del control de etiqueta en la barra


        lblEtiquetaPropia.Resaltar = !lblEtiquetaPropia.Resaltar;


    }


}


La siguiente imagen muestra el ejemplo en ejecución, donde nuestro control ToolStripEtiqueta se muestra en estado resaltado.



Bien, pues esto sería todo 😎


Un saludo.