procedure THintWindow.ActivateHint(Rect: TRect;
const AHint:
string);
type
TAnimationStyle = (atSlideNeg, atSlidePos, atBlend);
const
AnimationStyle:
array[TAnimationStyle]
of Integer = (AW_VER_NEGATIVE,
AW_VER_POSITIVE, AW_BLEND);
var
Animate: BOOL;
Style: TAnimationStyle;
Monitor: TMonitor;
begin
FActivating := True;
try
Caption := AHint;
Inc(Rect.Bottom, 4);
UpdateBoundsRect(Rect);
Monitor := Screen.MonitorFromPoint(Point(Rect.Left, Rect.Top));
if Width > Monitor.Width
then
Width := Monitor.Width;
if Height > Monitor.Height
then
Height := Monitor.Height;
if Rect.Top + Height > Monitor.Top + Monitor.Height
then
Rect.Top := (Monitor.Top + Monitor.Height) - Height;
if Rect.Left + Width > Monitor.Left + Monitor.Width
then
Rect.Left := (Monitor.Left + Monitor.Width) - Width;
if Rect.Left < Monitor.Left
then Rect.Left := Monitor.Left;
if Rect.Bottom < Monitor.Top
then Rect.Top := Monitor.Top;
ParentWindow := Application.Handle;
// <<<<<<<<<<<<<<
SetWindowPos(
Handle, HWND_TOPMOST, Rect.Left, Rect.Top, Width, Height,
SWP_NOACTIVATE);
if (GetTickCount - FLastActive > 250)
and (Length(AHint) < 100)
and
Assigned(AnimateWindowProc)
then
begin
SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0,
{$IFNDEF CLR}@
{$ENDIF}Animate, 0);
if Animate
then
begin
SystemParametersInfo(SPI_GETTOOLTIPFADE, 0,
{$IFNDEF CLR}@
{$ENDIF}Animate, 0);
if Animate
then
Style := atBlend
else
if Mouse.GetCursorPos.Y > Rect.Top
then
Style := atSlideNeg
else
Style := atSlidePos;
AnimateWindowProc(
Handle, 100, AnimationStyle[Style]
or AW_SLIDE);
end;
end;
ShowWindow(
Handle, SW_SHOWNOACTIVATE);
Invalidate;
finally
FLastActive := GetTickCount;
FActivating := False;
end;
end;