【发布时间】:2018-01-16 09:38:02
【问题描述】:
我有一个 Header.Column 设置为 taLeftJustify(默认)的 VirtualStringTree。
有没有办法将该列的单元格/节点设置为taRightJustify,以便节点向右对齐,但标题列文本向左对齐?
这是我想要的结果(在第 1 列):
我使用的是相当旧的 VT 版本 4.5.5
【问题讨论】:
标签: delphi virtualtreeview tvirtualstringtree
我有一个 Header.Column 设置为 taLeftJustify(默认)的 VirtualStringTree。
有没有办法将该列的单元格/节点设置为taRightJustify,以便节点向右对齐,但标题列文本向左对齐?
这是我想要的结果(在第 1 列):
我使用的是相当旧的 VT 版本 4.5.5
【问题讨论】:
标签: delphi virtualtreeview tvirtualstringtree
对于列标题对齐使用:
Header.Columns[x].CaptionAlignment := taLeftJustify;
对于节点对齐:
Header.Columns[x].Alignment := taRightJustify;
x = 你的专栏
【讨论】:
CaptionAlignment 属性。但是在查看 5.3.0 版本后,我相信这是正确的答案,所以我会接受它。如果我使用的是较新的 VT 版本(目前我不能),我会自己弄清楚 :) 谢谢。
在我的旧 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;
【讨论】: