implementation
var
PlanZoomFaktor: Double;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
PlanResize(100);
IMGSpielplan.Align:= alClient;
IMGSpielplan.Picture.Bitmap.LoadFromFile('
D:\Spielplan.bmp');
PSpielplan.Top:= 0;
PSpielplan.Left:= 0;
PSpielplan.Width:= IMGSpielplan.Picture.Bitmap.Width;
PSpielplan.Height:= IMGSpielplan.Picture.Bitmap.Height;
end;
procedure TForm1.PlanResize(Size: Integer);
begin
if Size<10
then Size:= 10;
CBPlanZoom.Text:= IntToStr(Size)+'
%';
CBPlanZoom.Tag:= Size;
PlanZoomFaktor:= Size/100;
// Größe des Panels anpassen
PSpielplan.Width:= Round(IMGSpielplan.Picture.Bitmap.Width*PlanZoomFaktor);
PSpielplan.Height:= Round(IMGSpielplan.Picture.Bitmap.Height*PlanZoomFaktor);
end;
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint;
var Handled: Boolean);
var ZoomFaktorAlt: Extended;
PointPanel,PointMouse: TPoint;
e: Extended;
begin
if (Shift=[ssCtrl])
and
PtInRect(PSpielplan.ClientRect,PSpielplan.ScreenToClient(Mouse.CursorPos))
then begin
// alter Zoomfaktor sichern
ZoomFaktorAlt:= PlanZoomFaktor;
// Cursor-Positionen ermitteln
PointMouse:= Mouse.CursorPos;
PointPanel:= PSpielplan.ScreenToClient(PointMouse);
// Absolutwert von PointMouse berechnen
Dec(PointMouse.X,SBSpielplan.Left);
Dec(PointMouse.Y,SBSpielplan.Top);
// Mouserad auswerten
if WheelDelta<>0
then begin
if WheelDelta>0
then PlanResize(CBPlanZoom.Tag+10)
else PlanResize(CBPlanZoom.Tag-10);
// Änderungsfaktor und neue Panelposition berechnen
e:= PlanZoomFaktor/ZoomFaktorAlt;
PointPanel.X:= Round(PointPanel.X*e);
PointPanel.Y:= Round(PointPanel.Y*e);
// Scrollbalken an Mouseposition anpasen
SBSpielplan.HorzScrollBar.Position:= PointPanel.X-PointMouse.X;
SBSpielplan.VertScrollBar.Position:= PointPanel.Y-PointMouse.Y;
end;
Handled:= True;
end;
end;
end.