使用Delphi计算包含字符间距/字距的文本宽度

使用Delphi计算包含字符间距/字距的文本宽度,delphi,winapi,canvas,text-width,Delphi,Winapi,Canvas,Text Width,我很难找到任何资源来解释如何使用不同的学习/字符间距计算字符串的文本宽度 Textwidth可以使用字体大小、字体样式等,但不能使用字符之间的空格?(或字距调整,我认为这是非常特定于字体的,即根据字体给出不同的像素值,因为字符可以或多或少地“重叠”,这取决于字距/间距值)编辑:推荐阅读: TextWidth(GetTextExtentPoint32)和更复杂方法的示例: var Len, w: Integer; s: string; GR: TGCPResults; begin

我很难找到任何资源来解释如何使用不同的学习/字符间距计算字符串的文本宽度


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

编辑:推荐阅读:

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

您是否使用ExtTextOut或其他方式输出具有特定字距的文本?请提供一些显示textwidth失败的示例。如何绘制具有特定字距设置的文本?DirectWrite,GDI+?同样的库/API当然也为您提供了功能。或者你想知道普通GDI文本的宽度?那么Canvas.TextWidth就足够了。@SertacAkyuz这并不是说它失败了。这是因为我需要使用不同的字符间距计算文本宽度。@MBo我看不到任何使用ExtTextOut定义字符间距的选项?但是如果有这样一个函数,可以让我计算出宽度,解决我的问题。这里有一些有趣的函数,我将进一步查找和研究。谢谢:)