Компонент на основе TImageList позволяет использовать в приложении анимированные иконки
Автор: Вадим Исаенко
WEB-сайт: http://v-isa.narod.ru
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.
Скачать весь проект
|