【问题标题】:How to display TBalloonHint always downwards independently from the screen position?如何独立于屏幕位置始终向下显示 TBalloonHint?
【发布时间】:2017-01-13 18:03:56
【问题描述】:

创建一个 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 方法的其他重载不感兴趣 - 我只想知道在上述情况下如何始终向下显示提示,因为这只是更复杂的简化场景案例)。

【问题讨论】:

  • 您的大写锁定键随机卡住了。
  • 对不起,这是一个旧键盘。但你知道答案吗?
  • 我想不出任何可以调用 ShowHint 但不能调用 ShowHint 的场景。 rect 覆盖在 IMO 上工作得很好,它在按钮下方或按钮上方显示提示,按钮始终可见。
  • 谢谢,但我怎样才能得到矩形的大小?
  • 你传递了按钮的矩形:GetWindowRect(btnTest.Handle, R); balloonHintTest.ShowHint(R);

标签: delphi delphi-10.1-berlin hints balloon-tip


【解决方案1】:

可能最简单的方法是基于 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多