Entwickler-Ecke

Windows API - Maus Zeiger ändern


René R.Fo. - Mo 25.05.09 14:42
Titel: Maus Zeiger ändern
Hallo Ich wolte wissen ob man die maus mit einem Bild B.z. Cursor ''Belegen'' Kann?
d.h. nicht mit der eigenschaft Cursor, sonder einer .cur Dartei (Cursor Datei)/ .bmp Datei.


Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am Mo 25.05.2009 um 15:29


BenBE - Mo 25.05.09 14:46

Du musst diesen Cursor mit LoadCursor laden und das zugehörige Handle dann der Mouse.Courser-Eigenschaft zuweisen. Freigeben am Ende deines Programms nicht vergessen.


Yogu - Mo 25.05.09 15:13

Vorher musst du den Cursor aber noch als Ressource einbinden. Das geht zum Beispiel mit dem in Delphi mitgelieferten Programm, das du im Menü "Tools" findest. Dann kannst du LoadCursor so aufrufen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
const crMyCursor = 1;

var CursorHandle: THandle;
begin
  CursorHandle := LoadCursor(HInstance, 'NameDerRessource');
  if CursorHandle <> 0 then Screen.Cursors[crMyCursor] := CursorHandle;
end;

Die Konstante crMyCursor kannst du dann nachher z.B. statt crHourGlass oder crArrow verwenden. Verwende nur positive Werte, die negativen sind für die Standard-Cursors vorbehalten.


René R.Fo. - Di 26.05.09 14:33

Das klappt irgendwie nicht der Zeiger ändert sich nicht


jaenicke - Di 26.05.09 14:41

Aber die neue Mauszeigerkonstante hast du dann auch benutzt um sie irgendwo zuzuweisen, z.B. an FormX.Cursor?


René R.Fo. - Mi 27.05.09 14:42

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Aber die neue Mauszeigerkonstante hast du dann auch benutzt um sie irgendwo zuzuweisen, z.B. an FormX.Cursor?

Nein habe ich nicht. W muss ich das denn einsetzen

z.B. an FormX.Cursor?

Form1

Moderiert von user profile iconNarses: Zitat gekennzeichnet.


jaenicke - Mi 27.05.09 14:45

Naja, nach dem Laden des Cursors musst du den auch benutzen, also der Eigenschaft Cursor z.B. deines Formulars zuweisen, wie gesagt.


ffgorcky - Mi 27.05.09 19:10

Also wenn ich das gerade richtig überblicke, dann müsste es doch zum Beispiel so gehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure Form1.CursorAendern();
 const crMyCursor = 1;
 var CursorHandle: THandle;
begin
  CursorHandle := LoadCursor(HInstance, 'NameDerRessource');
  if not CursorHandle=0 then 
     begin
     Screen.Cursors[crMyCursor] := CursorHandle;
     end;
end;

- Oder?
Wobei Du dann die procedure Form1.CursorAendern(); erst mal oben noch unter Public oder private declarieren müsstest, damit Du vor den Procedur-Namen "Form1." schreiben kannst.
- Sonst reicht es, wenn Du das ganze ohne das "Form1." ziemlich zu Anfang Deines Quelltextes schreibst.


jaenicke - Mi 27.05.09 19:16

Da fehlt aber wie gesagt noch die Benutzung des damit geladenen Cursors. ;-)


ffgorcky - Mi 27.05.09 19:29

Jaenicke meinte gerade per PN, dass man dann auch noch dieses setzen sollte:

Delphi-Quelltext
1:
Form1.Cursor := crMyCursor;                    

So gut kenne ich mich leider nun auch wieder nicht in dem Gebiet aus, also wenn er das sagt...


jaenicke - Mi 27.05.09 19:35

Ja, hatte ich oben ja auch schon geschrieben, dass der neue Cursor auch zugewiesen werden muss.


Yogu - Mi 27.05.09 21:36

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Also wenn ich das gerade richtig überblicke, dann müsste es doch zum Beispiel so gehen

Ach nee - das ist exakt mein Codebeispiel, wenn auch schlechter formatiert :P


jaenicke - Mi 27.05.09 21:41

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Also wenn ich das gerade richtig überblicke, dann müsste es doch zum Beispiel so gehen

Ach nee - das ist exakt mein Codebeispiel, wenn auch schlechter formatiert :P
Nein, deins funktionierte, seine Änderung nicht...
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  if not CursorHandle=0 then                    
Denn das ist nicht gleich dem Original...
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  if CursorHandle <> 0 then                    


Yogu - Mi 27.05.09 21:50

Hoppla, hab ich übersehen. In C(++|#) hätte is IMHO funktioniert (da wird ! als bool'scher Operand angesehen), aber in Delphi wird dann ja erst CursorHandle bitweise invertiert und dann auf <> 0 überprüft. Klappt nicht, denn ein invertiertes Handle ist so ziemlich immer <> 0 ;)


René R.Fo. - Do 28.05.09 19:51

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Hoppla, hab ich übersehen. In C(++|#) hätte is IMHO funktioniert (da wird ! als bool'scher Operand angesehen), aber in Delphi wird dann ja erst CursorHandle bitweise invertiert und dann auf <> 0 überprüft. Klappt nicht, denn ein invertiertes Handle ist so ziemlich immer <> 0 ;)

Toll, hilfreich, Egel :lol: :roll: :wink: .

Irgend wie gibt es ein Problem Bei der Wandlung des Cursors denn der PC wandelt ihn nicht ich habe alles doppelt getestet und euer gepostetes mit einbezogen.

Moderiert von user profile iconNarses: Quote-Tags hinzugefügt.


jaenicke - Do 28.05.09 19:55

Wie hast du die Ressource jetzt erstellt? Also wie sieht ggf. das .rc Skript aus und wie sieht dein aktueller Quelltext aus?


Yogu - Do 28.05.09 20:26

user profile iconRené R.Fo. hat folgendes geschrieben Zum zitierten Posting springen:
Hoppla, hab ich übersehen. In C(++|#) hätte is IMHO funktioniert (da wird ! als bool'scher Operand angesehen), aber in Delphi wird dann ja erst CursorHandle bitweise invertiert und dann auf <> 0 überprüft. Klappt nicht, denn ein invertiertes Handle ist so ziemlich immer <> 0


Toll, hilfreich, Egel :lol: :roll: :wink: .

In C#:

C#-Quelltext
1:
if (!CursorHandle == 0)                    

könnte man mit "Windschutzklammern" (wie sie mein früherer Mathelehrer immer genannt hat) versehen, ohne dass sich wirklich was verändedrt:


C#-Quelltext
1:
if (!(CursorHandle == 0))                    

Also: Zuerst wird innen verglichen, dann wird außen invertiert. Denn man arbeitet sich in der Mathematik ja immer von der innersten Klammer zur äußersten :idea:


In Delphi:

Delphi-Quelltext
1:
if not CursorHandle = 0                    

hieße


Delphi-Quelltext
1:
if (not CursorHandle) = 0                    

Hier sieht man, dass zuerst CursorHandle invertiert wird, und dann das ganze auf 0 geprüft wird. Und eben das wollen wir nicht.

Das aber nur am Rande, ich hatte grad ein bisschen zu viel Zeit ;)


jaenicke - Do 28.05.09 20:30

So, ich habe gerade eine Demo in einem ähnlichen Thema gepostet...
http://www.delphi-forum.de/viewtopic.php?p=564373#564373


René R.Fo. - Mo 01.06.09 16:08

Danke :zustimm: :flehan:

Nurnoch wo Kann ich die Datei Laden?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm185.FormCreate(Sender: TObject);
var
  CursorHandle: THandle;
begin
  if CursorHandle <> 0 then
    Screen.Cursors[crMyCursor] := CursorHandle;
  Self.Cursor := crMyCursor;
end;

Wo wird das den geladen? Ich hatte gedacht das dass ihr wäre.


Delphi-Quelltext
1:
CursorHandle := LoadCursor(HInstance, 'Test');                    


allerdings ist in den Ordner keine Datei mit den Namen
in der Resorss Datei steht auch nichts bitte erklärt mir das :nixweiss: den ich versehe das nicht.

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


Timosch - Mo 01.06.09 16:18

Wie schon oben beschrieben: Du musst die Datei als Ressource einbinden. Wie, steht weiter oben.


jaenicke - Mo 01.06.09 16:26

Und die dafür notwendigen Dateien sind ja auch alle dabei... Ressourcenskript, die Batchdatei zum Kompilieren, der Cursor...


René R.Fo. - Mo 01.06.09 16:47

^^Wo den in dem anderem steht nichts und hir auchnicht oder habe ich das übersehen?


jaenicke - Mo 01.06.09 16:51

Schau dir die mitgelieferten Dateien in der Demo einmal an, da ist die .rc Datei, die den Cursor einbindet, dir .bat, die die Ressource kompiliert und in dem Projekt wird die kompilierte .res dann eingebunden.

Sonst kannst du auch nach Delphi Ressourcen suchen oder so. ;-)
Die entsprechende Seite [http://jansfreeware.com/articles/delphiresource.html] habe ich in dem anderen Thread [http://www.delphi-forum.de/viewtopic.php?p=564206#564206] auch verlinkt.


René R.Fo. - Mo 01.06.09 17:14

Dake aber wo kommt der Name 'Test' her?
CursorHandle := LoadCursor(HInstance, 'Test');


jaenicke - Mo 01.06.09 17:16

Hast du einmal in das Ressourcenskript (.rc) geschaut...
Und den Link angeschaut?
Zitat:
Create the resource file script.

Every line consist of a resource name, a resource type and the resource.

In the example below support is the resource name, HTML is the resource type and "support.html" is the resource.

support HTML "support.html"


René R.Fo. - Mo 01.06.09 17:24

Nein nicht wirklich ich bin kein fän von Englich bitte erkläre es
So das anfänger(bis Fortgeschriten) es verstehen können.


jaenicke - Mo 01.06.09 17:26

Ohne Englisch kommt man als Programmierer nicht weit...
Das solltest du lieber zuerst lernen.

Wie gesagt: Das steht in dem Ressourcenskript, der .rc Datei, die eben sagt was in die Ressource kompiliert werden soll. Die ist bei der Demo doch dabei...


René R.Fo. - Mo 01.06.09 17:41

Wenn ich des richtig verstehe

{$R CursorRes.res}

ist der ''Übersetzer'' Der res Datei

if CursorHandle <> 0 then
Screen.Cursors[crMyCursor] := CursorHandle;
Self.Cursor := crMyCursor;

ist zum umwandel der Maus

CursorHandle := LoadCursor(HInstance, 'Test');

Laden der Maus
aber Was Lädt er den mit Test Das verstehe ich nicht


jaenicke - Mo 01.06.09 17:47

Wie oft denn noch? Das steht in der .rc Datei...

Quelltext
1:
Test  CURSOR  Cursor1.cur                    
Das sagt dem Ressourcencompiler, dass er in die Ressourcendatei (.res) die Datei Cursor1.cur unter dem Namen Test und als Typ CURSOR packen soll.

Oder hast du etwa die Dateierweiterungen (.exe, .rc, ...) bei dir ausgeblendet? :shock:
Dann schau dir diese Zusatzbemerkung an:
http://www.delphi-library.de/viewtopic.php?p=540052#540052


René R.Fo. - Mo 01.06.09 17:57

Soryy ich hate immer die Project185 Datei geöffnet
ist jetzt inordnung