如果VirtualStringTree中的节点是多行(Node.States中的vsMultiline),那么如何为该节点中的所有列(多行列除外)垂直居中?
我已尝试使用OnBeforeCellPaint
(使用TargetCanvas.TextOut()
),但这根本不会绘制文本。默认情况下,多行节点的文本始终绘制在节点的顶部。
(对于非多线节点,文本垂直居中绘制)。
答案 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集,因此无法绘制多行和垂直居中。