カスタム描画の使用

このセクションには、カスタム描画を実装する方法を示す例が含まれます。

次のコード フラグメントは、リスト ビュー コントロールに送信されるカスタム描画通知を処理する方法を示す、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 に設定されています。 ハンドラーは、1 つ以上の項目を個別に変更することを示す CDRF_NOTIFYITEMDRAW を返します。

前の手順で CDRF_NOTIFYITEMDRAW が返された場合、次の NM_CUSTOMDRAW 通知では dwDrawStageCDDS_ITEMPREPAINT に設定されます。 ハンドラーは、現在の色とフォントの値を取得します。 この時点で、小さいアイコン、大きいアイコン、リスト モードに新しい値を指定できます。 コントロールがレポート モードの場合、アイテムのすべてのサブ項目に適用される新しい値を指定することもできます。 何かを変更した場合、CDRF_NEWFONT を返します。 コントロールがレポート モードで、サブ項目を個別に処理する場合、CDRF_NOTIFYSUBITEMDRAW を返します。

最後の通知は、コントロールがレポート モードになっていて、前の手順で CDRF_NOTIFYSUBITEMDRAW を返した場合のみ送信されます。 フォントと色を変更する手順はその手順と同じですが、単一のサブ項目にのみ適用されます。 色またはフォントが変更されたかどうかをコントロールに通知する CDRF_NEWFONT を返します。

Conceptual

カスタム描画について

カスタム描画リファレンス

その他のリソース

サンプル: CustDTv は TreeView でのカスタム描画を示す (Q248496)