4

固定幅(ピクセル単位)と固定数のテキスト行を使用して、テーブルセルにテキストを描画する必要があります。テキストがセルの長方形でクリップされている場合は、省略記号で終了する必要があります。問題は、テキストの長方形を正しく計算できないことです(または、TextRect / DrawTextプロシージャが正しく機能していないか、わかりません)。

私はテキストの長方形を計算するこの方法を使用しようとしました:

var
  TextRect: TRect;
  tm: TEXTMETRIC;
...
GetTextMetrics(Canvas.Handle, tm);
TextLineHeight := tm.tmHeight + tm.tmExternalLeading;

TextRect.Bottom := TextRect.Top + TextLineHeight * NumberOfLines;
Canvas.TextRect(TextRect, 'some long long long text',
  [tfTop, tfLeft, tfEndEllipsis, tfWordBreak]);

クリッピング長方形は正しく計算されていますが、省略記号が表示されていません。

クリッピング長方形の高さを1ピクセル減らすと、省略記号が表示されます。

TextRect.Bottom := TextRect.Top + TextLineHeight * NumberOfLines - 1;

しかし、私のテキストの一番下の行のいくつかのピクセルは、その後クリップされます。

それを正しく行う方法は?

4

2 に答える 2

5

API は最後の行が指定された長方形に収まらない場合にのみ終了省略記号を配置するため、回避策の 1 つはtfModifyString、'TextRect' への最初の呼び出しで、高さを減らした長方形を使用して書式設定オプションで指定してから、'TextRect' を呼び出すことです。適切なサイズの長方形と変更されたテキストを再度使用します。

var
  Text: string;
...

  Text := 'some long long long text';
  SetLength(Text, Length(Text) + 4); // as per DrawTextEx documentation

  Dec(TextRect.Bottom);
  Canvas.TextRect(TextRect, Text,
      [tfTop, tfLeft, tfEndEllipsis, tfWordBreak, tfModifyString]);

  Inc(TextRect.Bottom);
  Canvas.TextRect(TextRect, Text, [tfTop, tfLeft, tfWordBreak]);


ただし、OS の将来のバージョンで、最後の行が四角形に完全に収まらない場合に最後の行を完全に切り取ることが決定された場合に備えて、私は注意を払っています.. :)

于 2011-04-04T10:44:24.290 に答える
0

を使用して必要な長方形を計算してみますCanvas.TextRect(..., [tfCalcRect, ...])

于 2011-04-04T07:45:01.260 に答える