Как я могу получить новую высоту обернутого текста DrawText () ;? - PullRequest
1 голос
/ 22 июня 2011

пример кода

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 пикселей, но как я могу получить новую высоту?Есть ли способ или какое-нибудь решение?

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

Высота нарисованного текста - это возвращаемое значение DrawText.

HeightOfText := DrawText(...
1 голос
/ 23 июня 2011

Как уже упоминалось здесь вы можете получить его, вызвав 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;

Что означает, что если вы вызовете его дважды в следующем примере, вы получите нарисованный текст. Это потому, что первый вызов с DT_CALCRECT вычисляет прямоугольник (и изменяет переменную R, делая это), а второй вызов рисует текст в этой измененной области прямоугольника.

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;
1 голос
/ 22 июня 2011

Если вы хотите обновить прямоугольник перед рисованием текста, вы можете использовать DT_CALCRECT.DrawText изменит ваш прямоугольник на новую высоту (и ширину, если необходимо).Если вам нужна только высота, используйте возвращаемое значение, как показал Андреас Рейбранд.

Вот пример этого:

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

...