Компонент на основе TImageList позволяет использовать в приложении анимированные иконки

Компонент на основе TImageList позволяет использовать в приложении анимированные иконки

unit AnimIcon;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, ShellApi, TypInfo;
const
 WM_FROMTRAYICON = WM_USER + 59;
type
 TIconPlace = (ipAppIcon, ipAppMainFormIcon, ipFormIcon, ipImageCtrl,
  ipSysTray);
 TOnTimerEventOrder = (First, Second);
 TIconPlaceSet = set of TIconPlace;
 TTimerEvent = procedure(Sender: TObject) of object;
 TAnimIcon = class(TImageList)
 private
  { Private declarations }
  FIconPlaceSet: TIconPlaceSet;
  FEnabled: Boolean;
  FInterval: Cardinal;
  FNumIco: Integer;
  FOnTimer: TTimerEvent;
  FImage: TImage;
  FAuthor: string;
  FTip: string;
  FActionForIconOnSysTray: Byte;
  FOnTimerEventOrder: TOnTimerEventOrder;
  FhWnd: hWnd;
  procedure PlaceIcon;
 protected
  { Protected declarations }
  procedure Loaded; override;
  procedure SetEnabled(Value: Boolean);
  function GetEnabled: Boolean;
  procedure SetInterval(Value: Cardinal);
  function GetInterval: Cardinal;
  procedure OnAnimIconTimer(Sender: TObject);
  procedure SetImage(Value: TImage);
  function GetImage: TImage;
  procedure SetAuthor(Value: string);
 public
  { Public declarations }
 published
  { Published declarations }
  constructor Create(AOwner: Tcomponent); override; //Конструктор
  destructor Destroy; override;
  property IconPlace: TIconPlaceSet read FIconPlaceSet write FIconPlaceSet;
  property Enabled: Boolean read GetEnabled write SetEnabled;
  property Interval: Cardinal read GetInterval write SetInterval;
  property OnTimer: TTimerEvent read FOnTimer write FOnTimer;
  property ImageCtrl: TImage read GetImage write SetImage;
  property Author: string read FAuthor write SetAuthor;
  property SysTrayTip: string read FTip write FTip;
  property OnTimerEventOrder: TOnTimerEventOrder read FOnTimerEventOrder write
  FOnTimerEventOrder;
 end;
var
 Timer: TTimer;
procedure Register;
function SysTrayIcon(hWindow: THandle; ID: Cardinal; ICON: hicon;
 CallbackMessage: Cardinal; Tip: string; Action: Byte): Boolean;
implementation
procedure Register;
begin
 RegisterComponents('MyComponents', [TAnimIcon]);
end;
function SysTrayIcon(hWindow: THandle; ID: Cardinal; Icon: hicon;
 CallbackMessage: Cardinal; Tip: string; Action: Byte): Boolean;
var
 NID: TNotifyIconData;
begin
 FillChar(NID, SizeOf(TNotifyIconData), 0);
 with NID do
 begin
  cbSize := SizeOf(TNotifyIconData);
  Wnd := hWindow;
  uID := ID;
  uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  uCallbackMessage := CallbackMessage;
  hIcon := Icon;
  if Length(Tip) > 63 then
  SetLength(Tip, 63);
  StrPCopy(szTip, Tip);
 end;
 case Action of
  1: Result := Shell_NotifyIcon(NIM_ADD, @NID);
  2: Result := Shell_NotifyIcon(NIM_MODIFY, @NID);
  3: Result := Shell_NotifyIcon(NIM_DELETE, @NID);
 else
  Result := False;
 end;
end;
procedure TAnimIcon.PlaceIcon;
var
 Icon: TIcon;
 CallbackMessage: Cardinal;
begin
 Inc(FNumIco);
 if FNumIco > Count then
  FNumIco := 1;
 if ipAppIcon in FIconPlaceSet then
 begin
  GetIcon(FNumIco - 1, Application.Icon);
  Application.ProcessMessages;
 end;
 if ipFormIcon in FIconPlaceSet then
 begin
  GetIcon(FNumIco - 1, TForm(Owner).Icon);
  Application.ProcessMessages;
 end;
 if ipAppMainFormIcon in FIconPlaceSet then
 begin
  if Assigned(Application.MainForm) then
  GetIcon(FNumIco - 1, Application.MainForm.Icon);
  Application.ProcessMessages;
 end;
 if ipImageCtrl in FIconPlaceSet then
 begin
  if FImage <> nil then
  GetIcon(FNumIco - 1, FImage.Picture.Icon);
  Application.ProcessMessages;
 end;
 if ipSysTray in FIconPlaceSet then
 begin
  Icon := TIcon.Create;
  GetIcon(FNumIco - 1, Icon);
  CallbackMessage := WM_FROMTRAYICON;
  SysTrayIcon(FhWnd, 0, Icon.Handle, CallbackMessage, FTip,
  FActionForIconOnSysTray);
  Application.ProcessMessages;
  if FActionForIconOnSysTray = 1 then
  FActionForIconOnSysTray := 2;
 end;
end;
constructor TAnimIcon.Create(AOwner: TComponent);
begin
 inherited create(AOwner);
 FAuthor := 'V-Isa aka Inter';
 FNumIco := 0;
 Timer := TTimer.Create(Self);
 Application.ProcessMessages;
 SetEnabled(False);
 SetInterval(1000);
 Timer.OnTimer := OnAnimIconTimer;
 FActionForIconOnSysTray := 0;
 FOnTimerEventOrder := First;
 if csDesigning in ComponentState then
  FTip := (Owner as TForm).Caption;
end;
destructor TAnimIcon.Destroy;
var
 Icon: TIcon;
 CallbackMessage: Cardinal;
begin
 if ipSysTray in FIconPlaceSet then
 begin
  Icon := TIcon.Create;
  CallbackMessage := WM_FROMTRAYICON;
  SysTrayIcon(FhWnd, 0, Icon.Handle, CallbackMessage, FTip, 3);
  Application.ProcessMessages;
 end;
 FNumIco := 0;
 FEnabled := False;
 Timer.Enabled := FEnabled;
 Application.ProcessMessages;
 inherited destroy;
end;
procedure TAnimIcon.OnAnimIconTimer(Sender: TObject);
begin
 if Assigned(FOnTimer) and (FOnTimerEventOrder = First) then
  FOnTimer(Self);
 Application.ProcessMessages;
 if Count > 0 then
 begin
  PlaceIcon;
 end;
 Application.ProcessMessages;
 if Assigned(FOnTimer) and (FOnTimerEventOrder = Second) then
  FOnTimer(Self);
 Application.ProcessMessages;
end;
procedure TAnimIcon.SetEnabled(Value: Boolean);
begin
 if (Value = True) and (csDesigning in ComponentState) then
 begin
  Value := False;
  FNumIco := 0;
  FEnabled := Value;
  Timer.Enabled := FEnabled;
  Application.ProcessMessages;
  ShowMessage('Изменение данного свойства возможно только' +
  #13'во время выполнения программы!!!');
  Exit;
 end;
 if (Value = True) and (Count > 0) then
 begin
  FActionForIconOnSysTray := 1;
  PlaceIcon;
 end;
 if Value = False then
 begin
  FActionForIconOnSysTray := 3;
  PlaceIcon;
 end;
 Application.ProcessMessages;
 if Value = False then
  FNumIco := 0;
 FEnabled := Value;
 Timer.Enabled := FEnabled;
 Application.ProcessMessages;
end;
function TAnimIcon.GetEnabled: Boolean;
begin
 GetEnabled := FEnabled;
end;
procedure TAnimIcon.SetInterval(Value: Cardinal);
begin
 FInterval := Value;
 Timer.Interval := FInterval;
 Application.ProcessMessages;
end;
function TAnimIcon.GetInterval: Cardinal;
begin
 GetInterval := FInterval;
end;
procedure TAnimIcon.SetImage(Value: TImage);
begin
 FImage := Value;
end;
function TAnimIcon.GetImage: TImage;
begin
 GetImage := FImage;
end;
procedure TAnimIcon.SetAuthor(Value: string);
begin
 FAuthor := 'V-Isa aka Inter';
end;
procedure TAnimIcon.Loaded;
begin
 inherited Loaded;
 FhWnd := (Owner as TForm).Handle;
end;
end.
Автор: Вадим Исаенко WEB-сайт: http://v-isa.narod.ru DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...