Einzelnen Beitrag anzeigen

mh18058

Registriert seit: 21. Nov 2008
15 Beiträge
 
#2

AW: Image in einer ScrollBox richtig positionieren...

  Alt 22. Mai 2016, 23:51
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;
Angehängte Dateien
Dateityp: rar ZoomTest.rar (204,7 KB, 85x aufgerufen)
  Mit Zitat antworten Zitat