Delphi - 访问提示 window 的 canvas

Delphi - accessing a hint window's canvas

是否有访问提示 window 的 canvas 的简洁方法?我不想在 canvas 上绘制任何东西 - 我只会分配给组件的 Hint 属性 - 但我确实想找出 Windows 将使用用于提示 window 文本的任何字体呈现。

* 原因 *

我正在尝试构建提示 windows,其中包含选项卡式列,例如

SomeControl.Hint := 
  'Item 1:       ' + #9 + 'Tom' + #13 +
  'Item 2:       ' + #9 + 'Dick' + #13 +
  'Another Item: ' + #9 + 'Harry' + #13 ;

而且我希望所有标签的名称都在一个标签下。仅当提示字体为 mono-spaced 时,上面显示的示例才会正确跳格。我可以通过用正确数量的 space 填充行来通过反复试验使用给定的比例字体来实现它,但我希望它适用于任何字体。我看到的大多数例子似乎都是为了改变提示的外观 window - 我想要做的就是能够调用 Canvas.TextWidth 这样我就可以计算出我需要添加什么填充 "push" 下一个制表位上方的行。

* 更新 *

我误会了 - 我假设提示控件尊重制表符,但实际上它似乎忽略了它。另一方面,TLabel 组件确实尊重制表符 - 它似乎移动到 10 左右 space 宽度的下一个倍数。

有两种方法可以达到你想要的效果。

  1. Screen.HintFont 属性 可以分配给任何你想要的 canvas 并获得你的提示文本尺寸。
  2. 全局 HintWindowClass Delphi 应用程序用于创建提示 windows,您可以创建自己的提示并使用其 canvas 进行文本测量。

你可以这样使用它:

var
  HintCtrl: THintWindow;

  HintCtrl := HintWindowClass.Create(nil);
  HintCtrl.Canvas.TextWidth('abc');
  ...