我们有一个启用了 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);
由于 FHintWindow
在 TApplication
之外无法访问,因此需要创建一个临时实例。
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/