Delphi-访问提示窗口';帆布

Delphi-访问提示窗口';帆布,delphi,canvas,delphi-2007,hint,Delphi,Canvas,Delphi 2007,Hint,有没有一种简洁的方法可以访问提示窗口的画布?我不想在画布上绘制任何东西-我只想指定组件的Hint属性-但我确实想找出Windows将使用提示窗口文本使用的任何字体呈现的文本宽度 *原因* 我正在尝试构造带有选项卡列的提示窗口,例如 SomeControl.Hint := 'Item 1: ' + #9 + 'Tom' + #13 + 'Item 2: ' + #9 + 'Dick' + #13 + 'Another Item: ' + #9 + 'Harry

有没有一种简洁的方法可以访问提示窗口的画布?我不想在画布上绘制任何东西-我只想指定组件的
Hint
属性-但我确实想找出Windows将使用提示窗口文本使用的任何字体呈现的文本宽度

*原因*

我正在尝试构造带有选项卡列的提示窗口,例如

SomeControl.Hint := 
  'Item 1:       ' + #9 + 'Tom' + #13 +
  'Item 2:       ' + #9 + 'Dick' + #13 +
  'Another Item: ' + #9 + 'Harry' + #13 ;
我希望所有的名字都在一个标签下。仅当提示字体为单间距时,上面显示的示例才能正确制表。我可以通过尝试和错误,在行中填充适当数量的空格,使用给定的比例字体来实现它,但我希望它适用于任何字体。我看到的大多数示例似乎都是关于更改提示窗口的外观的-我所要做的就是能够调用
Canvas.TextWidth
,这样我就可以计算需要添加什么填充来“推”下一个制表位上的行

*更新*


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

有两种方法可以实现您想要的

  • Screen.HintFont
    属性,您可以将其分配给任何需要的画布并获取提示文本维度
  • Delphi应用程序使用全局
    HintWindowClass
    Delphi应用程序创建提示窗口,您可以创建自己的窗口,并使用其画布进行文本测量
  • 您可以这样使用它:

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

    再加上汤姆·迪克和哈利的第一堂课答案。非常感谢。只是一个问题:为什么要用
    HintCtrl:=HintWindowClass.create(nil)创建变量
    HintCtrl
    -为什么不
    HintCtrl:=THintWindow.Create(nil)?您也可以使用
    THintWindow
    ,但由于
    HintWindowClass
    用于自定义提示窗口,因此我更喜欢使用更通用的解决方案。当然,如果实现了自定义行为,则必须在为
    HintWindowClass
    分配另一个值后创建
    HintCtrl