Zoomfunktion mit Mausrad vb.net

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Zoomfunktion mit Mausrad vb.net

    Hallo Liebe Gemeinde,

    hoffe ihr seit mir nicht böse wenn ich vllt ein wiederholten Beitrag hier niederschreibe bzgl. Zoom In und Zoom Out Funktion in vb.net bzw C#. Ich habe zwar freundlicherweise von einem User eine kleine Hilfestellung bekommen, die ich ja sehr auseinander nehme um zu verstehen was er damit meint. Doch bei den ein oder anderen Stück steh ich etwas auf dem Schlauch, vllt könnt ihr mir freundlicherweise mit weiter das wäre sehr nett .

    Meine Idee bzw Vorhaben ist es was bei dem Mausrad jpg Bild zu sehen ist das ich wie bei Google Maps mit dem Mausrad Zoomen In möchte alles wird größer und bei Zoomen Out alles kleiner wird. Wie gesagt diese Funktion hat Google Maps auch mit den Orten hinein Zoomen und wieder Heraus Zoomen.


    Vielen Herzlichen Danke für eure Hilfe oder Orientierung

    DerLaie
    Bilder
    • Zoomfunktion Mausrad.JPG

      152,68 kB, 1.572×627, 137 mal angesehen
    • Mausrad.JPG

      171,27 kB, 1.668×1.001, 131 mal angesehen
    Was sehen wir auf dem 2. Bild? Was hat das mit dem Problem zu tun? Was hast Du bisher geschafft und welches Feature hast Du noch nicht geschafft? Oder anders: Liste mal bitte Deine Schritte auf, die Du glaubst erreichen zu müssen, um das Problem zu lösen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo ihr beide

    ich weis nicht wie ich die RectangleShape1 und die Lineshare Control in die Control Sache mit einbauen kann was mir VaporiZed mir geschickt hatte damit ich diese Zoom Funktion ausführen kann, und Auch diese Zoomfactor mir fehlt diese Orientierungshilfe mit mir einer eine Vorlage kurz zeigen kann mit meinen Problemen und ich damit weiter arbeiten kann so als Hilfsweg

    LG DerLaie
    Bitte überarbeite Deinen letzten Post.
    Ich blicke überhaupt nicht, was Du sagen willst.
    Da Du wohl kein Fan von Punkt und Komma bist, schreibe bitte einen Satz pro Zeile.
    Schreibe sie so einfach wie möglich.
    Verwende keine langen Sätze.
    Probiere es mit maximal 8 Wörtern pro Satz.
    Benutze keine Erklärungen mit Fremdwörtern, wenn Du nicht absolut bei deren Bedeutung sicher bist. Beispiel: Lineshare Control
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich brauche das, was Du in Post#4 sagen wolltest (und zwar in der Form, wie ich es in Post#5 beschrieben habe) und Antworten auf das, was ich in Post#3 gefragt habe.

    btw: Damit es nicht heißt, dass das Problem nicht lösbar ist, hier der Gegenbeweis als Video, nicht als Code.

    ##########

    Und nochmal ein Video, schnell zusammengeschustert.
    Dateien
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    hier eine kleine Liste was ich vor habe:

    mit den Windows Forms Control, (Lineshape, Ovalshape, RectangleShape) möchte ich eine Art Straßennetz erstellen.
    Mit Gebäuden und Straßen wie bei einem Stadtplan, nur halt mit Umrissen der Gebäude und Wege und Straßen.
    Ist mein Stadtplan fertig, möchte ich mit der Zoomfunktion Hinein zoomen und auch wieder heraus zoomen können.( Wobei beim Heraus zoomen dann jeweils die Gebäude verschwinden und dann nur noch die Straßen zu erkennen sind).
    Um so mehr heraus gezoomt wird um so mehr kleiner Umrisse von Gebäuden verschwinden, und Umrisse von Größeren Gebäuden sind zu erkennen Ich meine Solche Funktion hat auch Google Maps.

    Mit freundlichen Grüßen DerLaie

    hoffe es ist etwas verständlich

    KLIEMANNSLAND trifft WUNDERLAND - Gerrits Tagebuch #78 - YouTube Bitte bei Zeit 8:00 Min erst angucken,

    da ist diese Funktion gezeigt ( diese Doku geht zwar 23:31 min ) Diese Zoomfunktion wird erst ab 8:00 min vorsetzend >> gezeigt )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Der Laie“ ()

    Diesen Post von Dir verlink ich mir. Das ist ein Text, den man endlich mal problemlos versteht. Respekt. Du kannst es also, wenn Du willst. Das merke ich mir. Für Dich zum Positiven. :thumbup: Bitte weiter so (auch falls es Kraft kostet)

    Zurück zum Kontext:
    Du hast nun geschrieben, was Du machen willst. Das Problem: Wir wissen noch nicht, was Du hast. Und Du arbeitest nun nicht mehr mit Bildern (siehe meine beiden Videos), sondern nun mit Shapes. Das geht dann fast in Richtung Vektorgrafik, da Du nun keine Bilder mehr im Gesamten zoomst/skalierst, sondern nun Größen einzelner Shapes/Formen/Grafikteile beeinflussen musst. Wenn das Dein Ziel ist, bringt Dir meine Zoomfunktion nichts, weil Du nun mit anderen Grundlagen arbeitest. Daher wäre das erste Ziel, Shapes zu verändern. Versuche als ersten Schritt ein OvalShape in einer bestimmten Größe per Code zu zeichnen und dann erstmal durch einen ButtonClick ein etwas größeres mit derselben Form zu zeichnen. Also: Wenn Du einen Kreis machst, mach daraus per Code einen größeren Kreis. Dann poste den Code. Denn dann kann man darauf aufbauen.

    ##########

    Die Schritte im Weiteren, damit Du weißt, wohin die Reise geht, quasi die sog. Roadmap für das Projekt (ob das jetzt Stunden, Tage oder Wochen dauert, liegt an Dir):
    • per Button-Click mit einem OvalShape einen größeren Kreis zeichnen
    • den Code so ändern, dass bei jedem weiteren Button-Click dieses OvalShape weiter vergrößert wird
    • den Code erweitern, dass beim Klick eines anderen Buttons dieses OvalShape wieder etwas verkleinert wird
    • den kleiner-/größer-machen-Code von den Buttons zum Mausrad hin verschieben, sodass diese Codes eben per Mausraddrehen ausgeführt werden
    • weitere Shapes hinzufügen
    • Positionsverschiebung mit einbauen, da das gleichmäßige Vergrößern aller Shapes nicht nach einem Kartenzoom aussieht
    • abhängig von der Mausposition den Zoom machen, damit man nicht nur im Zentrum des Bildes zoomen kann
    • alle Shapes per Mausziehen gleichzeitig verschieben, damit man das Gefühl bekommt, eine Karte zu verschieben
    • Ein- und Ausblenden von Details, wenn ein bestimmter Zoom erreicht wurde
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    wow besten Dank, einfach genial
    hast du eigentlich auch ein Messenger mit wir mal reden können, so als Idee.

    Deine Schritte sind ja Perfekt nur wie setze ich diese um bzw. wie gehe ich vor? wie fang ich an ? Code und Desing mäßig ?

    LG DerLaie

    MEGA Virtual Reality Experience - Wunderland-Update #14 - YouTube 4:52 kurz angucken,

    da kann man direkt Vorlage sehen. Sozusagen der Ursprung meiner Idee bzw. meiner Vorlage. Da ist auch sehr gut eine Karte zu erkennen mit vielen bunten Punkten und den Umriss um was es eigentlich geht, so eine Art Leitlinie.

    Mit freundlichen Grüßen DerLaie


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Der Laie“ ()

    Das wäre eine Möglichkeit und die ist von VaporiZed auch sehr gut und detailliert geschrieben - und langfristig die wohl beste aller Lösungen - Sie hat aber auch einen Haken: Der Aufwand das umzusetzen ist deutlich größer als mit anderen "Mitteln". Ich weiß jetzt auch nicht, wie gut du bereits in der Materie drin steckst und ob du das so hinbekommst. Deshalb hier eine Zwischenlösung, die zwar nicht an das rankommt, aber zumindest einen Mittelweg bieten kann, der eventuell sogar als Übergangslösung dienlich sein könnte, bis man die Vektoren fertig hätte:

    1. Zeichne deine Shapes fertig in der größten Auflösung.
    2. Füge sie alle zusammen als Bild, sodass eine Karte für die größte Auflösung entsteht (mit entsprechender Größe).
    3. Diese Bild fügst du in ein Control (zB PictureBox) ein, sodass es zoombar ist.
    4. Du baust ein weiteres Bild, welches die nächste Auflösung zeigt (Umrisse der Häuser weg, nur noch Straßen)
    5. Du fügst auch dieses Bild wieder ein.
    6. Du machst das nächste Bild (nur noch Hauptstraßen, etc.) solange bist du alle gewünschten Auflösungen hast.
    7. Du baust einen Zoomfaktor mittels Variable ein.
    8. Bei jedem Zoom-Event wird deine Zoomvariable verändert. Sobald sie einen von dir festgelegten Wert übersteigt, tauscht du das eine Bild mit dem nächsten aus. Das neue Bild wird dann in der Größe des anderen angezeigt und kann weiter gezoomt werden, bis es wieder einen Wert übersteigt und es wird zum nächsten Bild gewechselt.

    Achtung: Das ist jetzt keine perfekte Lösung, vor allem, weil sie nicht nahtlos ineinander übergehen wird. Aber auch viele Anbieter wie GoogleMaps arbeiten mit solchen Technologien. Der Vorteil liegt ganz klar auf der Hand, du musst dir nur Gedanken über den Zoom machen, der Rest passiert mit vordefinierten Bildern. Diese Technik ist leichter zu erlernen als Vektoren zu zeichnen oder später sogar mathematisch zu transformieren (damit Verhältnis, Relationen, etc. gewahrt bleiben).Es gibt aber auch einen entscheidenden Nachteil dieser Vorgehensweise:

    -Da die Karten als fertige Bilder zusammenstehen, müssen sie erstellt werden (ggf. kann man auch ein Bild aus mehreren Einzelbildern zusammenfügen, was später deutlich erfreuliche Auswirkungen auf Änderungen haben könnte)
    -Du musst alle Auflösungen anlegen und sie fertig einbinden.
    -Bei Änderungen musst du die komplette(n) Karte(n) (oder -Teile) neu anfassen
    -Der Arbeitsaufwand diese Karten zur Verfügung zu stellen kann mitunter sehr arbeits- und zeitintensiv sein.

    Wahrscheinlich gibt es noch weitere Vor- und Nachteile, nur musst du diese dann abwägen, ob es überwiegt oder nicht. So als Spontanidee könnte aber zumindest der Programmieraufwand relativ viel leichter sein als Vektoren auszuarbeiten (unter der Prämisse, dass man sich damit vielleicht noch nicht so gut auskennt).

    Der Laie schrieb:

    wie fang ich an ?
    Steht in Post#9

    Der Laie schrieb:

    hast du eigentlich auch ein Messenger mit wir mal reden können
    Geht das schon wieder los. Nein, habichnicht, willichnicht. Ich arbeite hier kostenlos (und manchmal auch umsonst) öffentlich im Forum mit. Das muss reichen. Für alles andere ist mir meine Freizeit zu wichtig.
    @PadreSperanza: Da das aber - soweit ich verstanden habe - auch mit beweglichen Punkten/Formen sein soll, wird das nix bringen. Sonst wär ich eben noch auf die Idee gekommen, dass alles wirklich mit Vektorgrafik zu machen und dann quasi nur noch das Vektorbild zu zoomen. Ok, das Ein- und Ausblenden von Details wär dann zwar ein offener/ungelöster Punkt, aber sei's drum.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    das was PadreSperanza da beschrieben hat, bräuchte ich als kleines Demo Projekt.

    Damit ich sehen kann und auch verstehen kann bis in kleinste Detail, was ganz genau gemeint ist.

    Bevor wir aneinander vorbei Reden.

    eine kleine Zip Datei würde mir reichen, so als Lernmaterial wie sowas Entwickelt wird. BZW gebaut wird.

    Mit Freundlichen Grüßen DerLaie

    VaporiZed schrieb:

    Da das aber - soweit ich verstanden habe - auch mit beweglichen Punkten/Formen sein soll, wird das nix bringen


    Na ja, man könnte aber aich die Bilddateien als Koordinatensystem nutzen und dann dynamisch auch Elemente drauf pinseln, wenn es zB. auf einem Canvas gepinselt wird. Hier könnte man die Details auch ein und ausblenden.

    Ich sag ja, das meine Lösung nicht an das rankommt, was hier vielleicht gewünscht ist, aber es hätte zumindest einen etwas einfacheren Ansatz gehabt
    MEGA Virtual Reality Experience - Wunderland-Update #14 - YouTube 4:52 kurz angucken,

    DAs wäre mein Vorlage bzw. mein Ziel auf verständlicherweise


    1. Zeichne deine Shapes fertig in der größten Auflösung.
    2. Füge sie alle zusammen als Bild, sodass eine Karte für die größte Auflösung entsteht (mit entsprechender Größe).
    3. Diese Bild fügst du in ein Control (zB PictureBox) ein, sodass es zoombar ist.
    4. Du baust ein weiteres Bild, welches die nächste Auflösung zeigt (Umrisse der Häuser weg, nur noch Straßen)
    5. Du fügst auch dieses Bild wieder ein.
    6. Du machst das nächste Bild (nur noch Hauptstraßen, etc.) solange bist du alle gewünschten Auflösungen hast.
    7. Du baust einen Zoomfaktor mittels Variable ein.
    8. Bei jedem Zoom-Event wird deine Zoomvariable verändert. Sobald sie einen von dir festgelegten Wert übersteigt, tauscht du das eine Bild mit dem nächsten aus. Das neue Bild wird dann in der Größe des anderen angezeigt und kann weiter gezoomt werden, bis es wieder einen Wert übersteigt und es wird zum nächsten Bild gewechselt.

    könntest du mir hierzu ein kleines minimales Demo Programm mir erstellen, damit ich dir von der Entwicklung her dir folgen kann

    LG DerLaie
    C# -- Winforms Framwork 4.8 (kompletter Code; Designer 1x picturebox; im .exe Verzeichnis die zwei Bilddateien; picturebox Eigenschaften 'SizeMode' auf 'StretchImage' )
    Spoiler anzeigen

    C#-Quellcode

    1. using System.Drawing;
    2. using System.Windows.Forms;
    3. namespace WF_SimpleSlippyMap
    4. {
    5. public partial class Form1 : Form
    6. {
    7. public Form1()
    8. {
    9. InitializeComponent();
    10. //HookupMouseWheelEvent
    11. this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
    12. //Load first Tile
    13. pictureBox1.Image = Image.FromFile("MinZoomLevel.bmp");
    14. }
    15. private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
    16. {
    17. //Load different Images/Tiles
    18. if (pictureBox1.Width < 1100)
    19. {
    20. pictureBox1.Image = Image.FromFile("MinZoomLevel.bmp");
    21. }
    22. if (pictureBox1.Width > 1100)
    23. {
    24. pictureBox1.Image = Image.FromFile("MaxZoomLevel.bmp");
    25. }
    26. //MouseWheel Action
    27. if (e.Delta > 0)
    28. {
    29. pictureBox1.Width += 50;
    30. pictureBox1.Height += 50;
    31. }
    32. if (e.Delta < 0)
    33. {
    34. pictureBox1.Width -= 50;
    35. pictureBox1.Height -= 50;
    36. }
    37. }
    38. }
    39. }


    Absoluter Quick-Hack ohne Gewähr ... ( :thumbdown: Maßstab, Zentrierung etc.)

    Als Vorschau klick das .gif im Anhang
    Bilder
    • Nogood_SlippyMap.gif

      1,14 MB, 600×413, 124 mal angesehen
    codewars.com Rank: 4 kyu
    Ich halte es für falsch, alles in Bildern zu speichern. Ich würde eine kleine DB anlegen, mit allem was auf der Karte sein soll und dessen Koordinaten, sowie auch, ab welchen Zoom-Faktor, diese sichtbar sein sollen. Beim bewegen der Karte immer im Hintergrund alles im Umfeld der aktuellen Position aus der DB holen und live rendern, so kann man einfacher den Stadtplan bearbeiten, wenns mal nötig ist, als wie wenn man in Bildern rummalen muss. Straßen und Wege täte ich als Pfade(Koordinaten für GraphicsPath) speichern.

    Zum, editieren der Karte, könnte man auch einen visuellen Designer anlegen, mit dem man das zurechtklicksen kann, der dann alles in die DB einträgt. Ähnlich wie der Designer im Visual Studio, nur anstatt Controls werden Pfade und andere Objekte und deren Eigenschaften bearbeitet. Gleise(auch Straßen, Wege) könnte man z.B. wie in einer Modelbahn-CAD-Software verlegen, mit einrastfunktion an den Enden usw. So haben die Kurven dann auch immer die richtige Biegung und das ohne das man sich viel Mühe geben muss.

    Dann könnte man auch, wenn man nun viel Fantasy hat nun vorstellen, das auf meine Art die rein visuellen Element auf der Karte anklickbar sind(ein Fenster zum bearbeiten von Eigenschaften geht auf), hat ein Model(Haus) beleuchtung, könnte man diese über COM-Port auch schalten(falls du noch mit Arduinos hantierst).

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Takafusa“ ()

    Hi

    Das Wort "Vektorgrafik" ist ja nun mehrfach gefallen. Was spricht denn gegen eine EMF, WMF oder eine SVG? Letztere hat den Vorteil das man nur im SVG-Tag "svg" die Attribute x, y, width, height und viewBox ändern muss um einen Zoom oder Verschieben zu erreichen ohne alle Objekte (Straßen, Gebäude usw) anfassen zu müssen. Es wäre auch machbar mehrere SVGs (Layer), in Abhängigkeit vom Zoom, übereinander zu zeichnen/ein- oder auszublenden.
    Mfg -Franky-
    @Der Laie Ich verstehe ja das Du super gerne deine Ideen und Wünsche umsetzten möchtest. Es wurden jetzt ja auch viele Lösungswege aufgezeigt. Aber umsetzen musst Du sie selber :) .

    Ich denke jetzt wo etwas klarer ist, was Du machen möchtest, wäre der beste Ansatz der von @-Franky- mit der .svg Datei.

    Das musst Du dir aber eben erarbeiten. Investiere die Zeit lieber ins 'besser' werden, anstatt immer nach noch mehr Hilfe zu fragen. Falls Du den Code aus meinem Post nicht 'verstehst' (die zwei privaten Konversationsanfragen zeigen das ja), dann ist das ganze Vorhaben vielleicht zu groß für deinen Kenntnisstand. Konzentriere dich darauf in Vb.net besser zu werden, damit Du dir selber helfen kannst. Ich meine das auf eine nette Art :thumbup: .

    Lg Nogood
    codewars.com Rank: 4 kyu