home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 March / Chip_1999-03_cd.bin / zkuste / delphi / D234C13 / RALIB.ZIP / RALib / Lib / RAHint.pas < prev    next >
Pascal/Delphi Source File  |  1998-08-05  |  4KB  |  172 lines

  1. {***********************************************************
  2.                 R&A Library
  3.        Copyright (C) 1996-98 R&A
  4.  
  5.        component   : TRAHint
  6.        description : Custom activated hint
  7.  
  8.        programers  : white, black
  9.        e-mail      : blacknbs@chat.ru
  10.        www         : www.chat.ru\~blacknbs\ralib
  11. ************************************************************}
  12.  
  13. {$INCLUDE RA.INC}
  14.  
  15. unit RAHint;
  16.  
  17. interface
  18.  
  19. uses
  20.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  21.   ExtCtrls;
  22.  
  23. type
  24.   TRAHint = class(TComponent)
  25.   protected
  26.     R, Area : TRect;
  27.     Txt : string;
  28.     State : (tmBeginShow, tmShowing, tmStopped);
  29.     HintWindow : THintWindow;
  30.     timerHint : TTimer;
  31.     FAutoHide : boolean;
  32.     procedure timerHintTimer(Sender: TObject);
  33.   public
  34.     constructor Create(lOwner : TComponent); override;
  35.     destructor Destroy; override;
  36.     procedure ActivateHint(lArea : TRect; lTxt : string);
  37.     procedure CancelHint;
  38.   published
  39.     property AutoHide : boolean read FAutoHide write FAutoHide default true;
  40.   end;
  41.  
  42. implementation
  43.  
  44.  
  45. constructor TRAHint.Create(lOwner : TComponent);
  46. begin
  47.   inherited Create(lOwner);
  48.   timerHint := TTimer.Create(self);
  49.   timerHint.Enabled  := false;
  50.   timerHint.Interval := 50;
  51.   timerHint.OnTimer  := timerHintTimer;
  52.   HintWindow := THintWindow.Create(Self);
  53.   FAutoHide := true;
  54. end;
  55.  
  56. destructor TRAHint.Destroy;
  57. begin
  58.   timerHint.Free;
  59.   HintWindow.Free;
  60.   inherited Destroy;
  61. end;
  62.  
  63. procedure TRAHint.ActivateHint(lArea : TRect; lTxt : string);
  64. var
  65.   P : TPoint;
  66. begin
  67.   GetCursorPos(P);
  68.   Area := lArea;
  69.   if lTxt = '' then
  70.   begin
  71.     CancelHint;
  72.     exit;
  73.   end else
  74.     Txt := lTxt;
  75.   if not PtInRect(Area, P) then
  76.   begin
  77.     if IsWindowVisible(HintWindow.Handle) then
  78.       ShowWindow(HintWindow.Handle, SW_HIDE);
  79.     exit;
  80.   end;
  81.   if HintWindow.Caption <> Txt then
  82.   begin
  83.    {$IFDEF RA_D2}
  84.     R := Rect(0, 0, Screen.Width, 0);
  85.     DrawText(HintWindow.Canvas.Handle, PChar(Txt), -1, R, DT_CALCRECT or DT_LEFT or
  86.       DT_WORDBREAK or DT_NOPREFIX);
  87.     Inc(R.Right, 6);
  88.     Inc(R.Bottom, 2);
  89.    {$ELSE}
  90.     R := HintWindow.CalcHintRect(Screen.Width, Txt, nil);
  91.    {$ENDIF RA_D2}
  92.     R.Top  := P.Y + 20;
  93.     R.Left := P.X;
  94.     inc(R.Bottom, R.Top);
  95.     inc(R.Right, R.Left);
  96.     State := tmBeginShow;
  97.     timerHint.Enabled := true;
  98.   end;
  99. end;
  100.  
  101. procedure TRAHint.timerHintTimer(Sender: TObject);
  102. var
  103.   P : TPoint;
  104.   bPoint, bDelay : boolean;
  105.   Delay : integer;
  106.   HintPause : integer;
  107. const
  108.   FDelay : integer = 0;
  109. begin
  110.   HintWindow.Color := Application.HintColor;
  111.   Delay := FDelay * integer(timerHint.Interval);
  112.   case State of
  113.     tmBeginShow :
  114.       begin
  115.         GetCursorPos(P);
  116.         bPoint := not PtInRect(Area, P);
  117.         if bPoint then
  118.         begin
  119.           State := tmStopped;
  120.           exit;
  121.         end;
  122.         if IsWindowVisible(HintWindow.Handle) then
  123.           HintPause := Application.HintShortPause else
  124.           HintPause := Application.HintPause;
  125.         if Delay >= HintPause then
  126.         begin
  127.           HintWindow.ActivateHint(R, Txt);
  128.           FDelay := 0;
  129.           State := tmShowing;
  130.         end else
  131.           inc(FDelay);
  132.       end;{tmBeginShow}
  133.     tmShowing :
  134.       begin
  135.         GetCursorPos(P);
  136.         bDelay := FAutoHide and (Delay > Application.HintHidePause);
  137.         bPoint := not PtInRect(Area, P);
  138.         if bPoint or bDelay then
  139.         begin
  140.           if IsWindowVisible(HintWindow.Handle) then
  141.             ShowWindow(HintWindow.Handle, SW_HIDE);
  142.           FDelay := 0;
  143.           if bPoint then HintWindow.Caption := '▌≥ε hint';
  144.           State := tmStopped;
  145.         end else
  146.           inc(FDelay);
  147.       end;{tmShowing}
  148.     tmStopped:
  149.       begin
  150.         FDelay := 0;
  151.         GetCursorPos(P);
  152.         bPoint := not PtInRect(Area, P);
  153.         if IsWindowVisible(HintWindow.Handle) then
  154.           ShowWindow(HintWindow.Handle, SW_HIDE);
  155.         if bPoint then
  156.         begin
  157.           HintWindow.Caption := '▌≥ε hint';
  158.           timerHint.Enabled := false;
  159.         end;
  160.       end;{tmStopped}
  161.   end;{case}
  162. end;
  163.  
  164. procedure TRAHint.CancelHint;
  165. begin
  166.   if IsWindowVisible(HintWindow.Handle) then
  167.     ShowWindow(HintWindow.Handle, SW_HIDE);
  168.   HintWindow.Caption := '';
  169. end;
  170.  
  171. end.
  172.