我試圖根據鼠標的當前位置縮放圖形。現在我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
我添加了一個示例面板類,您可以將其添加到表單中。添加不起作用。如果我縮小太多,這將使變焦變爲負值。它與翻譯有關。縮放工作正常。 –