28-03-2009

Color de un ComboBox Item

Los items de los combobox en windows forms no se les puede definir el color del foreground y background.
Si los objetos que se ponden son del tipo ListViewItem, entonces se puede usar el evento comboBox.DrawItem para dibujarles los colores, con lo siguiente:


void OnDrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index<0)

return;


Graphics g = e.Graphics;

Rectangle r = e.Bounds ;

e.DrawBackground();


Color textColor = SystemColors.ControlText; //Queda con etse color

if (e.State == (DrawItemState.Focus | DrawItemState.Selected ) )

textColor = SystemColors.HighlightText;

if (e.State == DrawItemState.None)

textColor = SystemColors.WindowText;


ListViewItem item = combo.Items[e.Index] as ListViewItem;


if (item.ForeColor != SystemColors.WindowText)

textColor = item.ForeColor;


//Rectangulo interno

// Rectangle rectangle = new Rectangle(2, e.Bounds.Top+2, e.Bounds.Height, e.Bounds.Height-4);

// e.Graphics.FillRectangle(new SolidBrush(Color.Salmon), rectangle);


g.DrawString(item.ToString(), new Font("Ariel", 8), new SolidBrush(textColor), r);

e.DrawFocusRectangle();


}



O más simple aún, reemplazar OnDrawItem:


public class ColorComboBox : ComboBox
{

protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem (e);

if (e.Index<0)
return;

Control item = this.Items[e.Index] as Control;
if (item==null)
return;

Graphics g = e.Graphics;
Rectangle r = e.Bounds ;
if (item.ForeColor != SystemColors.WindowText)
g.DrawString(item.ToString(), Parent.Font, new SolidBrush(item.ForeColor), r);

}

}