【问题标题】:Delphi - accessing a hint window's canvasDelphi - 访问提示窗口的画布
【发布时间】:2015-05-23 07:25:19
【问题描述】:

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

* 原因 *

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

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

并且我希望将所有选项卡的名称放在另一个选项卡下。仅当提示字体为等宽时,上面显示的示例才会正确地制表符。我可以通过用正确数量的空格填充行来通过反复试验使用给定的比例字体来实现它,但我希望它适用于任何字体。我见过的大多数例子似乎都是为了改变提示窗口的外观——我想做的就是能够调用Canvas.TextWidth,这样我就可以计算出我需要添加什么填充来“推”行下一个制表位。

* 更新 *

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

【问题讨论】:

  • 加一个供汤姆·迪克和哈利参考

标签: delphi canvas delphi-2007 hint


【解决方案1】:

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

  1. Screen.HintFont 属性可以分配给您想要的任何画布并获取提示文本尺寸。
  2. 有一个全局的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
猜你喜欢
  • 2010-11-07
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2011-04-02
  • 2012-07-13
  • 2023-03-16
  • 2017-04-08
  • 1970-01-01
相关资源
最近更新 更多