TVirtualStringTree - 如何在不使用 OwnerDraw 的情况下绘制 header 列?
TVirtualStringTree - How to draw on header columns without using OwnerDraw?
我想在 TVirtualStringTree
header 列上绘图,但我遇到了问题。我需要树列来使用它 "default draw" 并在上面添加我自己的图形。
如果我使用 hoOwnerDraw
和 Header.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 := True
在 var PaintInfo: THeaderPaintInfo
的 OnAdvancedHeaderDraw
不有什么不同,而且那种字形没有画,这意味着我必须自己画它。由于没有 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 支持建议的增强。
我想在 TVirtualStringTree
header 列上绘图,但我遇到了问题。我需要树列来使用它 "default draw" 并在上面添加我自己的图形。
如果我使用 hoOwnerDraw
和 Header.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 := True
在 var PaintInfo: THeaderPaintInfo
的 OnAdvancedHeaderDraw
不有什么不同,而且那种字形没有画,这意味着我必须自己画它。由于没有 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 支持建议的增强。