2011-06-22 1 views
1

コードサンプルDrawText();のwrapedtextの新しい高さを取得するにはどうすればいいですか?

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; 

私は300ピクセル幅でテキストを折り返すしたいが、どのように私は新しい高さを得ることができますか?方法や解決策はありますか?

答えて

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

3

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

HeightOfText := DrawText(... 
1

としては、あなたが何を指定したDT_CALCRECTフラグでDrawText関数を呼び出すことによってそれを得ることができhere言及されました実際には何も塗装されません。適切な四角形を計算し、変数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; 
関連する問題