Habs mal getestet (eine .ani hab ich nicht nehmen können, ein animiertes .gif geht aber) :
Lösung1, die funktioniert: lade deine animierte Datei in ein Grafikprogramm deiner Wahl (Gimp) und speicher die einzelnen Icons. Lade sie alle nacheinander beim Starten und änder diese mittels eines Timers (siehe unten).
Lösung2, die funktioniert: (Cursor unsichtbar machen, an diese Stelle, wo sich die Maus befindet das animierte Bild zeichnen): Leere Form, Timer drauf, Package BGRABitmap (
http://wiki.freepascal.org/BGRABitmap/de) installieren (
http://sourceforge.net/projects/lazpaint/files/src/)
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
SysUtils, Forms, Controls, Graphics, Classes, LCLintf, ExtCtrls, BGRAAnimatedGif;
type
{ TForm1 }
TForm1 = class(TForm)
Timer1: TTimer; //Timer zum Neuzeichnen der Form (Intervall=50)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
AniGif:TBGRAAnimatedGif; //Animiertes Gif
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
AniGif:=TBGRAAnimatedGif.Create('maus-ani.gif'); //Das animierte Gif wird geladen
Screen.Cursor:=-1; //Cursor unsichtbar;
end;
procedure TForm1.FormPaint(Sender: TObject); //Beim Zeichen der Form animiertes Bild an Mauskoordinaten zeichnen
var
Rect:TRect;
p:TPoint;
begin
getcursorpos(p);
p:=ScreenToClient(p);
Rect.Left:=p.x;
Rect.Top:=p.y;
Rect.Right:=p.x+AniGif.Width;
Rect.Bottom:=p.y+AniGif.Height;
AniGif.Show(Canvas,Rect);
end;
procedure TForm1.Timer1Timer(Sender: TObject); //Timer zum Neuzeichnen der Form (Intervall=50)
begin
Refresh;
end;
end.
Lösung3, die teilweise funktioniert (Transparenz konnte ich nicht setzen, evtl. hat da noch jemand eine Idee??): Leere Form, Timer drauf, Package BGRABitmap (
http://wiki.freepascal.org/BGRABitmap/de) installieren (
http://sourceforge.net/projects/lazpaint/files/src/)
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
SysUtils, Forms, Controls, Graphics, Classes, ExtCtrls, BGRAAnimatedGif;
type
{ TForm1 }
TForm1 = class(TForm)
Timer1: TTimer; //Timer zum ständigen Tausch des Cursors (Intervall=50)
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
AniGif:TBGRAAnimatedGif; //Animiertes Gif
procedure SpeicherIcons; //Animiertes Gif in Icons speichern
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.SpeicherIcons; //Animiertes Gif in Icons speichern
var
AIcon:TIcon; //Icon zum Speichern
ABitmap:TBitmap; //Bitmap, auf dem die einzelnen Bilder des Animierten Gifs gespchert werden
CursorImage:TCursorImage;
ImageList:TImageList; //Imagelist stellt "masked" zur Verfügung, um Icons zu erstellen
Stream:TMemoryStream;
i:integer;
begin
AniGif:=TBGRAAnimatedGif.Create('maus-ani.gif'); //Das animierte Gif wird geladen
for i:=0 to AniGif.Count-1 do begin //alle Bilder des animierten Gifs speichern
ABitmap:=TBitmap.Create;
AIcon:=TIcon.Create;
CursorImage:=TCursorImage.Create;
Stream:=TMemoryStream.Create;
try
AniGif.CurrentImage:=i; //nacheinander die einzelnen Bilder aufrufen
ABitmap.Width:=AniGif.Width; //Bitmap bekommt die Größe des Bitmaps vom animierten Gif
ABitmap.Height:=AniGif.Height;
ABitmap.Canvas.Brush.Color:=$000000; //Hintergrund füllen
ABitmap.Canvas.FillRect(0,0,ABitmap.Width,ABitmap.Height);
// ABitmap.TransparentColor:=$000000;
// ABitmap.Transparent:=true;
// AniGif.Transparent:=true;
AniGif.Show(ABitmap.Canvas,ABitmap.Canvas.ClipRect); //Kopieren des aktuell sichtbaren Bitmaps des animierten Gifs auf Speicher-Bitmap
ImageList:=TImageList.CreateSize(ABitmap.Width, ABitmap.Height); //einzigste Möglichkeit, die ich gefunden habe, ein Bild zu einem Icon zu konvertieren
ImageList.GetIcon(ImageList.AddMasked(ABitmap, ABitmap.Canvas.Pixels[1, 1]), AIcon);
Stream.Clear; //jetzt noch die Zuweisung der einzelnen Icons in Speicher
AIcon.SaveToStream(Stream);
Stream.Position:=0;
CursorImage.LoadFromStream(Stream);
// AIcon.SaveToFile('Ani'+inttostr(i)+'.ico');
// CursorImage.LoadFromFile('Ani'+inttostr(i)+'.ico');
Screen.Cursors[i+1]:=CursorImage.ReleaseHandle;
finally
ImageList.Free;
Stream.Free;
CursorImage.Free;
AIcon.Free;
ABitmap.Free;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SpeicherIcons;
end;
procedure TForm1.Timer1Timer(Sender: TObject); //Timer zum ständigen Tausch des Cursors (Intervall=50)
const
CursorNr:integer=1;
begin
if CursorNr=AniGif.Count then CursorNr:=1
else inc(CursorNr);
Screen.Cursor:=CursorNr;
end;
end.
Viel Erfolg!