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