Autor Thema: Cursorproblem ..  (Gelesen 2243 mal)

HeinzK

  • Mitglied
  • Beiträge: 25
  • Bewertung: 0
    • ZwiAner
Cursorproblem ..
« am: Juni 07, 2012, 11:13:04 »
http://en.sfml-dev.org/forums/index.php?topic=8140.msg54682#msg54682
Kann mir jemand helfen .. ich bin mir unsicher, wenn ich auf englisch diskutieren muss/will.
Ich nutze seit kurzem SFML2 und schreibe ein Spiel, dass auf Windows und Linux laufen soll. Dazu will ich (soweit möchlich) gemeinsamen Code nutzen.
Nun brauche ich einen eigenen Cursor (Sprites sind zwar eine Alternative, aber für meinen Zweck nicht ganz geeignet).
Unter Ubuntu habe ich mit X11 eine funktionierende Lösung (s.o.), aber unter Windows (s.o.) gibt es mit LoadCursor/SetCusor ein Problem.
Mein Cursor wird zwar gesetzt, aber verschwindet sofort wieder. Am Besten erkennt man das, wenn der Cursor von außerhalb in das eigene Fenster bewegt wird.
Wenn ich in der bisherigen Diskussion (s.o.) alles richtig 'verstanden' habe, verwaltet SMFL2 den Cursor selbst und überschreibt meine Änderung sofort wieder.
Zitat
It has already been discussed on the forum, you can try to find the corresponding thread. Someone even provided a cross-platform implementation for such a function.
Ich habe nach 'Cursor', 'SetCursor' und ähnlichem gesucht, aber nur meinen eigenen Beitrag gefunden.
Hat jemand damit Erfahrung und einen Lösungsvorschlag?
Bäume, die die Sicht auf einen Wald versperren, dürfen gefällt werden!

Tank

  • Administrator
  • Mitglied
  • Beiträge: 1.525
  • Bewertung: 15
Re: Cursorproblem ..
« Antwort #1 am: Juni 09, 2012, 21:42:44 »
Für das Setzten des Icons auf OS-Ebene habe ich leider keinen Vorschlag, aber SFML verwaltet keine Cursor (höchstens das Anzeigten/Verstecken). Wieso genau fällt ein Sprite für dich raus?
Don't mess with the operator.
FlexWorld - BlogSFGUI

HeinzK

  • Mitglied
  • Beiträge: 25
  • Bewertung: 0
    • ZwiAner
Re: Cursorproblem ..
« Antwort #2 am: Juni 10, 2012, 09:51:48 »
Zitat
.. SFML verwaltet keine Cursor ..
Warum wird dann mein Cursor (ich sehe ihn ja für einen kurzen Moment) von SFML wieder auf den 'Normalo' zurückgesetzt?
(Unter Ubuntu (mit Hilfe von X11) funktioniert das Ändern des OS-Cursors!) Siehe Quell-Code im englischen Forum: http://en.sfml-dev.org/forums/index.php?topic=8140.msg54364#msg54364
Zitat
.. Wieso genau fällt ein Sprite für dich raus ..
Durch Framerate/Mausabfrage hängt das Sprite nie an der aktuellen Cursorposition.
Bäume, die die Sicht auf einen Wald versperren, dürfen gefällt werden!

Tank

  • Administrator
  • Mitglied
  • Beiträge: 1.525
  • Bewertung: 15
Re: Cursorproblem ..
« Antwort #3 am: Juni 10, 2012, 12:04:02 »
Zitat
Warum wird dann mein Cursor (ich sehe ihn ja für einen kurzen Moment) von SFML wieder auf den 'Normalo' zurückgesetzt?
Da habe ich mich unglücklich ausgedrückt: Also SFML verwaltet insofern keine Cursor, als dass man eigene setzen könnte. Wenn der Mauszeiger wieder zurück in das Fenster geschoben wurde, wird sichergestellt, dass er das Zeiger-Icon annimmt (z.B. für den Fall, dass man den Zeiger versteckt).

Vielleicht kann man hier ein wenig Tricksen, um SFMLs Verhalten auszuhebeln. Ich könnte mir vorstellen, dass SFMLs Code vor dem Absenden des Fokus-Events (sf::Event::GainedFocus) abgearbeitet wird. D.h. man überschreibt dort einfach den von SFML gesetzten Cursor.

Zitat
Durch Framerate/Mausabfrage hängt das Sprite nie an der aktuellen Cursorposition.
Das kann man leicht umgehen, indem man für jegliche Abfragen, die mit der Maus zu tun haben, die zuletzt verarbeitete Position verwendet anstatt die Live-Position der Maus. Wobei die Cursor-Variante tatsächlich angenehmer ist.
Don't mess with the operator.
FlexWorld - BlogSFGUI

HeinzK

  • Mitglied
  • Beiträge: 25
  • Bewertung: 0
    • ZwiAner
Re: Cursorproblem ..
« Antwort #4 am: Juli 01, 2016, 18:08:13 »
Danke für die Hilfestellungen .. hatte leider keine Zeit mehr .. bin aber jetzt wieder dran ..
Problem inzwischen gelöst mit LoadCursorFromFile >> k_Cursor und
Code: C++
  1. //> virtual:
  2. void CKCursor::KCursorSet(void)
  3. {
  4.   #ifdef _WIN32
  5.     #ifndef KSFML
  6.       HCURSOR hC = NULL;
  7.       hC = SetCursor(hCursor);
  8.     #else
  9.       SetClassLongPtr(k_pWindow->getSystemHandle(), GCLP_HCURSOR, reinterpret_cast<LONG_PTR>(k_Cursor));
  10.     #endif
  11.   #else
  12.     #ifdef _LIN32
  13.       if (k_pDisplay != 0)
  14.       {
  15.         XDefineCursor(k_pDisplay, k_pWindow->getSystemHandle(), k_Cursor);
  16.         //> XFlush(k_pDisplay);
  17.         XFreeCursor(k_pDisplay, k_Cursor);
  18.       }
  19.     #endif
  20.   #endif
  21. }
Bäume, die die Sicht auf einen Wald versperren, dürfen gefällt werden!