Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Windows API / MS.NET Framework API (https://www.delphipraxis.net/20-library-windows-api-ms-net-framework-api/)
-   -   Delphi Animierten Cursor verwenden (https://www.delphipraxis.net/63430-animierten-cursor-verwenden.html)

CalganX 18. Feb 2006 19:27


Animierten Cursor verwenden
 
scp hat einen Code zusammengestellt, der es ermöglicht einen animierten Cursor (*.ani) in einer Anwendung zu verwenden. Dabei ist darauf zu achten, dass der Cursor sich als Ressource in der Anwendung befindet.

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;

Flocke 18. Feb 2006 23:53

Re: Animierten Cursor verwenden
 
Kleine Anmerkung: die komplette Funktion "CreateAniCursorFromResource" kann man sich sparen, da Icons und Cursor vom System gleich behandelt werden.

Es funktioniert also auch so:
Delphi-Quellcode:
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');

  hRes := FindResource(hInst, lpID, lpType);
  if hRes <> 0 then
  begin
    dwSize := SizeofResource(hInst, hRes);
    hGlob := LoadResource(hInst, hRes);
    if hGlob <> 0 then
    begin
      pBytes := PBYTE(LockResource(hGlob));
      if Assigned(pBytes) then
        result := CreateIconFromResource(pBytes, dwSize, false, $30000);
    end;
  end;
end;

Robert Marquardt 19. Feb 2006 04:50

Re: Animierten Cursor verwenden
 
Die interessante Frage ist wie man in korrekt animiert.
Windows hat glaube ich immer noch den Fehler die ANIs nicht richtig zu animieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.

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