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

标签 windows delphi delphi-7

我们有一个启用了 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;

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

相关文章:

windows - 如何更改默认本地目录(用于 psftp)?

windows - 在 Windows 窗体应用程序与控制台应用程序中注册 DDE 服务器

delphi - 使用 DragMode=dmAutomatic 时 OnClick 和 MouseDown 不起作用

delphi - 如何在Delphi ASM中返回var参数

delphi - 如何停止Screen.Cursor影响窗体上的所有控件?

c++ - Windows DLL 上的静态链接 libgcc

c++ - 在Linux中,等效于在c/c++中打开物理驱动器的句柄并写入MBR的方法是什么?

database - 德尔福数据库 : Setting up an array of ADT fields at runtime

delphi - 针对 17 年以上无法测试的 Delphi 代码的重构计划

Delphi 7,使用 UNC 选择目录