本部分包含演示如何实现自定义绘图的示例。
以下代码片段是 WM_NOTIFY 处理程序的一部分,演示如何处理发送到列表视图控件的自定义绘图通知。
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;
}
...
}
第一 个NM_CUSTOMDRAW 通知的 dwDrawStage 成员的 NMCUSTOMDRAW 结构设置为 CDDS_PREPAINT。 处理程序返回 CDRF_NOTIFYITEMDRAW 以指示它希望单独修改一个或多个项。
如果在上一步中返回 了CDRF_NOTIFYITEMDRAW ,则下一 个NM_CUSTOMDRAW 通知将 dwDrawStage 设置为 CDDS_ITEMPREPAINT。 处理程序检索当前颜色和字体值。 此时,可以为小型图标、大型图标和列表模式指定新值。 如果控件处于报表模式,还可以指定将应用于项目的所有子项的新值。 如果已更改任何内容,请返回 CDRF_NEWFONT。 如果控件处于报表模式并且想要单独处理子项,则返回 CDRF_NOTIFYSUBITEMDRAW。
仅当控件处于报表模式并且你在上一步中返回 CDRF_NOTIFYSUBITEMDRAW 时,才会发送最终通知。 更改字体和颜色的过程与此步骤相同,但它仅适用于单个子项。 返回 CDRF_NEWFONT ,以在颜色或字体更改时通知控件。