我想在TVirtualStringTree
标题列上绘图,但我遇到了问题。我需要树列来使用它的“默认绘图”并在其上添加我自己的图形。
如果我将hoOwnerDraw
与Header.Options
一起使用并使用OnHeaderDraw
,我需要自己完全绘制列(这不好)。
OnAdvancedHeaderDraw
似乎是我希望的(see example):
在为标题启用所有者绘制并将列设置为时使用 所有者绘制模式。但只有在OnHeaderDrawQueryElements返回时 应用程序要绘制的至少一个元素。
如果我使用OnAdvancedHeaderDraw
(我还必须使用OnHeaderDrawQueryElements
)我得到了我想要的东西但是我需要替换至少OnHeaderDrawQueryElements
中的一个元素(即hpeBackground
/ hpeDropMark
/ hpeHeaderGlyph
/ hpeSortGlyph
/ hpeText
)并在{{1}中自行绘制事件。
例如,当我返回OnAdvancedHeaderDraw
元素时,在hpeSortGlyph
的{{1}}中返回ShowSortGlyph := True
没有任何区别,并且未绘制排序字形,这意味着我必须自己画画。由于没有var PaintInfo: THeaderPaintInfo
我需要重新发明才能发挥作用,可以这么说,并从VT源复制大部分代码只是为了绘制排序字形:/
我使用/需要列中的所有元素,我只想在默认列图形(下拉箭头)之上添加我自己的图形而不替换其中一个。我该如何避免这种行为?是否可以在不修补源的情况下在存在列的顶部绘制?
我希望我的问题很明确。
答案 0 :(得分:3)
从VT 7.0开始,您可以查询并绘制 hpeOverlay 标题绘制元素。
对于旧版本:
此时无法轻松绘制完全渲染的标题列(VT 6.7.0)。但是源代码的简单修改可能是例如。扩展 THeaderPaintElements 标记,例如 hpeOverlay ,并且行:
ActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark,
hpeText];
更改为:
ActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark,
hpeText, hpeOverlay];
然后,您只需查询 OnHeaderDrawQueryElements 事件中的 hpeOverlay 元素,默认情况下将绘制所有元素, OnAdvancedHeaderDraw 事件只会为这个新元素解雇。
主要撰稿人Joachim Marder提交了enhancement issue来添加此类扩展,该扩展已提交到存储库,因此当前版本的VT支持提议的增强功能。