Compartilhar via


Como usar desenho personalizado

Esta seção contém exemplos que demonstram como implementar o desenho personalizado.

O fragmento de código a seguir é uma parte de um manipulador de WM_NOTIFY que ilustra como manipular notificações de desenho personalizadas enviadas a um controle de exibição 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;    
    }
...
}
        

A primeira notificação NM_CUSTOMDRAW tem o membro dwDrawStage da estrutura NMCUSTOMDRAW definido como CDDS_PREPAINT. O manipulador retorna CDRF_NOTIFYITEMDRAW para indicar que deseja modificar um ou mais itens individualmente.

Se CDRF_NOTIFYITEMDRAW foi retornado na etapa anterior, a próxima notificação NM_CUSTOMDRAW dwDrawStage foi definida como CDDS_ITEMPREPAINT. O manipulador recupera a cor atual e os valores de fonte. Neste ponto, você pode especificar novos valores para ícones pequenos, ícones grandes e modos de lista. Se o controle estiver no modo de relatório, você também poderá especificar novos valores que serão aplicados a todos os subitens do item. Se você mudou alguma coisa, devolva CDRF_NEWFONT. Se o controle estiver no modo de relatório e você quiser manipular os subitens individualmente, retorne CDRF_NOTIFYSUBITEMDRAW.

A notificação final só será enviada se o controle estiver no modo de relatório e você CDRF_NOTIFYSUBITEMDRAW retornou na etapa anterior. O procedimento para alterar fontes e cores é o mesmo dessa etapa, mas só se aplica a um único subitem. Retorne CDRF_NEWFONT para notificar o controle se a cor ou a fonte foi alterada.

Conceitual

Sobre o Custom Draw

Referência de desenho personalizado

Outros recursos

EXEMPLO: CustDTv ilustra o desenho personalizado em um TreeView (Q248496)