Sdílet prostřednictvím


Použití vlastního kreslení

Tato část obsahuje příklady, které ukazují, jak implementovat vlastní kreslení.

Následující fragment kódu je část obslužné rutiny WM_NOTIFY, která ukazuje, jak zpracovat vlastní oznámení kreslení posílaná ovládacímu prvku 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;    
    }
...
}
        

První oznámení NM_CUSTOMDRAW má člen dwDrawStage struktury NMCUSTOMDRAW nastavený na CDDS_PREPAINT. Obslužná rutina vrátí CDRF_NOTIFYITEMDRAW označující, že chce upravit jednu nebo více položek jednotlivě.

Pokud bylo v předchozím kroku vráceno CDRF_NOTIFYITEMDRAW, další oznámení NM_CUSTOMDRAWdwDrawStage nastaveno na CDDS_ITEMPREPAINT. Obslužná rutina načte aktuální barvy a hodnoty písma. V tomto okamžiku můžete zadat nové hodnoty pro malé ikony, velké ikony a režimy seznamu. Pokud je ovládací prvek v režimu sestavy, můžete také zadat nové hodnoty, které budou platit pro všechny dílčí položky. Pokud jste něco změnili, vraťte CDRF_NEWFONT. Pokud je ovládací prvek v režimu sestavy a chcete zpracovat dílčí položky jednotlivě, vraťte CDRF_NOTIFYSUBITEMDRAW.

Konečné oznámení se odešle pouze v případě, že je ovládací prvek v režimu sestavy a že jste v předchozím kroku vrátili CDRF_NOTIFYSUBITEMDRAW. Postup pro změnu písem a barev je stejný jako tento krok, ale vztahuje se pouze na jeden dílčí bod. Vraťte CDRF_NEWFONT, abyste ovládacímu prvku oznámili, jestli se změnila barva nebo písmo.

koncepční

O vlastním kreslení

Odkaz na vlastní kreslení

další prostředky

SAMPLE: CustDTv znázorňuje vlastní kreslení v TreeView (Q248496)