Einzelnen Beitrag anzeigen

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