Utilisation d’un dessin personnalisé

Cette section contient des exemples qui montrent comment implémenter un dessin personnalisé.

Le fragment de code suivant est une partie d’un gestionnaire WM _ Notify qui illustre comment gérer les notifications de dessin personnalisées envoyées à un contrôle List-View.

        
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 première notification _ CUSTOMDRAW nm a le membre DwDrawStage de la structure NMCUSTOMDRAW défini sur CDDS _ prépaint. Le gestionnaire retourne CDRF _ NOTIFYITEMDRAW pour indiquer qu’il souhaite modifier un ou plusieurs éléments individuellement.

Si CDRF _ NOTIFYITEMDRAW a été retourné à l’étape précédente, la notification _ CUSTOMDRAW nm suivante a dwDrawStage définie sur CDDS _ ITEMPREPAINT. Le gestionnaire récupère les valeurs de couleur et de police actuelles. À ce stade, vous pouvez spécifier de nouvelles valeurs pour les modes petite icône, grande icône et liste. Si le contrôle est en mode rapport, vous pouvez également spécifier de nouvelles valeurs qui s’appliqueront à tous les sous-éléments de l’élément. Si vous n’avez rien modifié, retournez CDRF _ NEWFONT. Si le contrôle est en mode rapport et que vous souhaitez gérer les sous-éléments individuellement, retournez CDRF _ NOTIFYSUBITEMDRAW.

La notification finale est envoyée uniquement si le contrôle est en mode rapport et si vous avez retourné CDRF _ NOTIFYSUBITEMDRAW à l’étape précédente. La procédure de modification des polices et des couleurs est la même que celle de cette étape, mais elle ne s’applique qu’à un seul sous-élément. Retournez CDRF _ NEWFONT pour notifier le contrôle si la couleur ou la police a été modifiée.

Conceptuel

À propos du dessin personnalisé

Référence de dessin personnalisée

Autres ressources

EXEMPLE : CustDTv illustre un dessin personnalisé dans un contrôle TreeView (Q248496)