ich glaub so in etwa
Delphi-Quellcode:
vvvvvvvv
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
ZoomFaktorAlt: Extended;
NewMousePos, Difference: TPoint;
begin
if (Shift = [ssCtrl]) {and PtInRect(PSpielplan.ClientRect, PSpielplan.ParentToClient(MousePos))} then begin
if WheelDelta <> 0 then begin
ZoomFaktorAlt := PlanZoomFaktor;
if WheelDelta > 0 then
PlanResize(CBPlanZoom.Tag + 10)
else
PlanResize(CBPlanZoom.Tag - 10);
// Mausposition in neuen Zoomfaktor umrechnen, die Verschiebung bestimmen und dann um das verschieben
NewMousePos.X := Round(NewMousePos.X / ZoomFaktorAlt * PlanZoomFaktor);
NewMousePos.Y := Round(NewMousePos.Y / ZoomFaktorAlt * PlanZoomFaktor);
Difference := NewMousePos.Subtract(MousePos); // oder andersrum rechnen? MousePos.Subtract(NewMousePos)
SBSpielplan.ScrollBy(Difference.X, Difference.Y); // klar, man könnte auch Position:=Position+OffsetBzwDifferenz rechnen, oder Position:=Position-Alt+Neu, aber das kann die Komponente ja übernehmen
end;
Handled:= True;
end;
end;
Liegt das TImage eigentlich auf Pos 0:0?
Wenn nicht, dann muß dieses Offest vorher von MousePos abgezogen werden, da das Zommen ja erst ab dieser Stelle beginnt (ParentToClient)
hmmm, wieso gibt es nur Add/Substract, aber kein MulDiv, im, bzw. für TPoint und TRect
Ein Therapeut entspricht 1024 Gigapeut.