[GDI+] Maussteuerung UDF

  • Moin,

    Mir ist es jetzt schon häufiger untergekommen, dass ich in einem GDI+ Fenster gerne mit der Maus etwas bewegen und ggf. zoomen möchte (Linksklick -> Drag, Mausrad -> Zoom). Jedes Mal habe ich es wieder von neuem programmiert und mich geärgert, dass immer irgendwelche Zahlen nicht gestimmt haben (z.B. bleibt der Punkt unter der Maus beim Zoomen nicht an derselben Stelle, usw). Daher gibts jetzt eine UDF dazu die hoffentlich jedem weiterhilft der dasselbe Problem hat und ein wenig "interaktivere" GDI+ Anwendungen schreiben will. Da ist es nämlich immer schön, wenn der User ein wenig Spaß haben kann und nicht alles so furchtbar statisch ist.

    Es ist eine sehr kurze (ca. 100 Zeilen [Edit: jetzt 140 [Edit2: jetzt 160]]) UDF geworden. Verbesserungsvorschläge / Korrekturen sind gerne gesehen.

    Hier noch ein Minimalbeispiel, damit man schauen kann was die UDF eigentlich macht, und wie die Anwendung ist.

    Es sind nur 3 Zeilen nötig um einem GDI+ Viewport eine Maussteuerung zu verpassen. Einfacher habe ich es nicht hinbekommen ^^

    Für Einstellungen muss man in _GDIPlus_TransformCreate nachsehen welche Variablen es gibt, in den Kommentaren steht wofür sie verwendet werden.

    Edit 16.02.23:

    - Added: $Transform.Mouse [x, y, leftDown, rightDown, ctrlID]. Wird in TransformBegin automatisch aktualisiert und kann jederzeit abgerufen werden.

    - Added: $Transform.borderX & $Transform.borderY. Damit setzt man fest wie weit das Verschieben außerhalb des eigentlichen Bereichs gehen soll.

    - Added: $Transform.zoomMin & $Transform.zoomMax. Damit setzt man fest wie weit man hinein- bzw. herauszoomen kann.

    - Added: $Transform.smoothZoom. Damit bestimmt man wie "weich" der Zoom sein soll. Ein Wert von 0 deaktiviert das Feature. Erlaubt sind alle positiven reellen Zahlen.

    - Added: $Transform.containsMouse. Wird in TransformBegin automatisch gesetzt und gibt an ob die Maus im Viewport ist oder nicht.

    - Added: _GDIPlus_TransformMouseGetPos. Gibt die Koordinaten der Maus in Weltkoordinaten an. (im Beispielskript im Tooltip angezeigt. Schaut euch die Testpixel z.B. bei 0/0 an)

    Edit: 23.02.23:

    - Added: $Transform.moveButton. Hier kann man $_GDIPT_LEFT, $_GDIPT_RIGHT, $_GDIPT_MIDDLE angeben.

    - Added: $Transform.primaryDown. Hier kann man ablesen ob der bei moveButton gewählte Button gerade gedrückt ist.

    - Updated: Beispielskript, zur besseren Demonstration wozu man die Weltkoordinaten verwenden kann (z.B. um Objekte mit der Maus zu verschieben)

    - Beispiel, Links: Drag mit Mausradklick (middle), Objekte einzeln mit Linksklick auswählen und verschieben.

    - Beispie, Rechts: Drag mit Linksklick, Objekte mit Rechtsklick verschieben. (Soll demonstrieren, dass man auch interaktive Sachen innerhalb einer Trafo machen kann).

    lg

    M

  • Sehr schön!

    Ich würde aber noch, innerhalb von $Transform, sämtliche Ergebnisse der Funktion _WinAPI_Mouse_Event() und/oder GUIGetCursorInfo() dem User zur Verfügung stellen.

    Dann stehen sämtliche mausspezifischen Events bzw. deren Ergebnisse, in einer Variablen ($Transform)

  • Probier das hier mal aus. Ist es das was du meinst?

    Mausinfo bekommt man jetzt per $Transform.Mouse, WorldSpace Koordinaten bekommt man via _GDIPlus_TransformMouseGetPos($Transform). Außerdem (weil es eh berechnet wird) gibts in $Transform.containsMouse noch die Info ob die Maus gerade im Rechteck ist. Vermutlich kann man das noch in $Transform.Mouse.inside oder ähnliches verschieben, ich bin aber kein Meister der Namensgebung, daher keine Ahnung.

    Einstellungen die Hinzugekommen sind:

    - Zoom Begrenzung (Min und Max)

    - Translation Begrenzung (via BorderX und BorderY implementiert)

    Ich habe mich dafür entschieden $Transform.einstellung, oder $Transform.information zu verwenden anstatt jede einzelne Sache in eine Funktion zu wrappen. Es ist meines Erachtens nach dumm 10 Funktionen zu schreiben, wenn man die Werte sowieso direkt setzen kann. Wenn man wissen will was alles einstellbar ist muss man eben in _GDIPlus_TransformCreate nachlesen was es alles gibt und was es alles macht.

    Neues Beispielskript das Zeigt was dazugekommen ist. Für die WorldSpace Koordinaten sind extra ein paar Testpixel gesetzt die man sich reingezoomt ansehen kann um zu schauen wie die Koordinaten aussehen.

    Edit1: Startpost geupdated.

    Edit2: Code entfernt, im Startpost ist der "richtige" Code.

    lg

    M

  • Ich habe mich dafür entschieden $Transform.einstellung, oder $Transform.information zu verwenden anstatt jede einzelne Sache in eine Funktion zu wrappen. Es ist meines Erachtens nach dumm 10 Funktionen zu schreiben, wenn man die Werte sowieso direkt setzen kann. Wenn man wissen will was alles einstellbar ist muss man eben in _GDIPlus_TransformCreate nachlesen was es alles gibt und was es alles macht.

    Genau so hatte ich mir das vorgestellt. So kann man auch, je nach individueller Anforderung, eigene $Transform.-Parameter/Variablen erzeugen, die dann im $Transform-"Namespace" liegen. :klatschen: