TVirtualStringTree - 如何在不使用 OwnerDraw 的情况下绘制 header 列?

TVirtualStringTree - How to draw on header columns without using OwnerDraw?

我想在 TVirtualStringTree header 列上绘图,但我遇到了问题。我需要树列来使用它 "default draw" 并在上面添加我自己的图形。

如果我使用 hoOwnerDrawHeader.Options 并使用 OnHeaderDraw,我需要自己完全绘制列(这不好)。

有个OnAdvancedHeaderDraw好像是我希望的():

Used when owner draw is enabled for the header and a column is set to owner draw mode. But only if OnHeaderDrawQueryElements returns at least one element to be drawn by the application.

如果我使用OnAdvancedHeaderDraw(我也必须使用OnHeaderDrawQueryElements)我得到了我想要的,但是我需要替代 at-least OnHeaderDrawQueryElements 中的一个元素(即 hpeBackground/hpeDropMark/hpeHeaderGlyph/hpeSortGlyph/hpeText ) 并在 OnAdvancedHeaderDraw 事件中自己绘制。

例如我return hpeSortGlyph 元素时, returning ShowSortGlyph := Truevar PaintInfo: THeaderPaintInfoOnAdvancedHeaderDraw 不有什么不同,而且那种字形没有画,这意味着我必须自己画它。由于没有 DefaultDrawSortGlyph 我需要重新发明才能幸福,可以这么说,并从 VT 源代码复制大部分代码只是为了绘制排序字形:/

我use/need列中的所有元素,我只是想添加我自己的图形在默认列图形(下拉箭头)之上而不替换其中之一。我怎样才能避免这种行为?是否可以在不修补源代码的情况下在现有列的顶部绘制?

我希望我的问题很清楚。

从 VT 7.0 开始,您可以查询和绘制 hpeOverlay header 绘制元素。


旧版本:

目前没有简单的方法在完全呈现的 header 列上绘制 (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 支持建议的增强。