我知道有很多讨论这个话题,但我仍然无法找到答案。希望有人有个主意。
我在PictureBox
(SizeMode
普通,DockStyle
填充)中加载位图,然后使用Paint
事件绘制图像。
要缩放我使用MouseWheel
事件并增加/减少缩放系数(如_zoomFac + = 1)。目标是缩放鼠标位置。所以在MouseWheel
事件中我也保存了鼠标位置(_imageZoomLocation
)。这是我的代码(只有很少的测试实现):
public partial class Form1 : Form
{
private Image _image;
private float _zoomFac;
private PointF _imageZoomLocation;
public Form1()
{
InitializeComponent();
_image = null;
_zoomFac = 1F;
_imageZoomLocation = PointF.Empty;
pictureBox.MouseWheel += new MouseEventHandler(OnMouseWheel);
}
private void pb_Paint(object sender, PaintEventArgs e)
{
if (_image == null)
return;
e.Graphics.TranslateTransform(-_imageZoomLocation.X + _imageZoomLocation.X / _zoomFac, -_imageZoomLocation.Y + _imageZoomLocation.Y / _zoomFac);
e.Graphics.ScaleTransform(_zoomFac, _zoomFac, MatrixOrder.Append);
e.Graphics.DrawImage(_image, new Point(0,0));
}
private void fileToolStripMenuItem_Click(object sender, EventArgs e)
{
... Code for loading image
}
private void OnMouseWheel(object sender, MouseEventArgs e)
{
if (_image == null)
return;
_imageZoomLocation = e.Location;
if (e.Delta > 0)
_zoomFac += 1F;
else
if (_zoomFac - 1F < 1F)
_zoomFac = 1F;
else
_zoomFac -= 1F;
Refresh();
}
private void pb_MouseEnter(object sender, EventArgs e)
{
pictureBox.Focus();
}
}
只要_imageZoomLocation
未更改,这就行得很好,意味着鼠标没有移动我可以完美地放大和缩小(当缩放系数为1且一切仍然有效时,我可以改变鼠标位置)。然而,当我将鼠标移动到缩放状态下的不同位置(例如缩放系数为2)并滚动时,图像会跳转到与鼠标不同的位置,然后跳过&#34;跳转&#34;一切顺利。
任何人都可以解释这种行为吗?
答案 0 :(得分:0)
在以下行中,您将imageZoomLocation.X和.Y除以缩放因子的一半时间。相反,也许您需要一个单独的变量来保留之前的鼠标位置。
e.Graphics.TranslateTransform(-_imageZoomLocation.X + _imageZoomLocation.X / _zoomFac, _
-_imageZoomLocation.Y + _imageZoomLocation.Y / _zoomFac);