【问题标题】:How can I create my own custom Hint for a specific control?如何为特定控件创建自己的自定义提示?
【发布时间】:2014-11-11 01:37:25
【问题描述】:

我需要为特定控件(不是整个应用程序)创建一个自定义提示窗口(具有自己的颜色和布局)

提示文本本身不会连接到特定的Hint 属性控件。

按照建议,我为CM_HINTSHOW 编写了一个处理程序(如果控件具有ShowHint=True,则此方法有效):

procedure TMyControl.CMHintShow(var Message: TMessage);
begin
  Form1.caption := 'x';
  // Here I will display my own Hint window 
  // inherited;
end;

但是现在,当提示超时时,我如何知道何时/何处隐藏它? CM_HINTSHOWCM_HINTSHOWPAUSE 都没有给我这个信息。

【问题讨论】:

  • 为该控件的CM_HINTSHOW 消息编写一个处理程序。
  • 此任务的哪一部分您需要帮助?
  • @TLama,谢谢你。如果我设置了“ShowHint”属性,它可以正常工作。但是现在,提示超时时如何隐藏它?

标签: delphi delphi-7


【解决方案1】:

在您的CM_HINTSHOW 消息处理程序中,您可以将lParam 值强制转换为PHintInfo 指针,然后根据需要自定义其字段。例如,要简单地更改背景颜色,请设置 THintInfo.HintColor 字段。要更改提示的布局,您可以从 THintWindow 派生一个新类并将该类类型分配给 THintInfo.HintWindowClass 字段。

让 VCL 为您管理提示,包括显示和隐藏。

【讨论】:

  • 我需要在新的提示窗口 + 图像上显示 Unicode 文本。我认为我不能简单地派生一个类THintWindow,因为ActivateHint 除外AHint: String (AnsiString)
  • VCL 在激活提示时调用THintWindow.ActivateHintData(),因此您可以使用THintInfo.HintData 字段将自定义数据传递给提示,例如您的Unicode 文本。
  • 看来这是正确的方法。我可以将任何内容分配给HintData吗?
  • 是的,它只是按原样传递的原始Pointer,因此您可以分配任何您想要的东西。
  • @zig:是的,如果您需要在ActivateHintData() 退出后继续访问数据,则必须保留对数据的引用。为CM_HINTSHOW 返回 0 之外的任何值都将取消提示。如果您调用inherited,则基本控制代码有机会接受/拒绝/自定义提示,例如在将TAction 分配给控件时格式化HintStr。因此,您可以先调用inherited,然后在Message.Result 仍为0 时进行自定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多