Einzelnen Beitrag anzeigen

Thunder1968

Registriert seit: 19. Mai 2009
8 Beiträge
 
#1

Image in einer ScrollBox richtig positionieren...

  Alt 18. Apr 2015, 19:26
Hallo und Guten Abend,

seit langem habe ich mal wieder ein Problemchem. Ich habe eine ScrollBox die ein TImage enthält. In dieses TImage wird dann ein PNG-File geladen was ca. 2,5 MB groß ist. Das verschieben des TImages funktioniert problemlos. Aber jetzt möchte ich das ganze mit dem Mausrad vergrößern und auch verkleinern. Mein Problem liegt jetzt darin das ich gerne den aktuellen Mittelpunkt der ScrollBox / TImage auch mittig bleiben soll. Wenn ich das Mausrad betätige (vergrößern, verkleinern) verschiebt sich das TImage so das der aktuell angezeigte Mittelpunkt sich verschiebt und ich dann mit der Maus das die alte Position wieder in die Mitte ziehen muß um es beim nächsten Zoom-Vorgang nicht wieder aus den Augen zu verlieren. Wo liegt mein Denkfehler oder hat jemand eine Idee??? Wäre auch Dankbar für ein komplettes Beispiel... Den Quellcode habe ich angehängt und für eine rasche Hilfe wäre ich Euch sehr Dankbar... Bei den beiden Bilder im Anhang soll verdeutlicht werden wie sich das ganze auswirkt und darstellt... Viele Grüße...


Delphi-Quellcode:
function TFormMain.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
var
   NewScrollPosX, NewScrollPosY : Integer;
   OldScrollPosX, OldScrollPosY : Integer;
   TempValue : Integer;

begin
     // Bild zoomen

     if ssCtrl in Shift then
     begin
          Image1.AutoSize := False;
          Image1.Center := True;
          Image1.Proportional := True;
          Image1.Stretch := True;

          OldScrollPosX := ScrollBox1.HorzScrollBar.Position;
          OldScrollPosY := ScrollBox1.VertScrollBar.Position;

          Image1.Left := Round(Image1.Left - (((Image1.Width * ZoomFactor) - Image1.Width) / 2));
          Image1.Top := Round(Image1.Top - (((Image1.Height * ZoomFactor) - Image1.Height) / 2));
          Image1.Width := Round(Image1.Width * ZoomFactor);
          Image1.Height := Round(Image1.Height * ZoomFactor);

          TempValue := Round(OldScrollPosX * ZoomFactor);
          NewScrollPosX := Round((OldScrollPosY - TempValue) / (ZoomFactor));

          TempValue := Round(OldScrollPosX * ZoomFactor);
          NewScrollPosY := Round((OldScrollPosY - TempValue) / (ZoomFactor));

          ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position + (NewScrollPosX div 2);
          ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position + (NewScrollPosY div 2);
     end;

     Image1.Repaint;

     ScrollBox1.DoubleBuffered := True;
end;

function TFormMain.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
var
   NewScrollPosX, NewScrollPosY : Integer;
   OldScrollPosX, OldScrollPosY : Integer;
   TempValue : Integer;

begin
     // Bild verkleinern

     if ssCtrl in Shift then
     begin
          Image1.AutoSize := False;
          Image1.Center := True;
          Image1.Proportional := True;
          Image1.Stretch := True;

          OldScrollPosX := ScrollBox1.HorzScrollBar.Position;
          OldScrollPosY := ScrollBox1.VertScrollBar.Position;

          Image1.Left := Round(Image1.Left + (((Image1.Width * ZoomFactor) - Image1.Width) / 2));
          Image1.Top := Round(Image1.Top + (((Image1.Height * ZoomFactor) - Image1.Height) / 2));
          Image1.Width := Round(Image1.Width / ZoomFactor);
          Image1.Height := Round(Image1.Height / ZoomFactor);

          TempValue := Round(OldScrollPosX / ZoomFactor);
          OldScrollPosX := Round((OldScrollPosX - TempValue) / (ZoomFactor));

          TempValue := Round(OldScrollPosY / ZoomFactor);
          OldScrollPosY := Round((OldScrollPosY - TempValue) / (ZoomFactor));

          ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position - (OldScrollPosX div 2);
          ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - (OldScrollPosY div 2);
     end;

     Image1.Repaint;

     ScrollBox1.DoubleBuffered := True;
end;
Miniaturansicht angehängter Grafiken
vorher.png   nachher.png  

Geändert von Thunder1968 (18. Apr 2015 um 20:00 Uhr)
  Mit Zitat antworten Zitat