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;