Título: Listview header modificado en listview vbnet Publicado por: Juan Sanchez en 8 Diciembre 2015, 20:06 pm Saludos a todos los componentes de este foro, lo que quiero consultarles es como puedo cambiar el backcolor y forecolor en el header de un listview en vbnet con las apis de windows, se los agradeceré mucho y espero tener suerte...
Título: Re: Listview header modificado en listview vbnet Publicado por: Lekim en 12 Diciembre 2015, 18:22 pm hola
No entiendo porqué quieres usar API para cambiar el estilo de las cabeceras de un Listview cuando vb.net ya ofrece medios para ello. ListView.DrawColumnHeader Event (https://msdn.microsoft.com/en-us/library/system.windows.forms.listview.drawcolumnheader(v=vs.110).aspx) Código
Los cambios se asignan por capas primero estableces lo que sería el 'Background' mediante FillRectangle, si creas otro FillRectangle éste se coloca en la parte superior del anterior en el mismo orden en el que se nombra en el código. Y por último la representación del texto. Si escribes la referéncia al texto antes que aplicar el rectángulo entonces no se verá el texto. También puedes aplicar una imagen en lugar FillRectangle: Código
Título: Re: Listview header modificado en listview vbnet Publicado por: Juan Sanchez en 29 Enero 2016, 23:26 pm Gracias Lekim por responder a la pregunta, lo que quisiera saber como cambiar el backcolor en el header de la parte derecha del sobrante, es decir que toda la barra del header quede de un solo color.
lo que quiero hacer es que se cambie el backcolor de otro color sin utilizar el evento DrawColumnHeader y sin perder los efectos cuando el mouse pasa por encima, por eso decía si se puede modificar solo el backcolor usando alguna api de windows para eso. tengo mi código que es lo siguiente, lo repinta toda la barra del header pero lo borra las columnas existentes. Librerias: Código
mas o menos quiero algo así como en esta imagen en el siguiente link (http://www.conaltid.gob.bo/documento/lv.png) Gracias por responderme. Título: Re: Listview header modificado en listview vbnet Publicado por: Eleкtro en 30 Enero 2016, 06:04 am Es una tarea bastante complicada, incluso recurriendo a P/invokes de la WinAPI.
La zona "sin utilizar" en la derecha de la cabecera de las columnas del Listview forma parte del área NO-cliente de la ventana del control, por ende usando código administrado por ejemplo en el evento DrawColumnHeader solo vas a poder dibujar sobre el área cliente del control, así que tienes que recurrir si o si a las funciones Win32 relacionadas con GDI. Pero el resultado será sencillamente imperfecto, ya que al tratarse del área no-cliente y como lo estamos tratando de pintar manualmente, Windows no puede determinar cuando se debe redibujar ese área, así que a veces verás como desaparece el color de ese área, ya que con los métodos base de invocadores de eventos del ListView parece no ser suficiente para indicar manualmente cuando se debe redibujar el área no-cliente en los eventos que se suceden en el control (ya que no hay un invocador de evento para controlar cuando se hace click en un separador de columna). Aquí tienes un ejemplo que escribí, tomatelo como tal...un ejemplo, por que como ya dije esto es imperfecto, notarás como desaparece el color al hacer click sobre un separador de columna, y al redimensionar las columnas; una solución a lo mencionado sería determinar los handles de ventana (hWnd) de todos los separadores de columnas que existan en el control, y suscribirte a cada una de las ventanas de los separadores, es decir a la función de ventana que procesa sus mensajes (WndProc) para determinar cuando se hace click (mensaje de ventana: WM_LButtonUp y WM_NcLButtonUp ) o cuando se mueve (mensaje de ventana: WM_Move y WM_ExitSizeMove) y en ese momento pintar el area no cliente, pero hacer todo eso es demasiado costoso para satisfacer un simple capricho de pintar esa zona... y aparte, por naturaleza este tipo de hacks en los controles de WinForms tenderán a generar molestos efectos de Flickering. Código
PD: Nótese que me faltó añadir un Getter/Setter a las propiedades para llamar a los métodos que pintan sobre la cabecera de las columnas cuando se modifica el valor de dichas propiedades. Saludos |