VirtualStringTree - 垂直方向的多行节点和中心文本

时间:2011-08-10 03:25:18

标签: delphi vertical-alignment virtualtreeview tvirtualstringtree

如果VirtualStringTree中的节点是多行(Node.States中的vsMultiline),那么如何为该节点中的所有列(多行列除外)垂直居中?

我已尝试使用OnBeforeCellPaint(使用TargetCanvas.TextOut()),但这根本不会绘制文本。默认情况下,多行节点的文本始终绘制在节点的顶部。

(对于非多线节点,文本垂直居中绘制)。

2 个答案:

答案 0 :(得分:3)

使用DrawText(..)

尝试

您可以在其上添加文本对齐方式,例如左侧,右侧,顶部,中间等。

使用Cellrect作为Rect。

在你的情况下,我认为它在OnDrawtext上可行,设置DefaultText:= False;

答案 1 :(得分:2)

感谢XBasic3000,我能够提出这个解决方案,几乎涵盖了所有可能的组合:

procedure TForm1.TreeDrawText(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; const Text: WideString; const CellRect: TRect;
  var DefaultDraw: Boolean);
var DrawFormat : Cardinal;
R : TRect;
s : WideString;
NodeWidth,EllipsisWidth : Integer;
Size: TSize;
begin
     if not (Column in [yourmultilinecolumns]) then
     begin
          DefaultDraw := False;
          R := CellRect;
          GetTextExtentPoint32W(TargetCanvas.Handle, PWideChar(Text), Length(Text), Size);
          NodeWidth := Size.cx + 2 * Tree.TextMargin;
          GetTextExtentPoint32W(TargetCanvas.Handle, '...', 3, Size);
          EllipsisWidth := Size.cx;
          if ((NodeWidth - 2 * Tree.TextMargin) > R.Right - R.Left) then
               s := EllipseString(TargetCanvas.Handle, Text, R.Right - R.Left, EllipsisWidth)
          else s := Text;
          DrawFormat := DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE;
          Windows.DrawTextW(TargetCanvas.Handle, PWideChar(s), Length(s), R, DrawFormat);
     end;
end;

EllipseString()方法与VirtualTrees.pas中的VirtualTrees.ShortenString()非常相似。

唯一的问题是无法在其他列上绘制多行文字。您必须指定multilinecolumns集,因此无法绘制多行和垂直居中。