TVirtualStringTree-как изменить кнопки [ -] / [ + ]?

как я могу использовать свои собственные кнопки (изображения) для замены по умолчанию [-]/[+] кнопки в VST?
Вместо этого я хочу использовать стрелки (enter image description here, enter image description here), но и для поддержки режима RTL bidi (enter image description here, enter image description here).

edit: я знаю о bsTriangle стиль (ButtonStyle). Он не уважает RTL. Я хочу использовать свои собственные изображения.

3 ответов


разве эти изображения обычно не в Windows Vista и Windows 7? Элемент управления tree должен автоматически получать их в этих системах при включении тем.

простой способ получить что-то близкое к этому-просто установить ButtonStyle свойство bsTriangle. Однако это будут не совсем изображения, показанные в вопросе. Стрелка " минус "будет указывать прямо вниз, а не по диагонали, а Стрелка" Плюс " будет сплошной, а не контур.

вы можете предоставить свой собственный рисунок. Измените ресурсы VT_XPBUTTONMINUS и VT_XPBUTTONPLUS на любые изображения и установите ButtonFillMode свойство fmShaded.

Я не вижу возможности для изменения изображения на основе режима bi-di, хотя. Можно создать класс-потомок, который переопределяет PaintNodeButton, а затем нарисовать все, что вы хотите. Скопируйте код размещения из родительского класса.


IIRC вы получите его, включив toUseExplorerTheme в PaintOptions. Однако это также изменяет внешний вид выбора (к лучшему 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

Edit: к сожалению, параметр Form1.BiDiMode to bdRightToLeft дает screenshot with wrong triangular markers на моем немецком Windows 7. Я не знаю, работает ли это лучше на арабском или иврите системный.


посмотреть ButtonStyle собственность. Не уверен, что он уважает режим RTL bidi.