home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d56 / RMCTL.ZIP / rmTrayIcon.pas < prev    next >
Pascal/Delphi Source File  |  2001-06-22  |  6KB  |  249 lines

  1. {================================================================================
  2. Copyright (C) 1997-2001 Mills Enterprise
  3.  
  4. Unit     : rmTrayIcon
  5. Purpose  : To allow the program to have an Icon in the Win95 Shell Icontray.
  6. Date     : 12-01-1998
  7. Author   : Ryan J. Mills
  8. Version  : 1.80
  9. Notes    : I don't remember where I originally got the code for this component.
  10.            I have modified very little from the original source.
  11. ================================================================================}
  12.  
  13. unit rmTrayIcon;
  14.  
  15. interface
  16.  
  17. {$I CompilerDefines.INC}
  18.  
  19. uses
  20.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ShellAPI, Menus;
  21.  
  22. const
  23.   wm_IconMessage = wm_user + 1;
  24.   wm_ResetIconToolTip = WM_USER+2;
  25.  
  26. type
  27.   TrmTrayIcon = class(TComponent)
  28.   private
  29.     { Private declarations }
  30.     fIconData: TNOTIFYICONDATA;
  31.  
  32.     fIcon: TIcon;
  33.     fToolTip: string;
  34.     fWindowHandle: HWND;
  35.  
  36.     fOnClick: TNotifyEvent;
  37.     fOnDblClick: TNotifyEvent;
  38.     fOnRightClick: TMouseEvent;
  39.     fPopupMenu: TPopupMenu;
  40.     fShowDesigning: boolean;
  41.     fActive: boolean;
  42.     fShowApp: boolean;
  43.  
  44.     procedure FillDataStructure;
  45.  
  46.     function AddIcon : boolean;
  47.     function ModifyIcon : boolean;
  48.     function DeleteIcon : boolean;
  49.  
  50.     procedure IconTrayWndProc(var msg: TMessage);
  51.  
  52.     procedure DoRightClick(Sender: TObject);
  53.     procedure SetActive(const Value: boolean);
  54.     procedure SetIcon(const Value: TIcon);
  55.     procedure SetShowApp(const Value: boolean);
  56.     procedure SetShowDesigning(const Value: boolean);
  57.     procedure SetToolTip(const Value: string);
  58.   protected
  59.     { Protected declarations }
  60.   public
  61.     { Public declarations }
  62.     constructor create(aOwner: TComponent); override;
  63.     destructor Destroy; override;
  64.   published
  65.     { Published declarations }
  66.     property Active: boolean read fActive write SetActive;
  67.     property Icon: TIcon read fIcon write SetIcon;
  68.     property PopupMenu: TPopupMenu read fPopupMenu write fPopupMenu;
  69.     property ShowDesigning: boolean read fShowDesigning write SetShowDesigning;
  70.     property ShowApp: boolean read fShowApp write SetShowApp;
  71.     property ToolTip: string read fTooltip write SetToolTip;
  72.  
  73.     property OnClick: TNotifyEvent read FOnClick write FOnClick;
  74.     property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;
  75.     property OnRightClick: TMouseEvent read FOnRightClick write FonRightClick;
  76.   end;
  77.  
  78. implementation
  79.  
  80. { TrmTrayIcon }
  81.  
  82. function TrmTrayIcon.AddIcon: boolean;
  83. begin
  84.    FillDataStructure;
  85.    result := Shell_NotifyIcon(NIM_ADD,@fIconData);
  86.  
  87.    if fToolTip = '' then
  88.       PostMessage(fWindowHandle, wm_ResetIconToolTip, 0, 0);
  89. end;
  90.  
  91. constructor TrmTrayIcon.create(aOwner: TComponent);
  92. begin
  93.   inherited;
  94.   fIcon := TIcon.create;
  95.   {$ifdef BD6}
  96.   FWindowHandle := Classes.AllocateHWnd(IconTrayWndProc);
  97.   {$else}
  98.   FWindowHandle := AllocateHWnd(IconTrayWndProc);
  99.   {$endif}
  100.  
  101.   SetShowApp(False);
  102. end;
  103.  
  104. function TrmTrayIcon.DeleteIcon: boolean;
  105. begin
  106.    result := Shell_NotifyIcon(NIM_DELETE,@fIconData);
  107. end;
  108.  
  109. destructor TrmTrayIcon.Destroy;
  110. begin
  111.   DeleteIcon;
  112.   {$ifdef BD6}
  113.   Classes.DeAllocateHWnd(FWindowHandle);
  114.   {$else}
  115.   DeAllocateHWnd(FWindowHandle);
  116.   {$endif}
  117.   fIcon.free;
  118.   inherited;
  119. end;
  120.  
  121. procedure TrmTrayIcon.DoRightClick(Sender: TObject);
  122. var
  123.   MouseCo: Tpoint;
  124. begin
  125.   GetCursorPos(MouseCo);
  126.  
  127.   if assigned(fPopupMenu) then
  128.   begin
  129.     SetForegroundWindow(Application.Handle);
  130.     Application.ProcessMessages;
  131.     fPopupmenu.Popup(Mouseco.X, Mouseco.Y);
  132.   end;
  133.  
  134.   if assigned(FOnRightClick) then
  135.     FOnRightClick(self, mbRight, [], MouseCo.x, MouseCo.y);
  136. end;
  137.  
  138. procedure TrmTrayIcon.FillDataStructure;
  139. begin
  140.   with fIconData do
  141.   begin
  142.     cbSize := sizeof(TNOTIFYICONDATA);
  143.     wnd := FWindowHandle;
  144.     uID := 1;
  145.     uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
  146.     hIcon := fIcon.Handle;
  147.     StrPCopy(szTip, fToolTip);
  148.     uCallbackMessage := wm_IconMessage;
  149.   end;
  150. end;
  151.  
  152. procedure TrmTrayIcon.IconTrayWndProc(var msg: TMessage);
  153. begin
  154.   with msg do
  155.   begin
  156.     if (msg = wm_ResetIconToolTip) then
  157.     begin
  158.         SetToolTip( fToolTip );
  159.     end
  160.     else if (msg = wm_IconMessage) then
  161.     begin
  162.       case lParam of
  163.         WM_LBUTTONDBLCLK:
  164.           if assigned(FOnDblClick) then FOnDblClick(self);
  165.         WM_LBUTTONUP:
  166.           if assigned(FOnClick) then FOnClick(self);
  167.         WM_RBUTTONUP: DoRightClick(self);
  168.       end;
  169.     end
  170.     else
  171.       Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
  172.   end;
  173. end;
  174.  
  175. function TrmTrayIcon.ModifyIcon: boolean;
  176. begin
  177.    FillDataStructure;
  178.    if fActive then
  179.       result := Shell_NotifyIcon(NIM_MODIFY,@fIconData)
  180.    else
  181.       result := True;
  182. end;
  183.  
  184. procedure TrmTrayIcon.SetActive(const Value: boolean);
  185. begin
  186.   if value <> fActive then
  187.   begin
  188.     fActive := Value;
  189.     if not (csdesigning in ComponentState) then
  190.     begin
  191.       if Value then
  192.         AddIcon
  193.       else
  194.         DeleteIcon;
  195.     end;
  196.   end;
  197. end;
  198.  
  199. procedure TrmTrayIcon.SetIcon(const Value: TIcon);
  200. begin
  201.   if Value <> fIcon then
  202.   begin
  203.     fIcon.Assign(value);
  204.     ModifyIcon;
  205.   end;
  206. end;
  207.  
  208. procedure TrmTrayIcon.SetShowApp(const Value: boolean);
  209. begin
  210.   if value <> fShowApp then
  211.     fShowApp := value;
  212.   if not (csdesigning in ComponentState) then
  213.   begin
  214.     if Value then
  215.       ShowWindow(Application.Handle, SW_SHOW)
  216.     else
  217.       ShowWindow(Application.Handle, SW_HIDE);
  218.   end;
  219. end;
  220.  
  221. procedure TrmTrayIcon.SetShowDesigning(const Value: boolean);
  222. begin
  223.   if csdesigning in ComponentState then
  224.   begin
  225.     if value <> fShowDesigning then
  226.     begin
  227.       fShowDesigning := Value;
  228.       if Value then
  229.         AddIcon
  230.       else
  231.         DeleteIcon;
  232.     end;
  233.   end;
  234. end;
  235.  
  236. procedure TrmTrayIcon.SetToolTip(const Value: string);
  237. begin
  238.   if length(Value) > 62 then
  239.     fToolTip := copy(Value, 1, 62)
  240.   else
  241.     fToolTip := value;
  242.   ModifyIcon;
  243. end;
  244.  
  245. initialization
  246.  
  247. end.
  248.  
  249.