2

VirtualStringTree のノードが複数行 (Node.States の vsMultiline) の場合、そのノードのすべての列 (複数行の列を除く) のテキストを垂直方向に中央揃えするにはどうすればよいですか?

OnBeforeCellPaint(を使用して)を使用してみましTargetCanvas.TextOut()たが、これはテキストをまったく描画しません。デフォルトでは、複数行ノードのテキストは常にノードの上部に描画されます。

(複数行でないノードの場合、テキストは垂直方向の中央に描画されます)。

4

2 に答える 2

3

DrawText(..)を使用して試してください

左、右、上、中央などのテキストの配置を追加できます。

RectにはCellrectを使用してください。

あなたの場合、OnDrawtextで機能すると思いますが、DefaultText:=Falseを設定してください。

于 2011-08-10T06:04:27.620 に答える
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()と非常によく似ています。

唯一の問題は、他の列に複数行のテキストを描画できないことです。複数行の列セットを指定する必要があるため、複数行を描画して垂直方向に中央に配置することはできません。

于 2011-08-10T07:15:05.620 に答える