TVirtualStringTree - 设置列单元格/节点对齐

时间:2018-01-16 09:38:03

标签: delphi virtualtreeview tvirtualstringtree

我有一个将Header.Column设置为taLeftJustify的VirtualStringTree(默认)。

有没有办法将该列的单元格/节点设置为taRightJustify,以便节点将向右对齐,但标题列文本将在左侧对齐?

这是我想要的结果(在第1列中):

enter image description here

我正在使用相当旧的VT版本4.5.5

2 个答案:

答案 0 :(得分:5)

对于列标题对齐使用:

Header.Columns[x].CaptionAlignment := taLeftJustify;

和节点对齐:

Header.Columns[x].Alignment := taRightJustify;

x =你的专栏

答案 1 :(得分:4)

在我原来的VT版本中,没有TVirtualTreeColumn.CaptionAlignment,因此我设法使用OnAdvancedHeaderDraw来绘制我自己的列标题。我将第1列设置为taRightJustify并自行处理所需列的文本标题。

此代码可能对其他人有用,所以无论如何我都会发布它:

type
  TVirtualTreeColumnsAccess = class(TVirtualTreeColumns);

procedure TForm1.FormCreate(Sender: TObject);
begin
  VST.Header.Options := VST.Header.Options + [hoOwnerDraw];
  VST.OnHeaderDrawQueryElements := VSTHeaderDrawQueryElements;
  VST.OnAdvancedHeaderDraw := VSTAdvancedHeaderDraw;
end;

procedure TForm1.VSTHeaderDrawQueryElements(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo;
  var Elements: THeaderPaintElements);
begin
  { Use OwnerDraw only for desired column(s)     }
  { other columns drawing will be handled by VST }
  if Assigned(PaintInfo.Column) and (PaintInfo.Column.Index = 1) then
    Elements := [hpeText];
end;

procedure TForm1.VSTAdvancedHeaderDraw(Sender: TVTHeader;
  var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements);
var
  DrawFormat: Cardinal;
  R: TRect;
begin
  { The event will fire only for the desired column(s) }
  if (hpeText in Elements) and Assigned(PaintInfo.Column) then
  with PaintInfo do
  begin
    DrawFormat := DT_LEFT or DT_TOP or DT_NOPREFIX;
    if Column.UseRightToLeftReading then
      DrawFormat := DrawFormat or DT_RTLREADING;

    R := TextRectangle;
    R.Left := PaintRectangle.Left + Column.Margin;

    TVirtualTreeColumnsAccess(Column.Owner).DrawButtonText(
      TargetCanvas.Handle, Column.Text, R,
      IsEnabled,
      IsHoverIndex and (hoHotTrack in Sender.Options)
        and not (tsUseThemes in Sender.Treeview.TreeStates),
      DrawFormat);
  end;
end;