Zoomen / Strecken einer Bildbox an der aktuellen Mausposition?

F: Wie kann ich das Zoomen der aktuellen Mausposition über eine Bildbox implementieren, so etwas wie das Zoomen in Google Maps?

Als Abschlussarbeit entwerfe ich eine einfache GIS / Map Engine. Die Anwendung ist so konzipiert, dass die Maps in Registerkarten eines leicht geänderten Tabcontrols geladen werden.

Karten sind digitale Bilder im Standard-JPEG- oder PNG-Format und die meisten von ihnen haben eine sehr hohe Auflösung (2000x2000px und höher).

Sie werden in Bildboxen geladen, die als Untersteuerelemente von Registerkarten hinzugefügt werden. Ich habe eine einfache Zoommethode als Schaltflächen-Klick-Ereignis implementiert, die nur in die Mitte des Bildes / der Bildbox zoomt.

Was ich tun möchte, ist das Zoomen auf ein Mausrad-Ereignis so zu implementieren, dass das Bild auf die aktuelle Mausposition innerhalb der Bildbox gezoomt wird.

Der Code zum Vergrößern sieht derzeit folgendermaßen aus:

            timesZoomed += 1;
            zoomRatio += 0.1f;
            pbxMapa.Width = pbxMapa.Width * zoomRatio;
            pbxMapa.Height = pbxMapa.Height * zoomRatio;
            pbxMapa.Location = new Point((this.Width / 2) - (pbxMapa.Width / 2), this.Height / 2) - (pbxMapa.Height / 2));
Der Standardwert für "zoomRatio" ist 1 und wird auf 0,6 f erhöht.Argument "timesZoomed" Standardwert ist 0, es geht bis zu 6."pbxMapa" ist die Bildbox mit dem geladenen Bild der Karte. Die Requisite "ImageSizeMode" der Bildbox ist auf "Zoom" eingestellt, aber die Größe der Bildbox ist auf die volle Größe des geladenen Kartenbildes eingestellt.

Außerdem habe ich mit diesem einfachen Zoomcode experimentiert. Die Berechnung ist einigermaßen effektiv, hat jedoch beim Zoomen / Multiplizieren mit einem größeren Verhältnis einen erheblichen Versatz:

                pbxMapa.Location = new Point(pbxMapa.Location.X + (int)((pbxMapa.Location.X * zoomRatio - mouseXPbx) / 8), pbxMapa.Location.Y + (int)((pbxMapa.Location.Y * zoomRatio - mouseYPbx) / 8));
Die Variablen "mouseXPbx" und "mouseYPbx" repräsentieren die aktuelle Mausposition innerhalb der "pbxMapa". Ich habe durch 8 geteilt, um den Versatz in der Positionierung zu minimieren.

Jede Hilfe und Anregungen wird geschätzt, danke im Voraus.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage