Udostępnij przez


Korzystanie z niestandardowego rysowania

Ta sekcja zawiera przykłady demonstrujące sposób implementowania niestandardowego rysowania.

Poniższy fragment kodu jest częścią procedury obsługi WM_NOTIFY, który ilustruje sposób obsługi niestandardowych powiadomień rysowania wysyłanych do kontrolki widoku listy.

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

Pierwsze powiadomienie NM_CUSTOMDRAW ma członek dwDrawStage struktury NMCUSTOMDRAW ustawiony na CDDS_PREPAINT. Obsługujący zwraca CDRF_NOTIFYITEMDRAW, aby wskazać, że chce zmodyfikować jeden lub więcej elementów osobno.

Jeśli CDRF_NOTIFYITEMDRAW została zwrócona w poprzednim kroku, następne powiadomienie NM_CUSTOMDRAW ma dwDrawStage ustawione na CDDS_ITEMPREPAINT. Procedura obsługi pobiera aktualne wartości koloru i czcionki. Na tym etapie można określić nowe wartości dla małych ikon, dużych ikon i trybów listy. Jeśli kontrolka jest w trybie raportu, możesz również określić nowe wartości, które będą stosowane do wszystkich podwitryk elementu. Jeśli coś się zmieniło, wróć CDRF_NEWFONT. Jeśli kontrola jest w trybie raportu i chcesz zarządzać elementami podrzędnymi indywidualnie, zwróć CDRF_NOTIFYSUBITEMDRAW.

Ostateczne powiadomienie jest wysyłane tylko wtedy, gdy kontrolka jest w trybie raportu i zwróciłeś CDRF_NOTIFYSUBITEMDRAW w poprzednim kroku. Procedura zmieniania czcionek i kolorów jest taka sama jak w tym kroku, ale dotyczy tylko pojedynczego subitem. Zwróć CDRF_NEWFONT, aby powiadomić kontrolkę o zmianie koloru lub czcionki.

Konceptualny