使用Delphi计算文本宽度,包括字符之间的空格/字距

时间:2015-05-22 17:25:28

标签: delphi winapi canvas text-width

我找不到任何资源来解释如何计算字符串的文本宽度,并且字符之间有不同的警告/空格。

Textwidth可以使用字体大小,字体样式等但不能使用字符之间的空格吗? (或我认为非常字体特定的字距,即给出不同的像素值取决于字符,因为它们可以"重叠"或多或少取决于字距调整/间距值)

1 个答案:

答案 0 :(得分:2)

修改:推荐阅读:Feng Yuan "Windows Graphics Programming"

TextWidth(GetTextExtentPoint32)示例和更复杂的方法:

var
  Len, w: Integer;
  s: string;
  GR: TGCPResults;
begin
  Canvas.Font.Size := 14;
  s := 'A simple test string';
  Canvas.TextOut(0, 0, s);
  w := Canvas.TextWidth(s);
  Canvas.MoveTo(w, 0);
  Canvas.LineTo(w, 30);

  SetTextCharacterExtra(Canvas.Handle, 5);
  Canvas.TextOut(0, 30, s);
  w := Canvas.TextWidth(s);
  Canvas.MoveTo(w, 30);
  Canvas.LineTo(w, 60);

  SetTextCharacterExtra(Canvas.Handle, 0);
  Len := Length(s);
  GR.lStructSize := sizeOf(GR);
  GetMem(GR.lpOutString, (Len + 1) * sizeOf(Char));
  GR.lpOrder := Nil;
  GetMem(GR.lpDx, (Len + 1) * sizeOf(Integer));
  GetMem(GR.lpCaretPos, (Len + 1) * sizeOf(Integer));
  GR.lpClass := Nil;
  GetMem(GR.lpGlyphs, (Len + 1) * sizeOf(UINT));
  GR.nGlyphs := Len;
  GR.nMaxFit := 0;

  w := GetCharacterPlacement(Canvas.Handle, PwideChar(s), Len, 0, GR,
    GCP_USEKERNING) and $FFFF;
  ExtTextOut(Canvas.Handle, 0, 60, ETO_GLYPH_INDEX, nil, PChar(GR.lpGlyphs),
    GR.nGlyphs, PINteger(GR.lpDx));
  Canvas.MoveTo(w, 60);
  Canvas.LineTo(w, 90);
  // free memory for GR members