Как получить точную ширину текста для RenderText в Graphics32 - PullRequest
2 голосов
/ 20 декабря 2010

Я думаю, что мой вопрос достаточно ясен, но я объясню больше.Проще говоря, когда мы используем AntiAlias ​​в процедуре RenderText, значение, полученное в функции TextWidth, неверноЧто я могу сделать, чтобы получить правильную ширину текста?

Ответы [ 2 ]

4 голосов
/ 20 декабря 2010

Вы можете искать алгоритм в собственном коде. Они также должны рассчитать это. В любом случае, вот как я это делаю.

function TGR32Canvas.TextWidth(const Text: string): Integer;
var
  TempFont: TFont;
  TempWidth: Integer;
begin
  if Text <> '' then
  begin
    TempFont := TFont.Create;
    try
      TempFont.Assign(Font);
      TempFont.Size := Font.Size shl AA_MODE;
      TempWidth := GetTextWidth(Text, TempFont);
    finally
      TempFont.Free;
    end;
  end
  else
    TempWidth := 0;

  TempWidth := (TempWidth shr AA_MODE + 1) shl AA_MODE;
  Result := TempWidth shr AA_MODE;
end;

Функция GetTextWidth проста. Вы можете сделать это по-другому.

function GetTextWidth(const Text: string; const Font: TFont): Integer;
var
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  try
    Canvas.Handle := GetDC(0);
    try
      Canvas.Font.Assign(Font);
      Result := Canvas.TextWidth(Text);
    finally
      ReleaseDC(0, Canvas.Handle);
    end;
  finally
    Canvas.Free;
  end;
end;
1 голос
/ 21 декабря 2010

Вы также можете использовать функцию Windows API GetTextExtentPoint32 Сделайте гугл, чтобы найти пример на Delphi

...