在运行时确定弹出提示消息 (THintInfo::HintStr) 的大小

Determine size of popup hint message (THintInfo::HintStr) at runtime

我们有一个启用了 ShowHint 的 TListView。在 OnInfoTip 处理程序中,构造了一个特定于鼠标悬停在其上的项目的提示消息。该消息可能包含换行符 (#13#10)。

已创建覆盖以处理 CM_HINTSHOW 消息,即将显示的提示消息可在 msg.HintInfo.HintStr 中看到。可以在运行时计算大小,但这似乎有风险,因为实现细节可能很复杂或依赖于平台。

是否可以查询 THintInfo 的边界矩形,或者是否有其他方法可以确定弹出提示消息在显示时的确切大小?

这是必需的,以便可以设置提示 (msg.HintInfo.HintPos) 的确切位置。

THintWindow 具有可用于这种情况的函数 CalcHintRect。 VCL 将在显示 HintWindow 时使用此函数:

  with HintInfo do
    HintWinRect := FHintWindow.CalcHintRect(HintMaxWidth, HintStr, HintData);

由于 FHintWindowTApplication 之外无法访问,因此需要创建一个临时实例。

procedure TMyListView.CMHintShow(var Message: TCMHintShow);
var
  AHintWindow: THintWindow;
  AHintWinRect: TRect;
  ...
begin
  AHintWindow := Message.HintInfo.HintWindowClass.Create(nil);
  try
    AHintWinRect := AHintWindow.CalcHintRect(...);
    ...
  finally
    AHintWindow.Free;
  end;
end;

这有多正确取决于 THintWindowClass 的实施。但是,如果不能依赖 HintWindow,它就会显示不正确。

BidiMode 从右到左时,中东地区可能存在潜在的陷阱。然后另外进行以下操作:

  if FHintWindow.UseRightToLeftAlignment then
    with HintWinRect do
    begin
      Delta := MultiLineWidth(HintInfo.HintStr) + 5;
      Dec(Left, Delta);
      Dec(Right, Delta);
    end;