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