Использование пользовательского рисования

В этом разделе содержатся примеры, демонстрирующие реализацию пользовательской рисования.

Следующий фрагмент кода является частью обработчика 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 , чтобы уведомить элемент управления о том, был ли изменен цвет или шрифт.

Концептуальной

Сведения о пользовательском рисовании

Справочник по пользовательскому рисованию

Другие ресурсы

ПРИМЕР: CustDTv иллюстрирует настраиваемое рисование в treeView (Q248496)