TVirtualStringTree - 如何更改[ - ] / [+]按钮?

时间:2012-05-17 14:33:21

标签: delphi virtualtreeview tvirtualstringtree

如何使用我自己的自定义按钮(图像)替换VST中的默认[-] / [+]按钮?
我想改为使用箭头(enter image description hereenter image description here),还支持RTL bidi模式(enter image description hereenter image description here)。

编辑:我知道bsTriangle样式(ButtonStyle)。它不尊重RTL。我想使用自己的自定义图像。

3 个答案:

答案 0 :(得分:9)

这些图像通常不在Windows Vista和Windows 7中吗?当您启用主题时,树控件应自动在这些系统上获取它们。

接近这一点的简单方法是将ButtonStyle属性设置为bsTriangle。但这并不完全是问题中显示的图像。 “减号”箭头将指向正对而不是对角线,“加”箭头将是实心而不是轮廓。

您可以提供自己的位图。将VT_XPBUTTONMINUS和VT_XPBUTTONPLUS资源更改为您想要的任何图像,并将ButtonFillMode属性设置为fmShaded

尽管如此,我认为没有基于bi-di模式更改图像的功能。您可以创建一个覆盖PaintNodeButton的后代类,然后绘制您想要的任何内容。从父类复制放置代码。

答案 1 :(得分:7)

IIRC你可以通过在PaintOptions中包含toUseExplorerTheme来获得它。然而,这也改变了选择外观(更好的IMNSHO),可能更多。

例如,如果我在表单上放置TVirtualStringTree并添加以下事件处理程序:

procedure TForm1.FormCreate(Sender: TObject);
begin
  VT.RootNodeCount := 10;
  VT.TreeOptions.PaintOptions := VT.TreeOptions.PaintOptions + [toUseExplorerTheme];
  VT.OnInitNode := VTInitNode;
  VT.OnInitChildren := VTInitChildren;
end;

procedure TForm1.VTInitChildren(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var ChildCount: Cardinal);
begin
  ChildCount := 3;
end;

procedure TForm1.VTInitNode(Sender: TBaseVirtualTree;
  ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
  Include(InitialStates, ivsHasChildren);
end;

我明白了 screenshot with triangular markers

修改:不幸的是,将Form1.BiDiMode设置为bdRightToLeft会产生 screenshot with wrong triangular markers 在我的德语Windows 7上。我不知道这在阿拉伯语或希伯来语系统上是否更好。

答案 2 :(得分:1)

请参阅ButtonStyle属性。不确定它是否尊重RTL bidi模式。