Compartir vía


Acerca de Dibujo personalizado

Esta sección contiene información general sobre la funcionalidad de dibujo personalizada y proporciona información general conceptual sobre cómo una aplicación puede admitir el dibujo personalizado. Actualmente, los siguientes controles admiten la funcionalidad de dibujo personalizada:

  • Controles de encabezado
  • Controles de vista de lista
  • Controles de barra de rebar
  • Controles de la barra de herramientas
  • Controles de información sobre herramientas
  • Controles de barra de seguimiento
  • Controles de vista de árbol

Acerca de los mensajes de notificación de dibujo personalizados

Todos los controles comunes que admiten el dibujo personalizado envían NM_CUSTOMDRAW códigos de notificación en puntos específicos durante las operaciones de dibujo. Estos códigos de notificación describen las operaciones de dibujo que se aplican a todo el control, así como las operaciones de dibujo específicas de los elementos del control. Al igual que muchos códigos de notificación, las notificaciones de NM_CUSTOMDRAW se envían como mensajes WM_NOTIFY .

El parámetro lParam de una notificación de dibujo personalizada será la dirección de una estructura NMCUSTOMDRAW o una estructura específica del control que contiene una estructura NMCUSTOMDRAW como primer miembro. En la tabla siguiente se muestra la relación entre los controles y las estructuras que usan.

Estructura Usado por
NMCUSTOMDRAW Controles de rebar, barra de seguimiento y encabezado
NMLVCUSTOMDRAW Controles de vista de lista
NMTBCUSTOMDRAW Controles de la barra de herramientas
NMTTCUSTOMDRAW Controles de información sobre herramientas
NMTVCUSTOMDRAW Controles de vista de árbol

 

Ciclos de pintura, fases de dibujo y mensajes de notificación

Al igual que todas las aplicaciones de Windows, los controles comunes pintan y borran periódicamente en función de los mensajes recibidos del sistema u otras aplicaciones. El proceso de una pintura de control o borrado en sí se denomina ciclo de pintura. Los controles que admiten el dibujo personalizado envían NM_CUSTOMDRAW códigos de notificación periódicamente a través de cada ciclo de pintura. Este código de notificación va acompañado de una estructura NMCUSTOMDRAW u otra estructura que contiene una estructura NMCUSTOMDRAW como primer miembro.

Un fragmento de información que contiene la estructura NMCUSTOMDRAW es la fase actual del ciclo de pintura. Esto se conoce como fase de dibujo y se representa mediante el valor del miembro dwDrawStage de la estructura. Un control informa a su elemento primario sobre cuatro fases básicas de dibujo. Estas fases básicas, o globales, de dibujo se representan en la estructura mediante los siguientes valores de marca (definidos en Commctrl.h).

Valores de fase de dibujo global Descripción
CDDS_PREPAINT Antes de que comience el ciclo de pintura.
CDDS_POSTPAINT Una vez completado el ciclo de pintura.
CDDS_PREERASE Antes de que comience el ciclo de borrado.
CDDS_POSTERASE Una vez completado el ciclo de borrado.

 

Cada uno de los valores anteriores se puede combinar con la marca CDDS_ITEM para especificar fases de dibujo específicas de los elementos. Para mayor comodidad, Commctrl.h contiene los siguientes valores específicos del elemento.

Valores de fase de dibujo específicos del elemento Descripción
CDDS_ITEMPREPAINT Antes de dibujar un elemento.
CDDS_ITEMPOSTPAINT Después de dibujar un elemento.
CDDS_ITEMPREERASE Antes de borrar un elemento.
CDDS_ITEMPOSTERASE Después de borrar un elemento.
CDDS_SUBITEM Versiones de control comunes 4.71. Marca combinada con CDDS_ITEMPREPAINT o CDDS_ITEMPOSTPAINT si se dibuja un subelemento. Esto solo se establecerá si CDRF_NOTIFYITEMDRAW se devuelve de CDDS_PREPAINT.

 

La aplicación debe procesar el código de notificación NM_CUSTOMDRAW y, a continuación, devolver un valor específico que informe al control lo que debe hacer. Consulte las secciones siguientes para obtener más información sobre estos valores devueltos.

Aprovechar los servicios draw personalizados

La clave para aprovechar la funcionalidad de dibujo personalizada es responder a los códigos de notificación de NM_CUSTOMDRAW que envía un control. Los valores devueltos que envía la aplicación en respuesta a estas notificaciones determinan el comportamiento del control para ese ciclo de pintura.

Esta sección contiene información sobre cómo la aplicación puede usar NM_CUSTOMDRAW valores devueltos de notificación para determinar el comportamiento del control.

Los detalles se dividen en los temas siguientes:

Responder a la notificación de preint

Al principio de cada ciclo de pintura, el control envía el código de notificación NM_CUSTOMDRAW , especificando el valor CDDS_PREPAINT en el miembro dwDrawStage de la estructura de NM_CUSTOMDRAW adjunta. El valor que la aplicación devuelve a esta primera notificación determina cómo y cuándo el control envía notificaciones de dibujo personalizadas posteriores para el resto de ese ciclo de pintura. La aplicación puede devolver una combinación de las marcas siguientes en respuesta a la primera notificación.

Valor devuelto Efecto
CDRF_DODEFAULT El control se dibujará a sí mismo. No enviará notificaciones de NM_CUSTOMDRAW adicionales para este ciclo de pintura. Esta marca no se puede usar con ninguna otra marca.
CDRF_DOERASE El control solo dibujará el fondo.
CDRF_NEWFONT La aplicación especificó una nueva fuente para el elemento; el control usará la nueva fuente. Para obtener más información sobre cómo cambiar las fuentes, consulte Cambio de fuentes y colores. Esto ocurre cuando dwDrawStage es igual a CDDS_ITEMPREPAINT.
CDRF_NOTIFYITEMDRAW El control notificará al elemento primario de las operaciones de dibujo específicas del elemento. Enviará NM_CUSTOMDRAW códigos de notificación antes y después de dibujar elementos. Esto ocurre cuando dwDrawStage es igual a CDDS_PREPAINT.
CDRF_NOTIFYPOSTERASE El control notificará al elemento primario después de borrar un elemento. Esto ocurre cuando dwDrawStage es igual a CDDS_PREPAINT.
CDRF_NOTIFYPOSTPAINT El control enviará una notificación NM_CUSTOMDRAW cuando se complete el ciclo de pintura de todo el control. Esto ocurre cuando dwDrawStage es igual a CDDS_PREPAINT.
CDRF_NOTIFYSUBITEMDRAW Versión 4.71. La aplicación recibirá una notificación de NM_CUSTOMDRAW con dwDrawStage establecido en CDDS_ITEMPREPAINT | CDDS_SUBITEM antes de dibujar cada subelemento de vista de lista. A continuación, puede especificar la fuente y el color de cada subelemento por separado o devolver CDRF_DODEFAULT para el procesamiento predeterminado. Esto ocurre cuando dwDrawStage es igual a CDDS_ITEMPREPAINT.
CDRF_SKIPDEFAULT La aplicación ha dibujado el elemento manualmente. El control no dibujará el elemento. Esto ocurre cuando dwDrawStage es igual a CDDS_ITEMPREPAINT.
CDRF_SKIPPOSTPAINT El control no dibujará el rectángulo de foco alrededor de un elemento.

 

Solicitud de notificaciones específicas del elemento

Si la aplicación devuelve CDRF_NOTIFYITEMDRAW a la notificación inicial de dibujo personalizado de prepaint, el control enviará notificaciones para cada elemento que dibuja durante ese ciclo de pintura. Estas notificaciones específicas del elemento tendrán el valor CDDS_ITEMPREPAINT en el miembro dwDrawStage de la estructura NMCUSTOMDRAW correspondiente. Puede solicitar que el control envíe otra notificación cuando termine de dibujar el elemento devolviendo CDRF_NOTIFYPOSTPAINT a estas notificaciones específicas del elemento. De lo contrario, devuelva CDRF_DODEFAULT y el control no notificará a la ventana primaria hasta que empiece a dibujar el siguiente elemento.

Dibujo del elemento usted mismo

Si la aplicación dibuja todo el elemento, devuelva CDRF_SKIPDEFAULT. Esto permite que el control omita los elementos que no necesita dibujar, lo que reduce la sobrecarga del sistema. Tenga en cuenta que devolver este valor significa que el control no dibujará ninguna parte del elemento.

Cambio de fuentes y colores

La aplicación puede usar el dibujo personalizado para cambiar la fuente de un elemento. Simplemente seleccione el HFONT que desee en el contexto del dispositivo especificado por el miembro hdc de la estructura NMCUSTOMDRAW asociada a la notificación de dibujo personalizada. Dado que la fuente que seleccione puede tener métricas diferentes a la fuente predeterminada, asegúrese de incluir el bit CDRF_NEWFONT en el valor devuelto del mensaje de notificación. Para obtener más información sobre el uso de esta funcionalidad, consulte el código de ejemplo en Uso de dibujo personalizado. La fuente que especifica la aplicación se usa para mostrar ese elemento cuando no está seleccionado. El dibujo personalizado no permite cambiar los atributos de fuente de los elementos seleccionados.

Para cambiar los colores de texto de todos los controles que admiten dibujo personalizado excepto para la vista de lista y la vista de árbol, simplemente establezca los colores de texto y fondo deseados en el contexto del dispositivo proporcionados en la estructura de notificaciones de dibujo personalizada con las funciones SetTextColor y SetBkColor . Para modificar los colores de texto en la vista de lista o en la vista de árbol, debe colocar los valores de color deseados en los miembros clrText y clrTextBk de la estructura NMLVCUSTOMDRAW o NMTVCUSTOMDRAW .

Nota

Antes de la versión 6.0 de los controles comunes, las barras de herramientas omiten la marca de CDRF_NEWFONT . La versión 6.0 admite la marca de CDRF_NEWFONT y puede usarla para seleccionar una fuente diferente para la barra de herramientas. Sin embargo, no se puede cambiar el color de una barra de herramientas cuando un estilo visual está activo. Para cambiar el color de una barra de herramientas en la versión 6.0, primero debe deshabilitar los estilos visuales llamando a SetWindowTheme y especificando ningún estilo visual:

 

SetWindowTheme (hwnd, "", "");

Dibujo personalizado con controles List-View y Tree-View

Los controles más comunes se pueden controlar básicamente de la misma manera. Sin embargo, los controles de vista de lista y vista de árbol tienen algunas características que requieren un enfoque algo diferente para el dibujo personalizado.

Para la versión 5.0, estos dos controles pueden mostrar texto recortado si cambia la fuente devolviendo CDRF_NEWFONT. Este comportamiento es necesario para la compatibilidad con versiones anteriores de los controles comunes. Si desea cambiar la fuente de un control de vista de lista o vista de árbol, obtendrá mejores resultados si envía un mensaje de CCM_SETVERSION con el valor wParam establecido en 5 antes de agregar elementos al control. Para obtener un ejemplo de un control de vista de árbol que usa un dibujo personalizado, consulte el artículo de Knowledge Base SAMPLE: CustDTv Illustrates Custom Draw in a TreeView (Q248496).

Dibujo personalizado con controles List-View

Dado que los controles de vista de lista tienen subelementos y varios modos de visualización, tendrá que controlar la notificación de NM_CUSTOMDRAW algo diferente que para los otros controles comunes.

Para el modo de informe, use el procedimiento siguiente.

  1. La primera notificación NM_CUSTOMDRAW tendrá el miembro dwDrawStage de la estructura NMCUSTOMDRAW asociada establecida en CDDS_PREPAINT. Devuelve CDRF_NOTIFYITEMDRAW.
  2. A continuación, recibirá una notificación de NM_CUSTOMDRAW con dwDrawStage establecido en CDDS_ITEMPREPAINT. Si especifica nuevas fuentes o colores y devuelve CDRF_NEWFONT, se cambiarán todos los subelementos del elemento. Si en su lugar desea controlar cada subelemento por separado, devuelva CDRF_NOTIFYSUBITEMDRAW.
  3. Si devolvió CDRF_NOTIFYSUBITEMDRAW en el paso anterior, recibirá una notificación de NM_CUSTOMDRAW para cada subelemento con dwDrawStage establecido en CDDS_SUBITEM | CDDS_ITEMPREPAINT. Para cambiar la fuente o el color de ese subelemento, especifique una nueva fuente o color y devuelva CDRF_NEWFONT.

Para los modos de icono grande, icono pequeño y lista, use el procedimiento siguiente.

  1. La primera notificación NM_CUSTOMDRAW tendrá el miembro dwDrawStage de la estructura NMCUSTOMDRAW asociada establecida en CDDS_PREPAINT. Devuelve CDRF_NOTIFYITEMDRAW.
  2. A continuación, recibirá una notificación de NM_CUSTOMDRAW con dwDrawStage establecido en CDDS_ITEMPREPAINT. Puede cambiar las fuentes o colores de un elemento especificando nuevas fuentes y colores y devolviendo CDRF_NEWFONT. Dado que estos modos no tienen subelementos, no recibirá ninguna notificación adicional NM_CUSTOMDRAW.

Para obtener un ejemplo de un controlador de notificaciones de NM_CUSTOMDRAW vista de lista, consulte Uso de dibujo personalizado.

Conceptual

Uso de Dibujo personalizado

Referencia de dibujo personalizada

Otros recursos

EJEMPLO: CustDTv ilustra el dibujo personalizado en un TreeView (Q248496)