Ich versuche, eine Zeichnung basierend auf der aktuellen Position der Maus zu vergrößern. Gerade jetzt meine onMouseWheel Methode sieht wie folgt aus (basierend auf this StackOverflow answer):Zoomen von Grafiken basierend auf der aktuellen Mausposition
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 Membervariablen.
ich die Grafiken Skalierung, Übersetzung, und dann die Zeilen wie diese Zeichnung:
protected override void OnPaint(PaintEventArgs e)
{
g.ScaleTransform(_scale, _scale);
g.TranslateTransform(_translateX, _translateY);
//draw lines here
}
This video zeigt, was passiert, wenn ich versuche, es zu vergrößern und der Zoom auf einem bestimmten Punkt aus. Was mache ich falsch?
Dies ist, was der Code wie in einer Probe Panel-Klasse für Testzwecke aussieht:
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);
}
}
Können Sie den Code Ihrer Beispielanwendung hochladen? Ich denke, es hat etwas mit deiner Tonleiter zu tun, funktioniert es, wenn du anstelle der Multiplikation '_scale + = 0.25f' verwendest. Obwohl es nur eine Vermutung ist, weil ich gerade kein funktionierendes Beispiel habe. – dwonisch
Ich habe eine Beispiel-Panel-Klasse hinzugefügt, die Sie einfach zu einem Formular hinzufügen können. Die Addition funktioniert nicht. Das würde den Zoom negativ werden lassen, wenn ich zu viel verkleinern würde. Es hat mit der Übersetzung zu tun. Die Skalierung funktioniert gut. –