Zooming von Grafiken basierend auf der aktuellen Mausposition

Ich versuche, eine Zeichnung basierend auf der aktuellen Position der Maus zu zoomen. Im Moment sieht meine onMouseWheel-Methode so aus (basierend aufdiese StackOverflow-Antwort):

    private void onMouseWheel(object sender, MouseEventArgs e)
    {
        if (e.Delta > 0)
        {
            _scale *= 1.25f;
            _translateY = e.Y - 1.25f * (e.Y - _translateY);
            _translateX = e.X - 1.25f * (e.X - _translateX);
        }
        else
        {
            _scale /= 1.25f;
            _translateY = e.Y - 0.8f * (e.Y - _translateY);
            _translateX = e.X - 0.8f * (e.X - _translateX);
        }
        this.Invalidate();
    }

_scale, _translateX, und_translateY sind Mitgliedsvariablen.

Ich skaliere die Grafiken, übersetze sie und zeichne dann die Linien wie folgt:

    protected override void OnPaint(PaintEventArgs e)
    {
        g.ScaleTransform(_scale, _scale);
        g.TranslateTransform(_translateX, _translateY);
        //draw lines here
    }

Dieses Vide zeigt an, was passiert, wenn ich versuche, einen bestimmten Punkt zu vergrößern oder zu verkleinern. Was mache ich falsch

So sieht der Code zu Testzwecken in einer Beispiel-Panel-Klasse aus:

class Display : Panel
{
    public Display()
    {
        this.MouseWheel += new MouseEventHandler(this.onMouseWheel);
    }

    private void onMouseWheel(object sender, MouseEventArgs e)
    {
        if (e.Delta > 0)
        {
            _scale *= 1.25f;
            _translateY = e.Y - 1.25f * (e.Y - _translateY);
            _translateX = e.X - 1.25f * (e.X - _translateX);
        }
        else
        {
            _scale /= 1.25f;
            _translateY = e.Y - 0.8f * (e.Y - _translateY);
            _translateX = e.X - 0.8f * (e.X - _translateX);
        }
        this.Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        g.ScaleTransform(_scale, _scale);
        g.TranslateTransform(_translateX, _translateY);

        Pen pen = new Pen(Color.Red);
        g.FillEllipse(pen.Brush, 50, 50, 10, 10);
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage