TRAYICON.PAS
上传用户:llfxmlw
上传日期:2009-09-14
资源大小:335k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. { TTrayIcon VCL. Version 1.3
  2.   Requires:  Delphi 2.0 32 bit.
  3.   Function: Adds an icon to the Windows 95 Tool Tray and
  4.       has events to respond to mouse clicks.
  5.   This component is based on the TToolIcon VCL that was written by
  6.   Derek Stutsman (dereks@metronet.com).  He based his component on
  7.   TWinControl, so it showed up as a clear, blank, resizable window at
  8.   design time and also had more properties than the component actually
  9.   needed.  This made it really hard to find on a busy form sometimes.
  10.   I changed it so it would be based on TComponent so that it was readily
  11.   visible at design time and also did not cover anything at run-time.
  12.   The additional Top, left, width, etc. properties are also no longer
  13.   necessary.  I added a ShowDesigning property so that you could test
  14.   it at design time, but then turn it off so that TWO icons weren't shown
  15.   on the tool tray when developing and testing.
  16.   One strange anomaly that I worked around but don't know why it happens -
  17.   if a ToolTip is not specified, then at run-time the icon shows up as
  18.   blank.  If a ToolTip is specified, everything works fine.  To fix this,
  19.   I set up another windows message that set the tool tip if it was blank -
  20.   this ensures proper operation at all times, but I don't know why this
  21.   is necessary.  If you can figure it out, send me some mail and let me
  22.   know! (4/17/96 note - still no solution for this!)
  23.   This is freeware (as was the original).  If you make cool changes to it,
  24.   please send them to me.
  25.   Enjoy!
  26.   Pete Ness
  27.   Compuserve ID: 102347,710
  28.   Internet: 102347.710@compuserve.com
  29.   http:\ourworld.compuserve.comhomepagespeteness
  30.   Release history:
  31.   3/8/96 - Version 1.0
  32.      Release by Derek Stutsman of TToolIcon version 1.0
  33.   3/12/96 - Version 1.1
  34.      Changed as outlined above by me (Pete Ness) and renamed to TTrayIcon.
  35.   3/29/96 - Version 1.2
  36.      Add default window handling to allow closing when Win95 shutdown.
  37.      Previously, you had to manually close your application before closing
  38.      Windows 95.
  39.   4/17/96 - Version 1.3
  40.      Added a PopupMenu property to automatically handle right clicking on
  41.      the tray icon.
  42.      Fixed bug that would not allow you to instantiate a TTrayIcon instance
  43.      at run-time.
  44.      Added an example program to show how to do some of the things I've
  45.      gotten the most questions on.
  46.      This version is available from my super lame web page - see above for
  47.      the address.
  48.   }
  49. unit TrayIcon;
  50. interface
  51. uses
  52.   SysUtils, Windows, Messages, Classes, Graphics, Controls, ShellAPI, Forms, menus;
  53. const WM_TOOLTRAYICON = WM_USER+1;
  54.       WM_RESETTOOLTIP = WM_USER+2;
  55. type
  56.   TTrayIcon = class(TComponent)
  57.   private
  58.   { Field Variables }
  59.     IconData: TNOTIFYICONDATA;
  60.     fIcon : TIcon;
  61.     fToolTip : String;
  62.     fWindowHandle : HWND;
  63.     fActive : boolean;
  64.     fShowDesigning : Boolean;
  65.   { Events }
  66.     fOnClick     : TNotifyEvent;
  67.     fOnDblClick  : TNotifyEvent;
  68.     fOnRightClick : TMouseEvent;
  69.     fPopupMenu   : TPopupMenu;
  70.     function AddIcon : boolean;
  71.     function ModifyIcon : boolean;
  72.     function DeleteIcon : boolean;
  73.     procedure SetActive(Value : boolean);
  74.     procedure SetShowDesigning(Value : boolean);
  75.     procedure SetIcon(Value : TIcon);
  76.     procedure SetToolTip(Value : String);
  77.     procedure WndProc(var msg : TMessage);
  78.     procedure FillDataStructure;
  79.     procedure DoRightClick( Sender : TObject );    
  80.   protected
  81.   public
  82.     constructor create(aOwner : TComponent); override;
  83.     destructor destroy; override;
  84.   published
  85.     property Active : boolean read fActive write SetActive;
  86.     property ShowDesigning : boolean read fShowDesigning write SetShowDesigning;
  87.     property Icon : TIcon read fIcon write SetIcon;
  88.     property ToolTip : string read fTooltip write SetToolTip;
  89.     property OnClick     : TNotifyEvent read FOnClick write FOnClick;
  90.     property OnDblClick  : TNotifyEvent read FOnDblClick write FOnDblClick;
  91.     property OnRightClick : TMouseEvent  read FOnRightClick write FonRightClick;
  92.     property PopupMenu : TPopupMenu read fPopupMenu write fPopupMenu;
  93.   end;
  94. procedure Register;
  95. implementation
  96. {$R TrayIcon.res}
  97. procedure TTrayIcon.SetActive(Value : boolean);
  98. begin
  99.    if value <> fActive then begin
  100.      fActive := Value;
  101.      if not (csdesigning in ComponentState) then begin
  102.         if Value then begin
  103.            AddIcon;
  104.         end else begin
  105.            DeleteIcon;
  106.         end;
  107.      end;
  108.   end;
  109. end;
  110. procedure TTrayIcon.SetShowDesigning(Value : boolean);
  111. begin
  112.   if csdesigning in ComponentState then begin
  113.      if value <> fShowDesigning then begin
  114.         fShowDesigning := Value;
  115.         if Value then begin
  116.            AddIcon;
  117.         end else begin
  118.            DeleteIcon;
  119.         end;
  120.      end;
  121.   end;
  122. end;
  123. procedure TTrayIcon.SetIcon(Value : Ticon);
  124. begin
  125.   if Value <> fIcon then
  126.     begin
  127.       fIcon.Assign(value);
  128.       ModifyIcon;
  129.     end;
  130. end;
  131. procedure TTrayIcon.SetToolTip(Value : string);
  132. begin
  133.    // This routine ALWAYS re-sets the field value and re-loads the
  134.    // icon.  This is so the ToolTip can be set blank when the component
  135.    // is first loaded.  If this is changed, the icon will be blank on
  136.    // the tray when no ToolTip is specified.
  137.    if length( Value ) > 62 then
  138.       Value := copy(Value,1,62);
  139.    fToolTip := value;
  140.    ModifyIcon;
  141. end;
  142. constructor TTrayIcon.create(aOwner : Tcomponent);
  143. begin
  144.   inherited create(aOwner);
  145.   FWindowHandle := AllocateHWnd( WndProc );
  146.   FIcon := TIcon.Create;
  147. end;
  148. destructor TTrayIcon.destroy;
  149. begin
  150.   if (not (csDesigning in ComponentState) and fActive)
  151.      or ((csDesigning in ComponentState) and fShowDesigning) then
  152.         DeleteIcon;
  153.   FIcon.Free;
  154.   DeAllocateHWnd( FWindowHandle );
  155.   inherited destroy;
  156. end;
  157. procedure TTrayIcon.FillDataStructure;
  158. begin
  159.   with IconData do begin
  160.      cbSize := sizeof(TNOTIFYICONDATA);
  161.      wnd := FWindowHandle;
  162.      uID := 0; // is not passed in with message so make it 0
  163.      uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
  164.      hIcon := fIcon.Handle;
  165.      StrPCopy(szTip,fToolTip);
  166.      uCallbackMessage := WM_TOOLTRAYICON;
  167.   end;
  168. end;
  169. function TTrayIcon.AddIcon : boolean;
  170. begin
  171.    FillDataStructure;
  172.    result := Shell_NotifyIcon(NIM_ADD,@IconData);
  173.    // For some reason, if there is no tool tip set up, then the icon
  174.    // doesn't display.  This fixes that.
  175.    if fToolTip = '' then
  176.       PostMessage( fWindowHandle, WM_RESETTOOLTIP,0,0 );
  177. end;
  178. function TTrayIcon.ModifyIcon : boolean;
  179. begin
  180.    FillDataStructure;
  181.    if fActive then
  182.       result := Shell_NotifyIcon(NIM_MODIFY,@IconData)
  183.    else
  184.       result := True;
  185. end;
  186. procedure TTrayIcon.DoRightClick( Sender : TObject );
  187. var MouseCo: Tpoint;
  188. begin
  189.    GetCursorPos(MouseCo);
  190.    if assigned( fPopupMenu ) then begin
  191.       SetForegroundWindow( Application.Handle );
  192.       Application.ProcessMessages; 
  193.       fPopupmenu.Popup( Mouseco.X, Mouseco.Y );
  194.    end;
  195.    if assigned( FOnRightClick ) then
  196.       begin
  197.          FOnRightClick(self,mbRight,[],MouseCo.x,MouseCo.y);
  198.       end;
  199. end;
  200. function TTrayIcon.DeleteIcon : boolean;
  201. begin
  202.    result := Shell_NotifyIcon(NIM_DELETE,@IconData);
  203. end;
  204. procedure TTrayIcon.WndProc(var msg : TMessage);
  205. begin
  206.    with msg do
  207.      if (msg = WM_RESETTOOLTIP) then
  208.         SetToolTip( fToolTip )
  209.      else if (msg = WM_TOOLTRAYICON) then begin
  210.         case lParam of
  211.            WM_LBUTTONDBLCLK   : if assigned (FOnDblClick) then FOnDblClick(self);
  212.            WM_LBUTTONUP       : if assigned(FOnClick)then FOnClick(self);
  213.            WM_RBUTTONUP       : DoRightClick(self);
  214.         end;
  215.      end
  216.      else // Handle all messages with the default handler
  217.         Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
  218. end;
  219. procedure Register;
  220. begin
  221.   RegisterComponents('BenTools', [TTrayIcon]);
  222. end;
  223. end.