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

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

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

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

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

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

Структура Где используется
NMCUSTOMDRAW Элементы управления "Перебар", "Панель отслеживания" и "Заголовок"
NMLVCUSTOMDRAW Элементы управления представлением списка
NM ТБ CUSTOMDRAW Элементы управления панели инструментов
NMTTCUSTOMDRAW Элементы управления подсказками
NMTVCUSTOMDRAW Элементы управления "Дерево"

 

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

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

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

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

 

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

Значения этапа рисования для конкретного элемента Description
CDDS_ITEMPREPAINT Перед рисованием элемента.
CDDS_ITEMPOSTPAINT После рисования элемента.
CDDS_ITEMPREERASE Перед удалением элемента.
CDDS_ITEMPOSTERASE После удаления элемента.
CDDS_SUBITEM Common Control Versions 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, "", "");

Настраиваемое рисование с элементами управления "Представление списка" и "Представление дерева"

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

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

Настраиваемое рисование с элементами управления "Представление списка"

Так как элементы управления представления списка имеют вложенные элементы и несколько режимов отображения, вам потребуется обрабатывать уведомление 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)