C#实现图片鼠标拖动和滚动缩放

已移至:http://www.cnblogs.com/kongfl888/archive/2012/12/08/3351745.html


对于一个图片查看器来说,鼠标拖动和滚动缩放也就是说可以鼠标在程序界面上拖动图片,通过鼠标滚轮放大和缩小图片。这两种功能在图片浏览程序里面再普通不过了。那怎么用C#来进行实现。

通过操作你也知道,缩放的时候,我们首先第一个动作就是按下鼠标左键,也就是MouseDown;然后移动鼠标,将图片拖动到你想要的位置, 也就是MouseMove;最后释放鼠标,完成拖动操作,即MouseUp。通过这个分析,我们已经知道了, 如果要实现这个拖动的功能,那就得监听鼠标的这三个事件,即MouseDown、MouseMove和MouseUp。

当MouseDown事件发生的时候, 我们首先要做的是判断是不是左单击即

if (e.Button == MouseButtons.Left)

然后将此时的鼠标的移动前位置记录记录下来并将标识器至true(我要移动了),事件完整的代码如下:

private void picBox_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseDownPoint.X = Cursor.Position.X;  //注:全局变量mouseDownPoint前面已定义为Point类型

                mouseDownPoint.Y = Cursor.Position.Y;
                isSelected = true;
            }
        }

好了,现在我们已经完成了MouseDown事件的实现

接下来将是移动--MouseMove

拖动的原理我们应该也知道,就是改变PictureBox的left和top属性来实现PictureBox的移动,left和top的增减就是鼠标移动的距离。即

this.picBox.Left = this.picBox.Left + (Cursor.Position.X - mouseDownPoint.X);
this.picBox.Top = this.picBox.Top + (Cursor.Position.Y - mouseDownPoint.Y);
并记录新鼠标的位置,完整的代码如下:

private void picBox_MouseMove(object sender, MouseEventArgs e)
        {
            if (isSelected && IsMouseInPanel())
            {
                this.picBox.Left = this.picBox.Left +(Cursor.Position.X - mouseDownPoint.X);
                this.picBox.Top = this.picBox.Top +(Cursor.Position.Y - mouseDownPoint.Y);
                mouseDownPoint.X = Cursor.Position.X;
                mouseDownPoint.Y = Cursor.Position.Y;
            }
        }

其中的IsMouseInPanel()作用为判断鼠标的位置是否已经超出操作的界面

        private bool IsMouseInPanel()
        {
            if (this.pan_picture.Left < PointToClient(Cursor.Position).X 
	        && PointToClient(Cursor.Position).X < this.pan_picture.Left + this.pan_picture.Width 
	        && this.pan_picture.Top < PointToClient(Cursor.Position).Y 
	        && PointToClient(Cursor.Position).Y < this.pan_picture.Top + this.pan_picture.Height)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

如果你需要将图片限制在容器中,那你就要为此增加判断条件了:

public static void picMoveNotOut(PictureBox picBox, Point mouseDownPoint) 
        {
            int right, bottom;            

            int differentX = Cursor.Position.X - mouseDownPoint.X;
            int differentY = Cursor.Position.Y - mouseDownPoint.Y;

            int want2Lef = picBox.Left + differentX;
            int want2Top = picBox.Top + differentY;

            right = picBox.Parent.Width - (picBox.Right + differentX);
            bottom = picBox.Parent.Height - (picBox.Bottom + differentY);

            if (want2Lef > 0) want2Lef = picBox.Left;
            if (want2Top > 0) want2Top = picBox.Top;
            if (right > 0 && differentX < 0) want2Lef = picBox.Left;
            if (bottom > 0 && differentY < 0) want2Top = picBox.Top;

            picBox.Left = want2Lef;
            picBox.Top = want2Top;          
           
        }

好了,接下来就是MoveUp,释放掉移动操作,代码如下:

        private void picBox_MouseUp(object sender, MouseEventArgs e)
        {
            isSelected = false;
        }

现在,拖动到这里就完成了。


下面我们再来说说怎么实现滚动缩放:

滚动,用到的事件,不用我说,你也知道,正是MouseWheel。

缩放我们可以这样来实现:

首先我们要做的就是取得新图片分辨率的宽(w)和高(h)。新的宽高,我们可以通过加减一个增减单位(zoom)来决定,一次滚动鼠标中键就是一次加减运算(zoom的大小由你来定)。剩下的就是重新绘制新图了, 你可以直接用Bitmap来实现, 也可以通过Graphics来绘制。

我的MouseWheel事件代码如下:

private void picBox_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            int numberOfTextLinesToMove=0;
            numberOfTextLinesToMove=e.Delta *SystemInformation.MouseWheelScrollLines/120;           
            if(toolStripComboBox1.Text.Trim()!="启用缩放")numberOfTextLinesToMove=0;

            if (numberOfTextLinesToMove > 0)
            {
                for (int i = 0; i < numberOfTextLinesToMove; i++)
                {
                    zoomtime++;
                    OperateClass.maxMin(picBox, img_ori, zoomtime);
                    

                }
            }
            else if (numberOfTextLinesToMove < 0)
            {
                for (int i = 0; i > numberOfTextLinesToMove; i--)
                {
                    zoomtime--;
                    OperateClass.maxMin(picBox, img_ori, zoomtime);
                }
            }
           
        }

因为我的操作都是直接通过原图来进行缩放的, 所以用一个zoomtime来记录缩放的次数。

具体源代码:csdn下载(http://download.csdn.net/detail/kongfl888/4862935)

 在我的OperaClass中对于缩放的操作定义了三种方法(更严格来说是两种),虽说不是很完善,仅放出供大家参考。

(好了,第一篇博文,完成!)

转载请注明作者及本文地址:

http://blog.csdn.net/kongfl888/article/details/8274033

http://www.cnblogs.com/kongfl888/archive/2012/12/08/3351745.html

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值