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

对于一个图片查看器来说,鼠标拖动和滚动缩放也就是说可以鼠标在程序界面上拖动图片,通过鼠标滚轮放大和缩小图片。这两种功能在图片浏览程序里面再普通不过了。那怎么用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://www.cnblogs.com/kongfl888/archive/2012/12/08/3351745.html

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

你可能感兴趣的:(C#)