【发布时间】:2016-09-12 17:40:46
【问题描述】:
我正在尝试根据鼠标的当前位置缩放绘图。现在我的 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而不是乘法,它是否有效。虽然这只是一个猜测,因为我现在没有一个可行的例子。 -
我添加了一个示例面板类,您可以将其添加到表单中。添加不起作用。如果我缩小太多,那会使缩放变为负数。这与翻译有关。缩放效果很好。
标签: c# winforms graphics zooming