Powiększanie / rozciąganie ramki graficznej na bieżącej pozycji myszy?

P: Jak mogę zaimplementować powiększanie bieżącej pozycji myszy nad boxem obrazkowym, np. Powiększanie w Google Maps?

Projektuję prosty silnik GIS / map w miarę pracy. Aplikacja została zaprojektowana w taki sposób, że mapy są ładowane do zakładek z nieznacznie zmodyfikowanym tabulatorem.

Mapy są standardowymi obrazami cyfrowymi w formacie JPEG lub PNG, a większość z nich ma bardzo wysokie rozdzielczości (2000x2000px i wyższe).

Są ładowane w skrzynkach graficznych, które są dodawane jako podkontroli stron. Zaimplementowałem prostą metodę powiększania jako zdarzenia kliknięcia przycisku, które powiększa tylko do środka obrazka / obrazka.

To, co chciałbym zrobić, to zaimplementować powiększanie na zdarzeniu kółka myszy w taki sposób, aby obraz był powiększany na bieżącej pozycji myszy wewnątrz ramki obrazu.

Kod do powiększania wygląda obecnie tak:

            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));
Domyślna wartość „zoomRatio” wynosi 1 i jest zwiększana do 0,6f.Wartość domyślna argumentu „timesZoomed” wynosi 0, dochodzi do 6.„pbxMapa” to obrazek z załadowanym obrazem mapy. Propozycja „ImageSizeMode” w boxie Picturebox jest ustawiona na „Zoom”, ale rozmiar Picturebox jest ustawiony na pełny rozmiar załadowanego obrazu mapy.

Eksperymentowałem też z tym prostym kodem powiększania. Obliczenia są w pewnym stopniu skuteczne, ale nadal mają dość duże przesunięcie podczas powiększania / pomnażania przy większym współczynniku:

                pbxMapa.Location = new Point(pbxMapa.Location.X + (int)((pbxMapa.Location.X * zoomRatio - mouseXPbx) / 8), pbxMapa.Location.Y + (int)((pbxMapa.Location.Y * zoomRatio - mouseYPbx) / 8));
Zmienne „mouseXPbx” i „mouseYPbx” reprezentują bieżącą pozycję myszy w „pbxMapa”. Podzieliłem przez 8, aby zminimalizować przesunięcie w pozycjonowaniu.

Każda pomoc i sugestie są doceniane, dzięki z góry.