Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Animirten Cursor in exe einbinden? (https://www.delphipraxis.net/12499-animirten-cursor-exe-einbinden.html)

negaH 30. Nov 2003 14:08

Re: Animirten Cursor in exe einbinden?
 
Wer ist auf die Idee gekommen CreateIconFromResource() zu benutzen um eine ANICURSOR Resource zu laden ?? Soviel ich weiß unterstützt diese Funktion keine ANICUROR's.

Gruß Hagen

scp 30. Nov 2003 14:14

Re: Animirten Cursor in exe einbinden?
 
Zitat:

Zitat von negaH
Wer ist auf die Idee gekommen CreateIconFromResource() zu benutzen um eine ANICURSOR Resource zu laden ?? Soviel ich weiß unterstützt diese Funktion keine ANICUROR's.

Gruß Hagen

Wie wärs mit.... ausprobieren? Bei mir funzt es wunderbar.

PS: Wenn man das Handle einem TIcon zuweist, wird natürlich nur das erste Bild der ANI zugewiesen, wenn man es aber tatsächlich als Cursor verwendet, wirds auch animiert.

Delphi-Noobie 30. Nov 2003 16:29

Re: Animirten Cursor in exe einbinden?
 
klappt leider immer noch nicht! Er stürzt zwar nicht mehr ab, wenn ich den Button klicke aber er wechselt auch nicht den Cursor :(
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{$R cursorausgelastet.res}
function LoadAniCursor(hInst : Cardinal; lpID : PChar; lpType : PChar = nil) : HCURSOR;
var
  hRes : HRSRC;
  dwSize : DWORD;
  hGlob : HGLOBAL;
  pBytes : PBYTE;
begin
  result := 0;

  If not Assigned(lpType) then
    lpType := PChar('ANICURSOR'); // Muss hier wirklich Anicursor stehen oder der Name vom Cursor?

  If (Cardinal(lpID) < $10000) then
    hRes := FindResource(hInst, PChar('#' + IntToStr(Cardinal(lpID))), lpType)
  else
  If (StrToIntDef(StrPas(lpID), 0) <> 0) then
    hRes := FindResource(hInst, PChar('#' + StrPas(lpID)), lpType)
  else
    hRes := FindResource(hInst, lpID, lpType);

  dwSize := SizeofResource(hInst, hRes);
  hGlob := LoadResource(hInst, hRes);
  If (hGlob <> 0) then
    begin
      pBytes := PBYTE(LockResource(hGlob));
      If Assigned(pBytes) then
        result := HCURSOR(CreateIconFromResource(pBytes, dwSize, FALSE, $00030000));
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var ID : tcursor;
begin
ID := 10;
Screen.Cursors[ID] := LoadAniCursor(hInstance, '1'); // in der Function sind 3 Parameter.. Warum
screen.cursor:= ID;                                 // hier nur 2?
end;

end.
PS: @SCP..wenns bei dir alles wunderbar klappt poste doch mal bitte den gesammten Code, wie ich es gemacht habe :)

scp 30. Nov 2003 17:31

Re: Animirten Cursor in exe einbinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier das funzende Beispiel im Anhang.

PS: Der dritte Parameter ist nur erforderlich, wenn der Cursor in einer anderen Section als "ANICURSOR" gespeichert ist, was im Beispiel nicht der Fall ist. Bei den Sektionennamen werden übrigens nur Großbuchstaben verwendet.

Delphi-Noobie 30. Nov 2003 18:01

Re: Animirten Cursor in exe einbinden?
 
LoL ich habe gerade rausgefunden, dass die Anwendung auf Klick zwar zu deinem Cursor changed aber nicht zu meinen? Woran liegt das?
Ps: Wie kann ich den zum download anbieten hier, damit du ihn mal testen kannst? ich weis das noch nicht , da ich erst seit kurzem hier bin :)

scp 30. Nov 2003 21:35

Re: Animirten Cursor in exe einbinden?
 
Wenn du auf Antwort gehst ist ganz unten unter dem Textfeld die Rubrik "Attachment hinzufügen", dort klickst du auf "Durchsuchen" und wählst deine Datei aus. Danach kannst du ganz normal "Absenden".

Delphi-Noobie 1. Dez 2003 14:40

Re: Animirten Cursor in exe einbinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok hier der Anicursor der nicht klappt zum download :)

scp 1. Dez 2003 16:40

Re: Animirten Cursor in exe einbinden?
 
So, habs jetzt getestet. Es liegt daran, das der Cursor 256 Farben hat, die Funktion CreateIconFromResource() unterstützt aber nur max. 16 Farben. Habe noch keine Ausweg abgesehen von dem nicht so tollen LoadCursorFromFile() gefunden.

Delphi-Noobie 1. Dez 2003 16:57

Re: Animirten Cursor in exe einbinden?
 
Ok ich hoffe du findest die Lösung :) Ich versuch auch mal irgendwas, was wahrscheinlich eher erfolglos bleiben wird :oops:

scp 4. Dez 2003 02:56

Re: Animirten Cursor in exe einbinden?
 
So, nach reiflicher Überlegung hab ich LoadCursorFromFile doch eingebaut:

Delphi-Quellcode:
function CreateAniCursorFromResource(pBytes : pByte; dwSize : DWORD) : HCURSOR;
var
  fs : TFileStream;
  td : array[0..255] Of Char;
  tfn : string;
begin
  result := 0;

  result := CreateIconFromResource(pBytes, dwSize, FALSE, $00030000);

  If (result = 0) and
      (PCardinal(pBytes)^ = $46464952) and // RIFF word
      (PCardinal(Integer(pBytes) + $08)^ = $4E4F4341) then // ACON word
    begin
      GetTempPath(255, td);
      Randomize;
      tfn := StrPas(td) + 'temp' + Format('%0:4.4x', [Random($FFFF)]) + '.ani';
      fs := TFileStream.create(tfn, fmCreate);
      try
        fs.Write(pBytes^, dwSize);
      finally
        fs.Free;
      end;
      result := LoadCursorFromFile(PChar(tfn));
      DeleteFile(tfn);
    end;
end;

function LoadAniCursor(hInst : Cardinal; lpID : PChar; lpType : PChar = nil) : HCURSOR;
var
  hRes : HRSRC;
  dwSize : DWORD;
  hGlob : HGLOBAL;
  pBytes : PBYTE;
begin
  result := 0;

  If not Assigned(lpType) then
    lpType := PChar('ANICURSOR');

  If (Cardinal(lpID) < $10000) then
    hRes := FindResource(hInst, PChar('#' + IntToStr(Cardinal(lpID))), lpType)
  else
  If (StrToIntDef(StrPas(lpID), 0) <> 0) then
    hRes := FindResource(hInst, PChar('#' + StrPas(lpID)), lpType)
  else
    hRes := FindResource(hInst, lpID, lpType);

  dwSize := SizeofResource(hInst, hRes);
  hGlob := LoadResource(hInst, hRes);
  If (hGlob <> 0) then
    begin
      pBytes := PBYTE(LockResource(hGlob));

      If Assigned(pBytes) then
        begin
          result := CreateAniCursorFromResource(pBytes, dwSize);
        end;
    end;
end;
Dabei wird die Datei aber nur für ein paar Milisekunden benötigt und direkt nach dem laden des Cursors wieder gelöscht. Kann man doch mit leben, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz