技术开发 频道

在WPF下实现以鼠标为中心图片缩放范例

  【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 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;

}

  以上俩段代码虽然简洁,但是也有问题存在。其一,改变其中一个图片,其他图片也会随之而改变,虽然可以在MasterImage_MouseMove 和 MasterImage_MouseWheel函数里面显示修改所有图片的位置做修改,却很麻烦;其二,以上代码实际上是以图片的左上角为基准点的,如果想以图片中心为基准点又是一件麻烦的事。

0
相关文章