2012-05-17 154 views
6

如何使用我自己的自定义按钮(图像)替换VST中的默认[-]/[+]按钮?
我想用箭头代替(enter image description here,enter image description here),但也支持RTL双向模式(enter image description here,enter image description here)。TVirtualStringTree - 如何更改[ - ]/[+]按钮?

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

回答

9

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

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

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

虽然我没有看到基于bi-di模式改变图像的功能。你可以创建一个覆盖PaintNodeButton的后代类,然后绘制任何你想要的。从父类复制放置代码。

+0

谢谢先生。这似乎是重写'PaintNodeButton'是唯一的选择。 – ZigiZ

1

查看ButtonStyle属性。不确定它是否尊重RTL双向模式思想。

+0

我知道'bsTriangle'风格。它不尊重RTL。我想用我自己的形象。 – ZigiZ

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.BiDiModebdRightToLeft产量 screenshot with wrong triangular markers 在我的德语Windows 7上。我不知道这是否对阿拉伯语或希伯来语系统更好。

+0

你正在使用什么版本的VirtualTrees? – ZigiZ

+1

@ZigiZ:位于VirtualTrees.pas顶部的联系人说“版本5.0.0”。 –