我有一个将Header.Column设置为taLeftJustify
的VirtualStringTree(默认)。
有没有办法将该列的单元格/节点设置为taRightJustify
,以便节点将向右对齐,但标题列文本将在左侧对齐?
这是我想要的结果(在第1列中):
我正在使用相当旧的VT版本4.5.5
答案 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;