TVirtualStringTree — как рисовать столбцы заголовков без использования OwnerDraw?

Я хотел бы рисовать в столбцах заголовков TVirtualStringTree, но у меня проблема. Мне нужно, чтобы столбцы дерева использовали его «отрисовку по умолчанию» и добавляли к нему свою собственную графику.

Если я использую hoOwnerDraw с Header.Options и использую OnHeaderDraw, мне нужно полностью рисовать столбцы самостоятельно (что нехорошо).

Есть OnAdvancedHeaderDraw, на который я надеюсь (см. пример):

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

Если я использую OnAdvancedHeaderDraw (я также должен использовать OnHeaderDrawQueryElements), я получаю то, что хочу, но мне нужно заменить по крайней мере один элемент в OnHeaderDrawQueryElements (т.е. hpeBackground/hpeDropMark/ hpeHeaderGlyph/hpeSortGlyph/hpeText) и сам нарисую в событии OnAdvancedHeaderDraw.

Когда, например, я возвращаю элемент hpeSortGlyph, возвращение ShowSortGlyph := True в var PaintInfo: THeaderPaintInfo из OnAdvancedHeaderDraw не имеет никакого значения, а глиф сортировки не закрашивается, что означает, что я должен закрасить его сам. Поскольку DefaultDrawSortGlyph нет, мне нужно заново изобретать, так сказать, и копировать большие части кода из исходного кода VT только для того, чтобы нарисовать глиф сортировки :/

Мне нужны/используются все элементы в столбцах, я просто хочу добавить свою собственную графику поверх графики столбца по умолчанию (стрелка раскрывающегося списка), не заменяя ни один из них. Как избежать такого поведения? Можно ли рисовать поверх существующего столбца без исправления источника?

Надеюсь, мой вопрос понятен.


person zig    schedule 30.05.2017    source источник
comment
Нет, в настоящее время это невозможно. Но в качестве простой модификации может быть, например. расширение THeaderPaintElements, например, hpeOverlay, а строка ActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark, hpeText]; меняется на ActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark, hpeText, hpeOverlay];. Затем вы должны запросить только элемент hpeOverlay, все остальные будут окрашены по умолчанию, а событие OnAdvancedHeaderDraw будет запущено только для этого нового элемента.   -  person Victoria    schedule 30.05.2017
comment
@Victoria, Нет, сейчас это невозможно - я уже пришел к такому же выводу. Я добавил новое событие OnAdvancedHeaderDrawEx, которое не зависит от флага hoOwnerDraw. Но мне очень нравится ваше простое решение (которое, я думаю, должно быть добавлено в следующих версиях). Не могли бы вы опубликовать ответ, и я приму :)   -  person zig    schedule 31.05.2017
comment
Я только не понимаю, почему PaintInfo передается как var в событие, если я не могу его изменить.   -  person zig    schedule 31.05.2017
comment
Мне тоже нравится решение Виктории, и я открыл для него вопрос: github.com/Virtual- TreeView/Virtual-TreeView/issues/722   -  person Joachim Marder    schedule 31.05.2017


Ответы (1)


Начиная с версии VT 7.0 вы можете запрашивать и рисовать для элемента рисования заголовка hpeOverlay.


Для более старых версий:

В настоящее время нет простого способа закрасить полностью отрендеренный столбец заголовка (VT 6.7.0). Но простая модификация исходного кода может быть, например. расширение флага THeaderPaintElements, установленного, например, hpeOverlay, и строки:

ActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark,
  hpeText];

изменить на:

ActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark,
  hpeText, hpeOverlay];

Затем вы можете запросить только элемент hpeOverlay в событии OnHeaderDrawQueryElements, все элементы будут окрашены по умолчанию, и будет запущено событие OnAdvancedHeaderDraw. только для этого нового элемента.

Главный участник Йоахим Мардер подал проблему с улучшением добавить такое расширение, которое было зафиксировано в репозитории, поэтому текущая версия VT поддерживает предлагаемое расширение.

person Victoria    schedule 31.05.2017