Zoomen und die Form in der Mitte des Mauszeigers haltenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Zoomen und die Form in der Mitte des Mauszeigers halten

Post by Guest »

Ich versuche, die Zoomfunktion für eine Anwendung zu implementieren, die Formen auf dem Bildschirm zeichnet. Diese Formen werden in Millimetern erstellt, die je nach dpi-Wert in Pixel umgewandelt werden.
Die Zeichnung erfolgt in einer PictureBox, die in einem Panel platziert wird, das über „Autoscroll true“ verfügt.
Jeder Zoom vergrößert die PictureBox horizontal und vertikal.
Wenn ich mit dem Scrollrad der Maus hineinzoome, wird auch die vertikale Scrollleiste verschoben, während die horizontale Scrollleiste durch das Scrollrad unverändert bleibt.
Aus diesem Grund bleibt die Form an der richtigen Position den Bildschirm horizontal, aber vertikal Es bewegt sich Schritt für Schritt Scroll für Scroll nach unten.
Ich brauche also eine Funktion, um diese Bewegung zu kompensieren.
Leider funktioniert es vertikal nicht richtig.
Mein Der Code sieht in etwa so aus:
private int deltaScroll = 0;
private float previousZoom;
private void viewport_MouseWheel(object sender, MouseEventArgs e)
{
mousePoint = viewport.PointToClient(Cursor.Position);

deltaScroll += e.Delta / 120;
if (e.Delta > 0)
{
ZoomIn();
}
else if (e.Delta < 0)
{
ZoomOut();
}
}

private void ZoomIn()
{
if (zoomFactor < 20.0f) // Prevent zooming in too much
{
previousZoom = zoomFactor; // Store the old zoom factor
zoomFactor += 0.2f;
ApplyZoom();

// Calculate and apply scroll offsets
CompensateScroll(previousZoom, zoomFactor);
}
}

private void ZoomOut()
{
if (zoomFactor > 0.21f) // Prevent zooming out too much
{
previousZoom = zoomFactor; // Store the old zoom factor
zoomFactor -= 0.2f;
ApplyZoom();

// Calculate and apply scroll offsets
CompensateScroll(previousZoom, zoomFactor);
}
}

private void CompensateScroll(float previousZoom, float newZoom)
{
int mouseX = viewport.HorizontalScroll.Value + mousePoint.X;
int mouseY = viewport.VerticalScroll.Value + mousePoint.Y;

// Calculate scaling factor
float scaleFactor = newZoom / previousZoom;

// Calculate new scroll deltas, applying the wheel delta to vertical scroll compensation
int deltaX = (int)((mouseX * scaleFactor) - mouseX);
int deltaY = (int)((mouseY * scaleFactor) - mouseY);

// Clamp new scroll values to stay within bounds
int newScrollX = MathExtensions.Clamp(viewport.HorizontalScroll.Value + deltaX, viewport.HorizontalScroll.Minimum, viewport.HorizontalScroll.Maximum);
int newScrollY = MathExtensions.Clamp(viewport.VerticalScroll.Value + deltaY, viewport.VerticalScroll.Minimum, viewport.VerticalScroll.Maximum);

// Apply adjusted scroll positions
viewport.AutoScrollPosition = new Point(newScrollX, newScrollY);
}

private void ApplyZoom()
{
foreach (var shape in shapes)
{
shape.ZoomFactor = zoomFactor;
}

double percentage = 100.0 * zoomFactor;
toolStripLabel2.Text = percentage.ToString("00") + "%";

SetPictureBoxSize(); // Set zoomed pictureBox size (width*zoomFactor, height*zoomFactor)
pictureBox1.Invalidate(); // Refresh
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post