VirtualStringTree - многострочные узлы и центральный текст по вертикали
Если узел в VirtualStringTree является многострочным (vsMultiline в Node.States), то как я могу центрировать текст по вертикали для всех столбцов (кроме многострочного столбца) в этом узле?
Я пытался использовать OnBeforeCellPaint
(с помощью TargetCanvas.TextOut()
) но это не рисует текст вообще. По умолчанию текст для многострочного узла всегда отображается в верхней части узла.
(Для не многострочных узлов текст закрашивается по центру).
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.ShortenString() в VirtualTrees.pas.
Единственная проблема - невозможность рисовать многострочный текст в других столбцах. Необходимо указать набор многострочных столбцов, чтобы не было возможности рисовать многострочные и вертикально центрированные.
Попробуйте, используя DrawText(..)
Вы можете добавить выравнивание текста по нему, например, слева, справа, сверху, по центру и т. д.
используйте Cellrect для Rect.
в вашем случае я думаю, что это работает на OnDrawtext, установите DefaultText:= False;