TVirtualStringTree - 如何在不使用OwnerDraw的情况下在标题列上绘图?

时间:2017-05-30 07:16:54

标签: delphi virtualtreeview tvirtualstringtree

我想在TVirtualStringTree标题列上绘图,但我遇到了问题。我需要树列来使用它的“默认绘图”并在其上添加我自己的图形。

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

OnAdvancedHeaderDraw似乎是我希望的(see example):

  

在为标题启用所有者绘制并将列设置为时使用   所有者绘制模式。但只有在OnHeaderDrawQueryElements返回时   应用程序要绘制的至少一个元素。

如果我使用OnAdvancedHeaderDraw(我还必须使用OnHeaderDrawQueryElements)我得到了我想要的东西但是我需要替换至少OnHeaderDrawQueryElements中的一个元素(即hpeBackground / hpeDropMark / hpeHeaderGlyph / hpeSortGlyph / hpeText)并在{{1}中自行绘制事件。

例如,当我返回OnAdvancedHeaderDraw元素时,在hpeSortGlyph的{​​{1}}中返回ShowSortGlyph := True没有任何区别,并且未绘制排序字形,这意味着我必须自己画画。由于没有var PaintInfo: THeaderPaintInfo我需要重新发明才能发挥作用,可以这么说,并从VT源复制大部分代码只是为了绘制排序字形:/

我使用/需要列中的所有元素,我只想在默认列图形(下拉箭头)之上添加我自己的图形而不替换其中一个。我该如何避免这种行为?是否可以在不修补源的情况下在存在列的顶部绘制?

我希望我的问题很明确。

1 个答案:

答案 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支持提议的增强功能。