Este ejemplo surgio de una consulta en este artículo.
El control ColorDialog nos presenta una paleta de colores tradicional, pero lo cierto es que la de visual studio es mucho más linda y nos muestra todos los colores por su nombre como están definidos en las propiedades del objeto System.Drawing.Color.
Dado el problema de que no existe un control que nos muestre esta lista de colores vamos a ver como podemos constriur una nosotros mismos.
Para el ejemplo necesitaremos un nuevo proyecto y dos formularios.
En el primer formulario solo tendremos un baton para llamar al formulario 2, tal como se ve en la siguiente figura:

y el código del boton es el siguiente:
Private Sub btnColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnColor.Click Dim vForm2 As New Form2 vForm2.ShowDialog() End Sub
y en el siguiente formulario pondremos yn control ListBox y dos botoes (aceptar y cancelar) igual que en el siguiente formulario:

En el evento Load del formulario establecemos algunas propiedades del control ListBox y cargamos los nombres de los colores con el siguiente código:
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ListBox1.DrawMode = DrawMode.OwnerDrawFixed ListBox1.ItemHeight = 20 ListBox1.Items.Clear() ListBox1.BeginUpdate() For Each pi As Reflection.PropertyInfo In GetType(Color).GetProperties(Reflection.BindingFlags.Static Or Reflection.BindingFlags.Public) ListBox1.Items.Add(pi.Name) Next ListBox1.EndUpdate() End Sub
En la primer linea del Load “ListBox1.DrawMode = DrawMode.OwnerDrawFixed” establecemos que todos los elementos del control se dibujan manualmente y tienen el mismo alto. Esto, ademças, desencadena un suceso DrawItem justo antes de mostrar cada elemento.
Para programar el evento DrawItem del ListBox, seleccionamos (en la vista de diseño) el ListBox1, presionamos F4 para ver las propiedades, y en la parte de arriba del cuadro de propiedades seleccionamos el icono del rayo para ver los evento que el control tiene disponibles, buscamos DrawItem y le damos doble clic. La siguiente imagen ejemplifica como hacerlo:

y este es el código del evento DrawItem
Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem Dim rectangulo As Rectangle = e.Bounds If (e.State And DrawItemState.Selected) Then e.Graphics.FillRectangle(SystemBrushes.Highlight, rectangulo) Else e.Graphics.FillRectangle(Brushes.White, rectangulo) End If Dim nombreColor As String = ListBox1.Items(e.Index) Dim b As New SolidBrush(Color.FromName(nombreColor)) rectangulo.Inflate(-16, -2) e.Graphics.FillRectangle(b, New Rectangle(rectangulo.X, rectangulo.Y, 30, rectangulo.Height)) e.Graphics.DrawRectangle(Pens.Black, New Rectangle(rectangulo.X, rectangulo.Y, 30, rectangulo.Height)) If (e.State And DrawItemState.Selected) Then e.Graphics.DrawString(nombreColor, e.Font, Brushes.White, rectangulo.X + 34, rectangulo.Y + 2) Else e.Graphics.DrawString(nombreColor, e.Font, Brushes.Black, rectangulo.X + 34, rectangulo.Y + 2) End If End Sub
Ahora solo nos falta programar los eventosde los dos botones como se ve en el siguiente código:
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click My.Forms.Form1.BackColor = Color.FromName(ListBox1.SelectedItem) End Sub Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click Me.Close() End Sub
Bueno, a probar la aplicación… si todo salió bien, se verá así:

Les dejo algunas definiciones:
Graphics.FillRectangle (Método): Rellena el interior de un rectángulo especificado por un par de coordenadas, un valor de ancho y un valor de alto.
Graphics.DrawRectangle (Método): Dibuja un rectángulo especificado por un par de coordenadas, un valor de ancho y un valor de alto.
Graphics.DrawString (Método): Dibuja la cadena de texto especificada en la ubicación especificada y con los objetos Brush y Font especificados.
Espero que les sirva y lo puedan usar en sus proyectos.
Información Bitacoras.com…
Valora en Bitacoras.com: Este ejemplo surgio de una consulta en este artículo. El control ColorDialog nos tresenta una paleta de colores tradicional, pero lo ciert es que la de visual studio es mucho más linda y nos muestra todos los colores por su n…..
Muy bueno el ejemplo, gracias.
¡¡ GENIAL !!
¡¡ Se agradece mucho !!
!! Muy bueno !!
lo unico que no me funciono fue el boton cancelar.
jaja, me lo olvidé, pero el código es muy sencillo: Me.Close
da error al seleccionar el color transparente, porque sera?……….. el resto de colores si funciona
salu2
es que el color transparente no se puede aplicar como color de fondo de un formulario, pero si aplica para otros controles.
Gracias por comentar!
me salvo la vida este ejemplo!!…pero como hago para que se vean las prpiedades de la pantalla a la cual le cambio el color?porque no me deja ver “My.Forms.Form1.BackColor”.gracias salu2
hola
me sale un error se esperaba un identificador exactamente en .<A If (e.State And DrawItemState.Selected) Then
e.Graphics.FillRectangle(SystemBrushes.Highlight, rectangulo)
ME AYUDAN POR FA
GRACIASS
Saludos…
Estoy buscando tecnicas para poder hacer un diseño mas bonito de los controles aquel que ser como el aero pero no tengo idea alguna ni pude encontrar algo por favor si podrian ayudarme con eso de anetmano muchas gracias…
esta padrisimo, muchas gracias por este ejemplo. Podre aplicarlo a mis necesidades
Gracias desde Merida , Yucatan