使用自定义绘图

本节包含演示如何实现自定义绘制的示例。

以下代码片段是 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 通知将 NMCUSTOMDRAW 结构的 dwDrawStage 成员设置为 CDDS_PREPAINT。 处理程序返回 CDRF_NOTIFYITEMDRAW 表示希望单独修改一个或多个项目。

如果在上一步中返回了 CDRF_NOTIFYITEMDRAW,则下一个 NM_CUSTOMDRAW 通知的 dwDrawStage 就会被设置为 CDDS_ITEMPREPAINT。 处理程序会检索当前的颜色和字体值。 此时,可以为小图标、大图标和列表模式指定新的值。 如果控件处于报告模式,则还可以指定适用于该项目的所有子项的新值。 如果进行了任何更改,则会返回 CDRF_NEWFONT。 如果控件处于报告模式并且希望单独处理子项目,则返回 CDRF_NOTIFYSUBITEMDRAW

只有当控件处于报告模式,并且在上一步中返回了 CDRF_NOTIFYSUBITEMDRAW 时,才会发送最终通知。 更改字体和颜色的步骤与该步骤相同,但只适用于单个子项目。 返回 CDRF_NEWFONT,以通知控件是否更改了颜色或字体。

Conceptual

关于自定义绘图

自定义绘图参考

其他资源

示例:CustDTv 演示 TreeView 中的自定义绘图 (Q248496)