【问题标题】:TVirtualStringTree - setting column cells/nodes AlignmentTVirtualStringTree - 设置列单元格/节点对齐
【发布时间】:2018-01-16 09:38:02
【问题描述】:

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

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

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

我使用的是相当旧的 VT 版本 4.5.5

【问题讨论】:

    标签: delphi virtualtreeview tvirtualstringtree


    【解决方案1】:

    对于列标题对齐使用:

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

    对于节点对齐:

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

    x = 你的专栏

    【讨论】:

    • 我的旧 VT 版本 (4.5.5) 没有 CaptionAlignment 属性。但是在查看 5.3.0 版本后,我相信这是正确的答案,所以我会接受它。如果我使用的是较新的 VT 版本(目前我不能),我会自己弄清楚 :) 谢谢。
    • 试图找到这个属性是什么时候实现的,没有运气。无论如何,我很高兴你有解决方案。
    【解决方案2】:

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

    这段代码可能对其他人有帮助,所以我还是会发布它:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多