【IT168 技术】用鼠标将浏览器中的图片进行移动和缩放是经常会遇到的应用。一般情况下,我可以通过MFC或WinForm来实现这一功能,其原理是利用事件处理函数获知鼠标位置和滚轮滚动的偏移量,参照这一更改对图片相应的位置和高宽比进行调整。
但是页面显示情况复杂时,通过这种方式处理起来就很麻烦了。先来看看通常用WinForm来实现图片缩放的代码:
用鼠标拖放来实现:
// 上一次鼠标移动的位置
private Point m_PreviousMousePosition;
private void DoImageMove(object sender, MouseEventArgs e)
{
// 将sender转化成触发鼠标事件的控件,在Winform程序里面,
// 一般都是PictureBox控件。
PictureBox picture = sender as PictureBox;
Debug.Assert(picture != null);
// 或者鼠标在PictureBox控件的相对坐标,下面的GetMouseRelativePositionTo
// 函数是一个虚构的函数,具体的实现可以Google一下他人的实现方式。
Point mousePosition = GetMouseRelativePositionTo(picture);
// 移动图片,由于MouseMove事件会在我们移动鼠标的时候触发多次,
// 因此我们可以通过获取两次鼠标移动之间,鼠标指针位置的偏移量
// 来知道图片应该移动的偏移量。
picture.X += mousePosition.X - m_PreviousMousePosition.X;
picture.Y += mousePosition.Y - m_PreviousMousePosition.Y;
// 将这次鼠标的位置保存下来。
m_PreviousMousePosition = mousePosition;
}
private Point m_PreviousMousePosition;
private void DoImageMove(object sender, MouseEventArgs e)
{
// 将sender转化成触发鼠标事件的控件,在Winform程序里面,
// 一般都是PictureBox控件。
PictureBox picture = sender as PictureBox;
Debug.Assert(picture != null);
// 或者鼠标在PictureBox控件的相对坐标,下面的GetMouseRelativePositionTo
// 函数是一个虚构的函数,具体的实现可以Google一下他人的实现方式。
Point mousePosition = GetMouseRelativePositionTo(picture);
// 移动图片,由于MouseMove事件会在我们移动鼠标的时候触发多次,
// 因此我们可以通过获取两次鼠标移动之间,鼠标指针位置的偏移量
// 来知道图片应该移动的偏移量。
picture.X += mousePosition.X - m_PreviousMousePosition.X;
picture.Y += mousePosition.Y - m_PreviousMousePosition.Y;
// 将这次鼠标的位置保存下来。
m_PreviousMousePosition = mousePosition;
}
通过滚动条滚动来实现:
private void MasterImage_MouseWheel(object sender, MouseWheelEventArgs e)
{
PictureBox picture = sender as PictureBox;
Debug.Assert(picture != null);
// 强迫PictureBox控件在更改大小的时候,自动缩放图片
// 以便填充整个PictureBox控件
picture.SizeMode = PictureBoxSizeMode.StretchImage;
// 0.001是我随便取的一个值,因为滚轮的Delta值太大了
// 根据鼠标滚轮的偏移量来更改PictureBox宽度和高度。
picture.Width += e.Delta * 0.001;
picture.Height += e.Delta * 0.001;
}
{
PictureBox picture = sender as PictureBox;
Debug.Assert(picture != null);
// 强迫PictureBox控件在更改大小的时候,自动缩放图片
// 以便填充整个PictureBox控件
picture.SizeMode = PictureBoxSizeMode.StretchImage;
// 0.001是我随便取的一个值,因为滚轮的Delta值太大了
// 根据鼠标滚轮的偏移量来更改PictureBox宽度和高度。
picture.Width += e.Delta * 0.001;
picture.Height += e.Delta * 0.001;
}
以上俩段代码虽然简洁,但是也有问题存在。其一,改变其中一个图片,其他图片也会随之而改变,虽然可以在MasterImage_MouseMove 和 MasterImage_MouseWheel函数里面显示修改所有图片的位置做修改,却很麻烦;其二,以上代码实际上是以图片的左上角为基准点的,如果想以图片中心为基准点又是一件麻烦的事。