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