AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Image in einer ScrollBox richtig positionieren...
Thema durchsuchen
Ansicht
Themen-Optionen

Image in einer ScrollBox richtig positionieren...

Ein Thema von Thunder1968 · begonnen am 18. Apr 2015 · letzter Beitrag vom 21. Jun 2016
 
mh18058

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

AW: Image in einer ScrollBox richtig positionieren...

  Alt 22. Mai 2016, 22: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, 87x aufgerufen)
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz