使用自定义绘图

本部分包含演示如何实现自定义绘图的示例。

以下代码片段是 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 ,以在颜色或字体更改时通知控件。

Conceptual