Поделиться через


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

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

  • Элементы управления заголовками
  • Элементы управления представлением списка
  • Элементы управления арматурой
  • Элементы управления панели инструментов
  • Элементы управления подсказками
  • Элементы управления ползунком
  • Элементы управления в виде дерева

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

Все общие элементы управления, поддерживающие кастомную отрисовку, отправляют коды уведомлений NM_CUSTOMDRAW в определенные моменты во время операций рисования. Эти коды уведомлений описывают операции рисования, которые применяются ко всему элементу управления, а также операции рисования, относящиеся к элементам в элементе управления. Как и многие коды уведомлений, уведомления NM_CUSTOMDRAW отправляются как WM_NOTIFY сообщения.

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

Структура Используется кем-либо
NMCUSTOMDRAW Элементы управления "Rebar", "Трекбар" и "Заголовочная панель"
NMLVCUSTOMDRAW Элементы управления представлением списка
NMTBCUSTOMDRAW Элементы управления панели инструментов
NMTTCUSTOMDRAW Элементы управления подсказками
NMTVCUSTOMDRAW Элементы управления "Дерево"

 

Циклы рисования, этапы рисования и сообщения уведомлений

Как и во всех приложениях Windows, общие элементы управления периодически перерисовываются и стираются на основе сообщений, получаемых от системы или других приложений. Процесс рисования или стирания элемента управления называется циклом краски. Элементы управления, которые поддерживают пользовательскую отрисовку, периодически отправляют коды уведомлений NM_CUSTOMDRAW в течение каждого цикла отрисовки. Этот код уведомлений сопровождается структурой NMCUSTOMDRAW или другой структурой, содержащей структуру NMCUSTOMDRAW в качестве первого элемента.

Одной из частей информации, содержащейся в структуре NMCUSTOMDRAW, является текущий этап цикла закраски. Это называется этап рисования и представлено значением в элементе dwDrawStage структуры. Элемент управления сообщает родительскому элементу о четырех основных этапах рисования. Эти основные или глобальные этапы рисования представлены в структуре следующими значениями флагов (определенными в Commctrl.h).

Глобальные значения этапа рисования Описание
CDDS_PREPAINT Перед началом цикла покраски.
CDDS_POSTPAINT После завершения цикла окрашивания.
CDDS_PREERASE Перед началом цикла очистки.
CDDS_POSTERASE После завершения цикла удаления.

 

Каждое из предыдущих значений можно объединить с флагом CDDS_ITEM, чтобы указать этапы рисования, относящиеся к элементам. Для удобства Commctrl.h содержит следующие значения, относящиеся к элементу.

Значения этапа отрисовки для конкретного элемента Описание
CDDS_ITEMPREPAINT Перед рисованием элемента.
CDDS_ITEMPOSTPAINT После того, как элемент был нарисован.
CDDS_ITEMPREERASE Перед удалением элемента.
CDDS_ITEMPOSTERASE После удаления элемента.
CDDS_SUBITEM Общие версии управления 4.71. Флаг вместе с CDDS_ITEMPREPAINT или CDDS_ITEMPOSTPAINT, если отрисовывается подэлемент. Это будет задано только в том случае, если CDRF_NOTIFYITEMDRAW возвращается из CDDS_PREPAINT.

 

Приложение должно обработать код уведомления NM_CUSTOMDRAW, а затем вернуть определенное значение, которое сообщает элементу управления, что он должен сделать. Дополнительные сведения об этих возвращаемых значениях см. в следующих разделах.

Использование кастомизированных функций рисования

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

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

Подробные сведения разбиты на следующие разделы:

Реагирование на предварительное уведомление о покраске

В начале каждого цикла рисования элемент управления отправляет код уведомления NM_CUSTOMDRAW, указав значение CDDS_PREPAINT в элементе dwDrawStage сопроводительной структуры NM_CUSTOMDRAW. Значение, возвращаемое приложением в это первое уведомление, определяет, как и когда элемент управления отправляет последующие пользовательские уведомления рисования для остальной части этого цикла рисования. Приложение может вернуть сочетание следующих флагов в ответ на первое уведомление.

Возвращаемое значение Эффект
CDRF_DODEFAULT Элемент управления отобразит себя. Он не будет отправлять дополнительные уведомления NM_CUSTOMDRAW для этого цикла покраски. Этот флаг нельзя использовать с любым другим флагом.
CDRF_DOERASE Элемент управления будет рисовать только фон.
CDRF_NEWFONT Приложение указало новый шрифт для элемента; Элемент управления будет использовать новый шрифт. Дополнительные сведения об изменении шрифтов см. в разделе Изменение шрифтов и цветов. Это происходит, когда dwDrawStage равно CDDS_ITEMPREPAINT.
CDRF_NOTIFYITEMDRAW Элемент управления уведомляет родителя о любых операциях рисования, специфичных для элемента. Он отправляет коды уведомлений NM_CUSTOMDRAW до и после рисования элементов. Это происходит, когда dwDrawStage равно CDDS_PREPAINT.
CDRF_NOTIFYPOSTERASE Управляющий элемент уведомляет родительскую компоненту после удаления элемента. Это происходит, когда dwDrawStage равно CDDS_PREPAINT.
CDRF_NOTIFYPOSTPAINT Элемент управления отправляет уведомление NM_CUSTOMDRAW при завершении цикла рисования для всего элемента управления. Это происходит, когда dwDrawStage равно CDDS_PREPAINT.
CDRF_NOTIFYSUBITEMDRAW версии 4.71. Приложение получит уведомление NM_CUSTOMDRAW с dwDrawStage, установленным как CDDS_ITEMPREPAINT | CDDS_SUBITEM, перед прорисовкой каждого подэлемента представления списка. Затем можно указать шрифт и цвет для каждого подэлемента отдельно или возвращать CDRF_DODEFAULT для обработки по умолчанию. Это происходит, когда dwDrawStage равен CDDS_ITEMPREPAINT.
CDRF_SKIPDEFAULT Приложение нарисовало элемент вручную. Элемент управления не будет отображать элемент. Это происходит, когда dwDrawStage равно CDDS_ITEMPREPAINT.
CDRF_SKIPPOSTPAINT Элемент управления не будет рисовать прямоугольник фокуса вокруг объекта.

 

Запрос уведомлений о конкретных элементах

Если ваше приложение возвращает CDRF_NOTIFYITEMDRAW в первоначальное уведомление о пользовательском рисовании до начала, то контрол будет отправлять уведомления для каждого элемента, который он рисует в этот цикл рисования. Эти уведомления, относящиеся к элементам, будут иметь значение CDDS_ITEMPREPAINT в элементе dwDrawStage сопроводительной структуры NMCUSTOMDRAW. Вы можете запросить, чтобы элемент управления отправлял другое уведомление после завершения рисования элемента, возвращая CDRF_NOTIFYPOSTPAINT этим уведомлениям. В противном случае верните CDRF_DODEFAULT, и элемент управления не будет уведомлять родительское окно до начала рисования следующего элемента.

Рисование элемента самостоятельно

Если приложение рисует весь элемент, верните CDRF_SKIPDEFAULT. Это позволяет элементу управления пропускать элементы, которые не нужно рисовать, тем самым уменьшая затраты на систему. Помните, что возврат этого значения означает, что элемент управления не рисует ни одну часть элемента.

Изменение шрифтов и цветов

Ваше приложение может использовать настраиваемое рисование, чтобы изменить шрифт элемента. Просто выберите HFONT в контексте устройства, определённом элементом hdc структуры NMCUSTOMDRAW, связанного с уведомлением о пользовательском рисовании. Поскольку выбранный шрифт может иметь метрики, отличающиеся от шрифта по умолчанию, убедитесь, что бит CDRF_NEWFONT включен в возвращаемое значение для сообщения уведомления. Дополнительные сведения об использовании этой функции см. в примере кода в использование пользовательской отрисовки. Шрифт, указанный приложением, используется для отображения этого элемента, если он не выбран. Настраиваемое рисование не позволяет изменять атрибуты шрифта для выбранных элементов.

Чтобы изменить цвета текста для всех элементов управления, поддерживающих настраиваемое рисование, за исключением представления списка и представления дерева, просто задайте нужный текст и фоновые цвета в контексте устройства, предоставленном в пользовательской структуре уведомлений рисования, с помощью функций SetTextColor и SetBkColor. Чтобы изменить цвета текста в представлении списка или дерева, необходимо поместить нужные значения цветов в членов clrText и clrTextBk структуры NMLVCUSTOMDRAW или NMTVCUSTOMDRAW.

Заметка

До версии 6.0 общих элементов управления панели инструментов игнорируют флаг CDRF_NEWFONT. Версия 6.0 поддерживает флаг CDRF_NEWFONT, и его можно использовать для выбора другого шрифта для панели инструментов. Однако вы не можете изменить цвет панели инструментов, если визуальный стиль активен. Чтобы изменить цвет панели инструментов в версии 6.0, необходимо сначала отключить стили визуальных элементов, вызвав SetWindowTheme и не указывая визуальный стиль.

 

SetWindowTheme (hwnd, "", "");

Настраиваемое рисование с элементами управления List-View и Tree-View

Большинство распространенных элементов управления можно обрабатывать практически так же. Однако элементы управления представления списка и представления дерева имеют некоторые функции, требующие несколько другого подхода к пользовательскому рисованию.

Для версии 5.0эти два элемента управления могут отображать обрезанный текст, если вы измените параметры шрифта и вернете CDRF_NEWFONT. Это поведение необходимо для обратной совместимости с более ранними версиями общих элементов управления. Если вы хотите изменить шрифт для элемента управления 'list-view' или 'tree-view', вы получите лучшие результаты, если отправите сообщение CCM_SETVERSION с параметром wParam, установленным в значение 5, прежде чем добавлять какие-либо элементы в элемент управления. Пример элемента управления TreeView с настраиваемым рисованием приведен в статье базы знаний SAMPLE: CustDTv иллюстрирует настраиваемое рисование в TreeView (Q248496).

Настраиваемое рисование с элементами управления List-View

Так как элементы управления представления списка имеют вложенные элементы и несколько режимов отображения, вам потребуется обрабатывать уведомление NM_CUSTOMDRAW несколько иначе, чем для других распространенных элементов управления.

В режиме отчета используйте следующую процедуру.

  1. В первом уведомлении NM_CUSTOMDRAW в члене dwDrawStage связанной структуры NMCUSTOMDRAW будет задано значение CDDS_PREPAINT. Возврат CDRF_NOTIFYITEMDRAW.
  2. Затем вы получите уведомление NM_CUSTOMDRAW с dwDrawStage установленным на CDDS_ITEMPREPAINT. Если вы указываете новые шрифты или цвета и возвращаете CDRF_NEWFONT, все дочерние элементы элемента будут изменены. Если вы хотите вместо этого обрабатывать каждый подпункт отдельно, вернитесь CDRF_NOTIFYSUBITEMDRAW.
  3. Если вы вернули CDRF_NOTIFYSUBITEMDRAW на предыдущем шаге, вы получите уведомление NM_CUSTOMDRAW для каждого дочернего элемента с dwDrawStage для параметра CDDS_SUBITEM | CDDS_ITEMPREPAINT. Чтобы изменить шрифт или цвет для этого подраздела, укажите новый шрифт или цвет и верните CDRF_NEWFONT.

Для большого значка, небольшого значка и режима списка используйте следующую процедуру.

  1. В первом уведомлении NM_CUSTOMDRAW для члена dwDrawStage связанной структуры NMCUSTOMDRAW будет задано значение CDDS_PREPAINT. Вернуть CDRF_NOTIFYITEMDRAW.
  2. Затем вы получите уведомление NM_CUSTOMDRAW с dwDrawStage, установленным на CDDS_ITEMPREPAINT. Вы можете изменить шрифты или цвета элемента, указав новые шрифты и цвета и возвращая CDRF_NEWFONT. Так как эти режимы не имеют подэлементов, вы не получите никаких дополнительных уведомлений NM_CUSTOMDRAW.

См. раздел Использование пользовательской отрисовкидля примера обработчика уведомлений NM_CUSTOMDRAW представления списка.

Концепт

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

справочник по кастомному рисованию

другие ресурсы

ОБРАЗЕЦ: CustDTv иллюстрирует настраиваемую прорисовку в TreeView (Q248496)