Hallo Thunder1968,
und an Alle, die sich auch mit dem Thema befassen,
Ich hatte so eine ähnliche Frage, nur daß ich statt eines TImage eine TPaintBox habe.
Die PaintBox ist auf einer ScrollBox und ich zeichne auf die PaintBox eine Vektorgrafik.
Natürlich ist die PaintBox größer als die ScrollBox und die Zeichnung soll sich beim
Zoomen nicht verschieben, sondern genau unter der Maus bleiben.
Ich habe dazu folgende Lösung gefunden:
Im WheelUp und WheelDown ist eine Positionskorrektur durchzuführen. Dazu nehme ich den
Abstand vom Mittelpunkt der PaintBox und der Maus (Fluchtpunkt) und skaliere diesen
Abstand mit Hilfe des Zoom-Faktors nur für diesen einen Schritt. D.h. ich berechne die
Änderung dX/dY um die sich der Mittelpunkt bei einem Zoomschritt verschiebt.
Um diese dX/dY-Werte verschiebe ich dann die Zeichnung unter der Maus sozusagen zurück.
Zum Schluß wird alles mit redraw mit der gewünschten Skalierung neu gezeichnet.
Logischerweise ist der Korrekturfaktor in WheelUp und WheelDown unterschiedlich.
Außerdem: Scrollby(dX,dY) funktioniert zwar, nimmt aber die Scrollbalken nicht mit.
Das alles sieht dann so aus:
Gruß
Martin
P.S.: Wer Lust hat, kann sich auch meinen ZoomTest anschauen.
Delphi-Quellcode:
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
var P: TPoint;
dX,dY: Integer;
begin
inc(MouseWheelTics);
if MouseWheelTics > 2 then begin
MouseWheelTics := 0;
if ((ZoomLevel-1 >= -ZoomLevelRange) and
(ZoomLevel-1 <= ZoomLevelRange)) then begin
P := get_MausPos_on_PB;
zoomIn;
// Mittelpunktverschiebung korrigieren
dX := ArithRound((PaintBox1.Width div 2 - P.X) * (ZoomStep-1)/ZoomStep);
dY := ArithRound((PaintBox1.Height div 2 - P.Y) * (ZoomStep-1)/ZoomStep);
// ScrollBox1.Scrollby(dX,dY);
with ScrollBox1 do begin
with HorzScrollBar do Position := Position + dX;
with VertScrollBar do Position := Position + dY;
end;
redraw(true);
end;
end;
end;
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
var P: TPoint;
dX,dY: Integer;
begin
inc(MouseWheelTics);
if MouseWheelTics > 2 then begin
MouseWheelTics := 0;
if ((ZoomLevel+1 >= -ZoomLevelRange) and
(ZoomLevel+1 <= ZoomLevelRange)) then begin
P := get_MausPos_on_PB;
zoomOut;
// Mittelpunktverschiebung korrigieren
dX := ArithRound((PaintBox1.Width div 2 - P.X) * (ZoomStep-1));
dY := ArithRound((PaintBox1.Height div 2 - P.Y) * (ZoomStep-1));
// ScrollBox1.Scrollby(dX,dY);
with ScrollBox1 do begin
with HorzScrollBar do Position := Position - dX;
with VertScrollBar do Position := Position - dY;
end;
redraw(true);
end;
end;
end;