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