Я хотел бы рисовать в столбцах заголовков 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 только для того, чтобы нарисовать глиф сортировки :/
Мне нужны/используются все элементы в столбцах, я просто хочу добавить свою собственную графику поверх графики столбца по умолчанию (стрелка раскрывающегося списка), не заменяя ни один из них. Как избежать такого поведения? Можно ли рисовать поверх существующего столбца без исправления источника?
Надеюсь, мой вопрос понятен.
THeaderPaintElements
, например,hpeOverlay
, а строкаActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark, hpeText];
меняется наActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark, hpeText, hpeOverlay];
. Затем вы должны запросить только элементhpeOverlay
, все остальные будут окрашены по умолчанию, а событиеOnAdvancedHeaderDraw
будет запущено только для этого нового элемента. - person Victoria   schedule 30.05.2017OnAdvancedHeaderDrawEx
, которое не зависит от флагаhoOwnerDraw
. Но мне очень нравится ваше простое решение (которое, я думаю, должно быть добавлено в следующих версиях). Не могли бы вы опубликовать ответ, и я приму :) - person zig   schedule 31.05.2017PaintInfo
передается какvar
в событие, если я не могу его изменить. - person zig   schedule 31.05.2017