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

来源:互联网 发布:centos 安装ant 编辑:程序博客网 时间:2024/05/02 01:39

已移至: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

原创粉丝点击