【发布时间】:2015-12-30 23:20:53
【问题描述】:
我知道已经有很多关于这个话题的讨论,但我仍然找不到答案。希望有人有想法。
我在PictureBox(SizeMode Normal,DockStyle Fill)中加载位图并使用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)并滚动时,图像会跳转到与鼠标不同的位置一次,并且在此“跳转”之后一切正常。
谁能解释这种行为?
【问题讨论】:
-
这听起来很像
winforms技术。 -
是的,你是对的。我忘了提。
-
您将需要开始熟悉 Visual Studio 令人敬畏的调试器,或者向我们提供 所有 相关代码,这可能是一项无望的努力,很可能您最终会熟悉 Visual Studio 的出色调试器无论如何。
-
别担心我使用 vs,因为它存在并且知道如何使用调试器:-)。但我会按照你的建议更新代码示例。
标签: c# winforms graphics paint picturebox