我试图根据鼠标的当前位置缩放图形。现在我onMouseWheel方法如下所示(基于this StackOverflow answer):基于当前鼠标位置缩放图形
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
,并且_translateY
是成员变量。
我缩放图形,翻译它,然后绘制线条像这样:
protected override void OnPaint(PaintEventArgs e)
{
g.ScaleTransform(_scale, _scale);
g.TranslateTransform(_translateX, _translateY);
//draw lines here
}
This video显示当我尝试放大,什么发生在某一点的缩小。我究竟做错了什么?
这是代码看起来像在样本面板类用于测试目的:
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);
}
}
您可以上传示例应用程序的代码吗?我认为它与你的规模有关,如果你使用_scale + = 0.25f而不是乘法,它是否工作。虽然这只是一个猜测,因为我现在没有一个工作的例子。 – dwonisch
我添加了一个示例面板类,您可以将其添加到表单中。添加不起作用。如果我缩小太多,这将使变焦变为负值。它与翻译有关。缩放工作正常。 –