Compartir vía


Uso de Dibujo personalizado

Esta sección contiene ejemplos que muestran cómo implementar el dibujo personalizado.

El fragmento de código siguiente es una parte de un controlador de WM_NOTIFY que muestra cómo controlar las notificaciones de dibujo personalizadas enviadas a un control de vista de lista.

        
LPNMLISTVIEW  pnm  = (LPNMLISTVIEW)lParam;

switch (pnm->hdr.code){
...
case NM_CUSTOMDRAW:

    LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)lParam;

    switch(lplvcd->nmcd.dwDrawStage) {

    case CDDS_PREPAINT :
        return CDRF_NOTIFYITEMDRAW;

    case CDDS_ITEMPREPAINT:
        SelectObject(lplvcd->nmcd.hdc,
                     GetFontForItem(lplvcd->nmcd.dwItemSpec,
                                    lplvcd->nmcd.lItemlParam) );
        lplvcd->clrText = GetColorForItem(lplvcd->nmcd.dwItemSpec,
                                          lplvcd->nmcd.lItemlParam);
        lplvcd->clrTextBk = GetBkColorForItem(lplvcd->nmcd.dwItemSpec,
                                              lplvcd->nmcd.lItemlParam);

/* At this point, you can change the background colors for the item
and any subitems and return CDRF_NEWFONT. If the list-view control
is in report mode, you can simply return CDRF_NOTIFYSUBITEMDRAW
to customize the item's subitems individually */
        ...

        return CDRF_NEWFONT;
    //  or return CDRF_NOTIFYSUBITEMDRAW;

    case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
        SelectObject(lplvcd->nmcd.hdc,
                     GetFontForSubItem(lplvcd->nmcd.dwItemSpec,
                                       lplvcd->nmcd.lItemlParam,
                                       lplvcd->iSubItem));
        lplvcd->clrText = GetColorForSubItem(lplvcd->nmcd.dwItemSpec,
                                             lplvcd->nmcd.lItemlParam,
                                             lplvcd->iSubItem));
        lplvcd->clrTextBk = GetBkColorForSubItem(lplvcd->nmcd.dwItemSpec,
                                                 lplvcd->nmcd.lItemlParam,
                                                 lplvcd->iSubItem));

/* This notification is received only if you are in report mode and
returned CDRF_NOTIFYSUBITEMDRAW in the previous step. At
this point, you can change the background colors for the
subitem and return CDRF_NEWFONT.*/
        ...
        return CDRF_NEWFONT;    
    }
...
}
        

La primera notificación NM_CUSTOMDRAW tiene el miembro dwDrawStage de la estructura NMCUSTOMDRAW establecida en CDDS_PREPAINT. El controlador devuelve CDRF_NOTIFYITEMDRAW para indicar que desea modificar uno o varios elementos individualmente.

Si CDRF_NOTIFYITEMDRAW se devolvió en el paso anterior, la siguiente notificación de NM_CUSTOMDRAW tiene dwDrawStage establecido en CDDS_ITEMPREPAINT. El controlador recupera los valores de color y fuente actuales. En este momento, puede especificar nuevos valores para los modos de icono pequeño, icono grande y lista. Si el control está en modo de informe, también puede especificar nuevos valores que se aplicarán a todos los subelementos del elemento. Si ha cambiado algo, devuelva CDRF_NEWFONT. Si el control está en modo de informe y desea controlar los subelementos individualmente, devuelva CDRF_NOTIFYSUBITEMDRAW.

La notificación final solo se envía si el control está en modo de informe y devolvió CDRF_NOTIFYSUBITEMDRAW en el paso anterior. El procedimiento para cambiar fuentes y colores es el mismo que ese paso, pero solo se aplica a un único subelemento. Devuelve CDRF_NEWFONT para notificar al control si se cambió el color o la fuente.

Conceptual

Acerca del dibujo personalizado

Referencia de dibujo personalizada

Otros recursos

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