我们有一个启用了ShowHint的tlistview。在OnInfoTip处理程序中,将构造特定于鼠标悬停在其上的项的提示消息。消息可能包含换行符(13 10)。
已经创建了一个覆盖来处理CM_HINTSHOW消息,将要显示的提示消息可以在msg.HintInfo.HintStr中看到。可能在运行时计算大小,但这似乎有风险,因为实现细节可能很复杂或依赖于平台。
是否可以查询THintInfo的“边界矩形”,或者是否有其他方法确定弹出提示消息显示时的确切大小?
这是必需的,因此可以设置提示(msg.HintInfo.HintPos)的确切位置。

最佳答案

THintWindow具有可用于此情况的功能。VCL在显示提示窗口时将使用此功能:

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

由于CalcHintRectFHintWindow之外不可访问,因此需要创建一个临时实例。
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;

正确与否取决于TApplication的实现。但是,如果人们不能依赖它,兴都华号就会出现错误。
THintWindowClass从右向左时,中东地区可能存在潜在的陷阱。然后再执行以下操作:
  if FHintWindow.UseRightToLeftAlignment then
    with HintWinRect do
    begin
      Delta := MultiLineWidth(HintInfo.HintStr) + 5;
      Dec(Left, Delta);
      Dec(Right, Delta);
    end;

关于windows - 确定运行时弹出提示消息(THintInfo::HintStr)的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47886976/

10-13 07:36