2012-03-05 47 views
5

Me gustaría poder cambiar el color del borde de los controles ToolStripComboBox en algunas de mis tiras de herramientas, ya que el color de borde predeterminado de ComboBoxes cuando se usa con estilo plano es SystemColors.Window, que es básicamente invisible contra el color de control predeterminado de la tira de herramientas. Después de investigar mucho en Reflector, no veo ninguna forma obvia de hacerlo, ya que toda la infraestructura detrás de la representación de ComboBox está altamente protegida detrás de las interfaces internas y privadas.Cambiar borde de ToolStripComboBox con estilo plano

Fuera de ToolStrips, una solución común que he visto para fijar el color del borde en ComboBoxes es crear una subclase de ComboBox, anular WndProc y pintar manualmente el borde. Esto no puede funcionar para los controles ToolStripComboBox ya que el control ComboBox interno es su propia subclase privada de ComboBox, sin posibilidad de que pueda reemplazar la instancia del control.

Una solución alternativa que estoy considerando es poner uno de los objetos ComboBox extendidos en un ToolStripControlHost, que me permite dibujar un borde, pero luego tengo que renunciar a algunos de los ajustes profesionales del renderizador. Un inconveniente secundario que he notado es que ocasionalmente parpadeo durante el mouseover.

Cambiar mi diseño a WPF no es una solución aceptable. Los controles de envoltura en los controles principales para dibujar bordes tampoco son aceptables, ya que esto no gana nada con la alternativa ToolStripControlHost.

¿Alguien tiene una solución inteligente para vencer este problema, o hay una reimplantación existente (con licencia permisiva) de la pila de renderizado plano de ComboBox, que soluciona algunas de las deficiencias existentes ¿implementación?

Respuesta

2

Aquí está una manera de hacer que funcione ... más o menos :)

Crear un controlador de eventos para el evento de la PaintToolStrip. A continuación, recorra todo el ToolStripComboBoxes y pinte un rectángulo alrededor de ellos.

private Color cbBorderColor = Color.Gray; 
    private Pen cbBorderPen = new Pen(SystemColors.Window); 

    private void toolStrip1_Paint(object sender, PaintEventArgs e) 
    {    
     foreach (ToolStripComboBox cb in toolStrip1.Items) 
     { 
      Rectangle r = new Rectangle(
       cb.ComboBox.Location.X - 1, 
       cb.ComboBox.Location.Y - 1, 
       cb.ComboBox.Size.Width + 1, 
       cb.ComboBox.Size.Height + 1); 

      cbBorderPen.Color = cbBorderColor; 
      e.Graphics.DrawRectangle(cbBorderPen, r); 
     } 
    } 

Esto es lo que parece (Tenga en cuenta que puede que tenga que ajustar la altura de la ToolStrip para prevenir la frontera pintada de ser cortado):

enter image description here

1

mejora: compruebe el tipo del elemento de la tira de herramientas, , para que el programa no se aplaste si se trata de toolstipLabel, por ejemplo.

foreach (var item in toolStrip1.Items) 
{ 
     var asComboBox = item as ToolStripComboBox; 
     if (asComboBox != null) 
     { 
      var location = asComboBox.ComboBox.Location; 
      var size = asComboBox.ComboBox.Size; 
      Pen cbBorderPen = new Pen(Color.Gray); 
      Rectangle rect = new Rectangle(
        location.X - 1, 
        location.Y - 1, 
        size.Width + 1, 
        size.Height + 1); 

      e.Graphics.DrawRectangle(cbBorderPen, rect); 
     } 

}

Cuestiones relacionadas