Systemcursor setzen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Systemcursor setzen

Beitrag von markkowalt »

Hallo,

weiß jemand, wie man den Systemcursor setzen kann ?

Ich hätte die entsprechende Datei im *.cur-Format, falls die notwendig wäre...
SetSystemCursor klappt nicht (passiert nichts / cursor ändert sich nicht.)

Vielen Dank.

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: Systemcursor setzen

Beitrag von markkowalt »

Ok, bin jetzt soweit gekommen:

Code: Alles auswählen

procedure CursorChange(Show: boolean);
var
  cursor1: HCursor;
begin
  cursor1 := LoadCursorFromFile('a.cur');
  if Show then
    SystemParametersInfo(SPI_SETCURSORS, 0, 0, WM_SETTINGCHANGE or SPIF_UPDATEINIFILE)
  else
    SetSystemCursor(cursor1, OCR_NORMAL);
end;
(Die Datei "a.cur" existiert im selben Verzeichnis wie die *.exe und der Rest!)

unit1.pas(39,46) Error: Incompatible type for arg no. 3: Got "ShortInt", expected "Pointer"

:?:

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Systemcursor setzen

Beitrag von MAC »

schau mal ob hier das eventuell so ersetzt werden muss:

Code: Alles auswählen

SystemParametersInfo(SPI_SETCURSORS, 0, 0, WM_SETTINGCHANGE or SPIF_UPDATEINIFILE)

Code: Alles auswählen

{a} SystemParametersInfo(SPI_SETCURSORS, nil, 0, WM_SETTINGCHANGE or SPIF_UPDATEINIFILE)
{b} SystemParametersInfo(SPI_SETCURSORS, 0, nil, WM_SETTINGCHANGE or SPIF_UPDATEINIFILE)
{c} SystemParametersInfo(SPI_SETCURSORS, nil, nil, WM_SETTINGCHANGE or SPIF_UPDATEINIFILE)

Code: Alles auswählen

Signatur := nil;

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: Systemcursor setzen

Beitrag von markkowalt »

Ja!

Sehr gut, Variante (b) hat geklappt!

Danke dir!

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: Systemcursor setzen

Beitrag von markkowalt »

Aber jetzt ist der Cursor in der linken oberen Ecke.

Damit meine ich, dass Cursorpos.x/y nicht da ist, wo es sein soll, sondern links oben vom Cursor-Bild.

Wie ikannn man das öndern?

Und etwas nicht ganz so dringendes: Kann man auch ANI-Cursor einbinden ?

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Systemcursor setzen

Beitrag von MAC »

ich weis, das das besonderer einer .cur datei ist, das diese auch speichert wo genau der Cursor ist, sozusagen der Mittelpunkt des Cursors...
Wie man das einbindet weis ich nicht, wenn du eigene Cur dateien verwendest (was sinn ergibt) würde ich erstmal nen standart Cursor laden und schauen ob dieser richtig dargestellt wird...

Hast du schonmal versucht einfach ne .ani einzubinden ?

Code: Alles auswählen

Signatur := nil;

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: Systemcursor setzen

Beitrag von markkowalt »

MAC hat geschrieben:ich weis, das das besonderer einer .cur datei ist, das diese auch speichert wo genau der Cursor ist, sozusagen der Mittelpunkt des Cursors...
Da könnte ich mal mit einem Hexeditor schauen...
MAC hat geschrieben:Wie man das einbindet weis ich nicht, wenn du eigene Cur dateien verwendest (was sinn ergibt).
Ja...
MAC hat geschrieben: würde ich erstmal nen standart Cursor laden und schauen ob dieser richtig dargestellt wird...
Habe einen Windows-Cursor von "c:\WINDOWS\Cursors" genommen (3dsmove.cur) dessen Mittelpunkt nicht links oben im Bild ist - und es funktioniert!
MAC hat geschrieben:Hast du schonmal versucht einfach ne .ani einzubinden ?
Ja, über die Ressource ging es nicht (invalid... ???.. ani??).
Aber ich habe es jetzt mal temporär geschafft, direkt per Datei zu laden!
Und das hat geklappt!
Bild


Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Windows, Useful;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button_Fload: TButton;
    Button_ST: TButton;
    Button2: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button_FloadClick(Sender: TObject);
    procedure Button_STClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1:      TForm1;
  FingerCursor, NormalCursor: HCursor;
  FileCursor: HCursor;
 
implementation
 
{ TForm1 }
 
procedure CursorChange(CursorName: HCursor);
begin
  SetSystemCursor(CursorName, OCR_NORMAL);
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  CursorChange(FingerCursor);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  CursorChange(NormalCursor);
end;
 
procedure TForm1.Button_FloadClick(Sender: TObject);
begin
  FileCursor := LoadCursorFromFile(PChar(Edit1.Text));
  CursorChange(FileCursor);
end;
 
procedure TForm1.Button_STClick(Sender: TObject);
begin
  SystemParametersInfo(SPI_SETCURSORS, 0, nil, WM_SETTINGCHANGE or SPIF_UPDATEINIFILE);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  FingerCursor := LoadCursorFromLazarusResource('Finger1');
  NormalCursor := LoadCursorFromLazarusResource('Normal');
end;
 
initialization
  {$I unit1.lrs}
  {$I cursr.lrs}
 
end.
Jetzt probier ich noch, das mit dem ANI per Ressource zu erledigen...
edit:
---->
Bild

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: Systemcursor setzen

Beitrag von markkowalt »

So, habe jetzt herausgefunden, wie man es machen kann!
  • Greenfish Icon Editor
  • Neu - Cursor
  • Größe wählen (z.B. (16px)² )
  • "Hotspot" wählen:
    Bild
  • Hotspot setzen, also positionieren (dazu am blinkenden "X" ziehen):
    Bild
Dann speichern und wie mein Code zeigt, halt einbinden!

Wie man eine ANI per Ressource einbindet, ist mir noch nicht klar!

MARK

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Systemcursor setzen

Beitrag von Socke »

markkowalt hat geschrieben:Wie man eine ANI per Ressource einbindet, ist mir noch nicht klar!
markkowalt hat geschrieben:Bild
Ressourcen werden mit einem Ressourcen-Typen und einem Namen gespeichert. Die Grafik-Klassen definieren selbst, welche Ressourcen-Typen sie unterstützen, oder überhaupt versuchen zu laden.

In dem Fall musst du einen Umweg gehen, damit die Begrenzung auf den Typ gar nicht erst überprüft werden kann:
  • Du suchst dir heraus, mit welcher Stream-Klasse du die Daten laden kannst (möglicherweise TLazResourceStream oder aus einer Datei: TFileStream).
  • Erstelle ein Objekt dieser Klasse
  • Wenn nötig, setze die Position auf 0 (Stream-Anfang)
  • Lade den Cursor von dem Stream (und nicht direkt aus einer Ressource)
  • Gebe den Stream wieder frei
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten