1

コードサンプル

procedure TForm1.Button1Click(Sender: TObject);
var
  r: Trect;
  s: String;
begin
  R := Rect(0,0, 300, 100);
  s := 'WordWrapTextOut(TargetCanvas: TCanvas; var x, y: integer; S: string; maxwidth, lineheight: integer);';
  DrawText(Canvas.Handle, PChar(s),  length(s), R, DT_WORDBREAK or DT_LEFT);
end;

テキストを300pxの幅で折り返したいのですが、新しい高さを取得するにはどうすればよいですか?方法や解決策はありますか?

4

3 に答える 3

4

描画されたテキストの高さは、の戻り値ですDrawText

HeightOfText := DrawText(...
于 2011-06-22T11:17:48.317 に答える
1

テキストを描画する前に長方形を更新する場合は、DT_CALCRECTを使用できます。次に、DrawTextは、長方形を新しい高さ(および必要に応じて幅)に変更します。Andreas Rejbrandが示したように、高さだけが必要な場合は、戻り値を使用してください。

これのサンプルは次のとおりです。

procedure TForm1.Button1Click(Sender: TObject);
var
  r: Trect;
  s: String;
begin
  R := Rect(0,0, 300, 100);
  s := 'WordWrapTextOut(TargetCanvas: TCanvas; var x, y: integer; S: string; maxwidth, lineheight: integer);';
  if DrawText(Canvas.Handle, PChar(s),  length(s), R, DT_CALCRECT or DT_WORDBREAK or DT_LEFT) <> 0 then
  begin
    DrawText(Canvas.Handle, PChar(s),  length(s), R, DT_WORDBREAK or DT_LEFT);
    r.Top := r.Bottom;
    r.Bottom := r.Bottom * 2;
    DrawText(Canvas.Handle, PChar(s),  length(s), R, DT_WORDBREAK or DT_LEFT);
  end;
end;

詳細については、ドキュメントを読むことをお勧めします:http: //msdn.microsoft.com/en-us/library/dd162498 (v=vs.85).aspx

于 2011-06-22T17:11:49.310 に答える
1

ここで述べたように、実際には何もペイントしないフラグを指定してDrawText関数を呼び出すことで取得できます。DT_CALCRECT適切な長方形を計算し、それを変数に返しますR

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRect;
  S: String;
begin
  R := Rect(0, 0, 20, 20);
  S := 'What might be the new high of this text ?';
  DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_LEFT or DT_CALCRECT);
  ShowMessage('New height might be '+IntToStr(R.Bottom - R.Top)+' px');
end;

つまり、次の例を使用して2回呼び出すと、ラップされたテキストが描画されます。これは、の最初の呼び出しでDT_CALCRECT長方形が計算され(そしてRそれを実行して変数を変更し)、2番目の呼び出しでその変更された長方形の領域にテキストが描画されるためです。

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRect;
  S: String;
begin
  R := Rect(0, 0, 20, 20);
  S := 'Some text which will be stoutly wrapped and painted :)';
  DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_LEFT or DT_CALCRECT);
  DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_LEFT);
end;
于 2011-06-22T21:00:43.013 に答える