创建VCL表单应用程序,在表单上放置TBalloonHint
(名称:balloonhintTest)和TButton
(名称:btnTest)并编写此代码:
procedure TForm2.FormCreate(Sender: TObject);
begin
balloonhintTest.HideHint;
balloonhintTest.Style := bhsStandard;
end;
procedure TForm2.btnTestMouseEnter(Sender: TObject);
begin
if not balloonhintTest.ShowingHint then
begin
balloonhintTest.Title := 'My Title';
balloonhintTest.Description := 'MyDescription';
balloonhintTest.ShowHint(Self.ClientToScreen(Point(btnTest.Left + (btnTest.Width div 2), btnTest.Top + btnTest.Height)));
end;
end;
procedure TForm2.btnTestMouseLeave(Sender: TObject);
begin
balloonhintTest.HideHint;
end;
现在运行程序并将鼠标指针悬停在按钮上。
当窗口位于屏幕的上部时,它就是这样的样子:
当窗口位于屏幕的下半部分时,这就是它的样子:
如您所见 - 尽管提示坐标始终相同 - 提示在第一种情况下显示为DOWNWARDS(所需结果),在第二种情况下显示UPWARDS(显然不是所需结果),具体取决于垂直位置屏幕上的窗口。
那么如何在这种情况下显示气球提示总是向下独立于屏幕位置?
(请注意:我对ShowHint
方法的其他重载不感兴趣 - 我只是想知道如何在上述情况下始终向下显示提示,因为这只是一个简化的场景。更复杂的情况)。
答案 0 :(得分:0)
可能最简单的方法是根据TBalloonHint创建自己的类
type
TMyHint = class(TBalloonHint)
strict private
FControl: TControl;
public
procedure PaintHint(HintWindow: TCustomHintWindow); override;
constructor Create(AOwner: TComponent; const AControl: TControl);
end;
constructor TMyHint.Create(AOwner: TComponent; const AControl: TControl);
begin
inherited Create(AOwner);
FControl := AControl;
end;
procedure TMyHint.PaintHint(HintWindow: TCustomHintWindow);
var
Point: TPoint;
begin
Point := FControl.Parent.ClientToScreen(TPoint.Create(FControl.Left, FControl.Top + FControl.Height));
HintWindow.Top := Point.Y;
inherited;
end;
将其创建为
procedure TMainForm.FormCreate(Sender: TObject);
begin
balloonHintTest := TMyHint.Create(Self, btnTest);
balloonHintTest.Style := bhsStandard;
end;