Delphi - 访问提示窗口的 Canvas

标签 delphi canvas delphi-2007 hint

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

* 原因 *

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

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

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

* 更新 *

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

最佳答案

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

  1. Screen.HintFont 属性,您可以将其分配给所需的任何 Canvas 并获取提示文本尺寸。
  2. Delphi 应用程序使用全局 HintWindowClass 创建提示窗口,您可以创建自己的提示窗口并使用其 Canvas 进行文本测量。

你可以这样使用它:

var
  HintCtrl: THintWindow;

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

关于Delphi - 访问提示窗口的 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29157159/

相关文章:

delphi - 缓慢的内存释放(引用结构)-我的解决方法是一个好方法吗?

delphi - 如何将参数传递给 OmniThreadLibrary 中的 Parallel.Async()?

java - canvas.drawBitmap 仅绘制最后修改的位图,而不是中间值

delphi - 无法将科学计数值转换为十进制

javascript - 如何仅根据硬件性能来确定 WebGL 兼容性

javascript - Circle(ARC) 渐变填充 Canvas JS

delphi - 在 Delphi 2007 中设置事件处理程序并收到 "Parameter Lists Differ"错误

delphi - 如何知道有多少任务已经完成?

delphi - 在 Delphi XE 中使用通用容器 - 总是吗?

cocoa - 是否可以比较2个sqlite文件并更新