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;

Другие вопросы по тегам