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_CUSTOMDRAW má dwDrawStage 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.
Související témata
-
koncepční
-
další prostředky
-
SAMPLE: CustDTv znázorňuje vlastní kreslení v TreeView (Q248496)