AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zoom mit Mausrad

Offene Frage von "himitsu"
Ein Thema von e-gon · begonnen am 12. Sep 2025 · letzter Beitrag vom 12. Sep 2025
 
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
165 Beiträge
 
Delphi 6 Enterprise
 
#1

Zoom mit Mausrad

  Alt Heute, 10:40
Hallo zusammen,

ich bräuchte mal Eure Hilfe beim Zoomen. Irgendwie sehe ich den Wald vor lauter Bäumen nicht mehr...

Der Aufbau des Programms ist simpel:
Auf TForm eine TScrollBox (namens SBSpielplan), darin ein TPanel (PSpielplan), darauf noch ein TImage (IMGSpielplan) und neben der ScrollBox eine TComboBox (CBPlanZoom).

Via CTRL-Taste und Mausrad soll nun in oder aus dem Panel hinen-/herausgezoomt werden, wobei der Bildausschnitt unter dem Cursor an genau derselben Stelle bleiben soll.

Der Code dazu sieht folgendermaßen aus:
Delphi-Quellcode:
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.
Das Zoomen funktioniert auch soweit, nur bleibt der Bildausschnitt unter dem Cursor nach dem Zoomen (egal ob vergrößern oder verkleinern) einfach nicht unter dem Cursor sondern ist immer nach rechts unten verschoben. Allerdings finde ich den Fehler einfach nicht.

Kann mir da jemand von Euch helfen? Was ist mein Denkfehler?

Gruß
e-gon
  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 20:39 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