Verwenden von benutzerdefiniertem Zeichnen

Dieser Abschnitt enthält Beispiele, die veranschaulichen, wie benutzerdefiniertes Zeichnen implementiert wird.

Das folgende Codefragment ist ein Teil eines WM_NOTIFY-Handlers , der veranschaulicht, wie benutzerdefinierte Zeichnungsbenachrichtigungen behandelt werden, die an ein Listenansichtssteuerelement gesendet werden.

        
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;    
    }
...
}
        

Bei der ersten NM_CUSTOMDRAW Benachrichtigung ist der dwDrawStage-Member der NMCUSTOMDRAW-Struktur auf CDDS_PREPAINT festgelegt. Der Handler gibt CDRF_NOTIFYITEMDRAW zurück, um anzugeben, dass er ein oder mehrere Elemente einzeln ändern möchte.

Wenn im vorherigen Schritt CDRF_NOTIFYITEMDRAW zurückgegeben wurde, ist für die nächste NM_CUSTOMDRAW Benachrichtigung dwDrawStage auf CDDS_ITEMPREPAINT festgelegt. Der Handler ruft die aktuellen Farb- und Schriftartwerte ab. An diesem Punkt können Sie neue Werte für die Modi "Kleines Symbol", "großes Symbol" und "Listen" angeben. Wenn sich das Steuerelement im Berichtsmodus befindet, können Sie auch neue Werte angeben, die für alle Unterelemente des Elements gelten. Wenn Sie etwas geändert haben, geben Sie CDRF_NEWFONT zurück. Wenn sich das Steuerelement im Berichtsmodus befindet und Sie die Unterelemente einzeln behandeln möchten, geben Sie CDRF_NOTIFYSUBITEMDRAW zurück.

Die endgültige Benachrichtigung wird nur gesendet, wenn sich das Steuerelement im Berichtsmodus befindet und Sie im vorherigen Schritt CDRF_NOTIFYSUBITEMDRAW zurückgegeben haben. Das Verfahren zum Ändern von Schriftarten und Farben ist dasselbe wie in diesem Schritt, gilt jedoch nur für ein einzelnes Unterelement. Geben Sie CDRF_NEWFONT zurück, um das Steuerelement zu benachrichtigen, wenn die Farbe oder Schriftart geändert wurde.

Konzept

Informationen zum benutzerdefinierten Zeichnen

Referenz zum benutzerdefinierten Zeichnen

Andere Ressourcen

SAMPLE: CustDTv Illustrates Custom Draw in a TreeView (Q248496)