Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gelöschter Benutzer

unregistriert

1

21.09.2014, 18:24

WinAPI: HCURSOR auf IDC_* zurückführen

Guten Abend,
ich stehe gerade etwas auf dem Schlauch und Google warf mir auch nichts brauchbares entgegen. Das Problem ist folgendes:
Über eine Bibliotheksfunktion habe ich einen HCURSOR vorliegen. Da ich mit einem HCURSOR jedoch nichts anfangen kann, weil der Wert dynamisch ist, brauche ich irgendwie eindeutige IDs, die auf jedem Windows PC und nach jedem Programmstart die selben sind.
Im MSDN finde ich keine Funktionen, über die ich eine eindeutige ID bekommen könnte (wahrscheinlich, weil Cursor dynamisch nachgeladen werden können).

Da ich aber nur mit den Standardcursorn, die bei der LoadCursorDoku gelistet sind, arbeite, wäre eine Idee, den Cursor auf ein IDC_* Makro/Konstante zurückzuführen.

Die einizge Lösung, die mir dazu spontan einfällt, ist folgende:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
// Alle genutzten Cursor laden
HCURSOR hArrow = LoadCursor(NULL, IDC_ARROW);
HCURSOR hWait = LoadCursor(NULL, IDC_WAIT);
// ...

// Cursor später abfragen per
if (hCursor == hArrow)
    // Arrow
else if (hCursor == hWait)
    // Wait


Da die Cursor jedoch nicht von mir, sondern der kompilierten Bibliothek geladen werden, halte ich diese Lösung für nicht ganz optimal, um die Cursor nicht unnötigerweise mehrfach in den Speicher zu laden (obwohl die Frage ist, ob das überhaupt passiert). Kennt jemand eine bessere Lösung, um an eindeutige CursorIDs (für die Standardcursor) zu kommen oder den HCURSOR, auf einen IDC_*-Wert zurückzuführen?

Viele Grüße

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Justus96« (21.09.2014, 18:49)


2

21.09.2014, 18:32

Das geht meiner meinung nicht. Wozu brauchst denn sowas ?

Gelöschter Benutzer

unregistriert

3

21.09.2014, 18:46

Ich bin derzeit dabei einen Browser mithilfe von CEF (Chromium Embedded Framework) in einen Spiel-Mod einzubetten, der sich über die eingebettete Scriptsprache Lua steuern lässt. Dabei geht es konkret um die Implementierung eines Events namens "onClientBrowserCursorChange", das ausgeführt wird, wenn der Cursor sich ändert.

CEF bietet dazu die virtuelle Funktion OnCursorChange und liefert ein HCURSOR-Handle mit (CefCursorHandle == HCURSOR).
Da es von Lua aus jedoch keine Möglichkeiten gibt, auf die WINAPI zuzugreifen, muss ich die Cursor Handles serialisieren/mit einer eindeutigen ID versehen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Justus96« (21.09.2014, 18:58)


4

21.09.2014, 20:18

Ich vermute, du willst den Cursor ingame so abändern, dass er dem des Browsers entspricht. Für alles andere bringt dein Vorhaben keinen Sinn.

Du kannst das nicht direkt machen. Was du aber machen kannst, ist, folgende Tatsache zu nutzen:

Zitat

The LoadCursor function loads the cursor resource only if it has not been loaded; otherwise, it retrieves the handle to the existing resource
aus http://msdn.microsoft.com/en-us/library/…1(v=vs.85).aspx

D.h. Du lädst die entsprechenden Cursor, die du vergleichen willst und Vergleichst die mit deinem gegebenen HCURSOR. Dass das keine saubere Lösung ist, sollte jedoch auch erwähnt werden, da diese Methode imho nicht funktioniert, wenn die Cursor in unterschiedlichen hInstances geladen sind.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Gelöschter Benutzer

unregistriert

5

21.09.2014, 22:17

Zitat von »iSmokiieZz«

Ich vermute, du willst den Cursor ingame so abändern, dass er dem des Browsers entspricht. Für alles andere bringt dein Vorhaben keinen Sinn.

Nicht direkt. Das Ziel ist es, wie bereits oben angedeutet, eine Schnittstelle (--> https://wiki.multitheftauto.com/wiki/Cli…pting_Functions ; https://code.google.com/p/mtasa-blue/sou…re/CWebView.cpp) zu entwickeln, wodurch sich der Browser per Lua steuern lässt (was insgesamt auf folgendes hinausläuft: https://www.youtube.com/watch?v=9w2qU6mZDh8). Was letztendlich aus dem CursorChange-Event gemacht wird, ist daher nicht meine Sache (es würde jedoch vermutlich darauf hinauslaufen, eigene Cursor zu zeichnen).

Zitat von »iSmokiieZz«


Zitat

The LoadCursor function loads the cursor resource only if it has not been loaded; otherwise, it retrieves the handle to the existing resource

Den Satz habe ich wohl überlesen, danke. Dann sollte der Codeschnispel oben wohl doch einigermaßen in Ordnung gehen. Das mit den unterschiedlichen HINSTANCEs ist kein Problem, da ich ja problemlos an die Handles der anderen Module und dementsprechend auch an die geladenen Cursor komme.

Werbeanzeige