c#中如何使用mouse事件控制滚动条
我做的是一个图像查看功能我使用的是在panel中添加一个pictureBox,并吧AutoScroll=true,这样在读取图片时,比panel范围大的图片可以以滚动条的...
我做的是一个图像查看功能
我使用的是在panel中添加一个pictureBox,并吧AutoScroll = true,这样在读取图片时,比panel范围大的图片可以以滚动条的方式来查看,现在我又做了用鼠标拖动图片的功能,代码如下:
private bool flag = false;//标记鼠标是否按下
private int x, y;//鼠标的坐标
//鼠标按下
private void picImage_MouseDown(object sender, MouseEventArgs e)
{
flag = true;
x = e.X;
y = e.Y;
}
//释放鼠标
private void picImage_MouseUp(object sender, MouseEventArgs e)
{
flag = false;
}
//鼠标移动
private void picImage_MouseMove(object sender, MouseEventArgs e)
{
if (flag)
{
picImage.Left = picImage.Left + (e.X - x);
picImage.Top = picImage.Top + (e.Y - y);
}
}
现在的问题是当拖动图片时,在panel范围内会出现一些空白,和windows图片查看器里按住ctrl键拖动图片只是移动滚动条来查看的效果不一样,后来我想了想,这是因为在mouseMove方法中只是改变pictureBox的位置,移动的是pictureBox在panel中的位置,现在我想做成图片的位置固定,当按住鼠标拖动图像时,只是滚动条在移动,这样就能跟windows图片查看器那个效果一样了,所以在mouseMove方法中不是使用picImage.Left那种方法,而是得到panel的滚动条的属性,通过改变滚动条的值来移动滚动条查看图像,不知道这种想法行不行,如果行的话怎么做,或者有更好的方法也行,只要效果像那个图片查看器的效果就行了,我先在这谢谢了,急啊!! 展开
我使用的是在panel中添加一个pictureBox,并吧AutoScroll = true,这样在读取图片时,比panel范围大的图片可以以滚动条的方式来查看,现在我又做了用鼠标拖动图片的功能,代码如下:
private bool flag = false;//标记鼠标是否按下
private int x, y;//鼠标的坐标
//鼠标按下
private void picImage_MouseDown(object sender, MouseEventArgs e)
{
flag = true;
x = e.X;
y = e.Y;
}
//释放鼠标
private void picImage_MouseUp(object sender, MouseEventArgs e)
{
flag = false;
}
//鼠标移动
private void picImage_MouseMove(object sender, MouseEventArgs e)
{
if (flag)
{
picImage.Left = picImage.Left + (e.X - x);
picImage.Top = picImage.Top + (e.Y - y);
}
}
现在的问题是当拖动图片时,在panel范围内会出现一些空白,和windows图片查看器里按住ctrl键拖动图片只是移动滚动条来查看的效果不一样,后来我想了想,这是因为在mouseMove方法中只是改变pictureBox的位置,移动的是pictureBox在panel中的位置,现在我想做成图片的位置固定,当按住鼠标拖动图像时,只是滚动条在移动,这样就能跟windows图片查看器那个效果一样了,所以在mouseMove方法中不是使用picImage.Left那种方法,而是得到panel的滚动条的属性,通过改变滚动条的值来移动滚动条查看图像,不知道这种想法行不行,如果行的话怎么做,或者有更好的方法也行,只要效果像那个图片查看器的效果就行了,我先在这谢谢了,急啊!! 展开
2个回答
展开全部
试试下面这代码,细节方面自己改改
private Point pt = Point.Empty; // 记录鼠标按下时的坐标
private Point def = Point.Empty; // 记录鼠标按下panel横纵滚动条的值
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (MouseButtons.Left != e.Button) return;
Cursor = Cursors.SizeAll;
pt = panel1.PointToClient(pictureBox1.PointToScreen(e.Location)); // 鼠标是按在picturebox上,需要转化成相对于panel的坐标
def.X = panel1.HorizontalScroll.Value; // HScroll值
def.Y = panel1.VerticalScroll.Value; // VScroll值
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (MouseButtons.Left != e.Button) return;
Point cur = panel1.PointToClient(pictureBox1.PointToScreen(e.Location)); // 当前鼠标坐标,同样需要转化成相对于panel的坐标
cur = new Point(pt.X - cur.X, pt.Y - cur.Y); // 计算差
cur.X = def.X + cur.X; // 计算和
cur.Y = def.Y + cur.Y;
if (0 > cur.X) cur.X = 0; // 如果超出范围,需要修正
if (panel1.Width < cur.X) cur.X = panel1.Width;
if (0 > cur.Y) cur.Y = 0;
if (panel1.Height < cur.Y) cur.Y = panel1.Height;
if (panel1.HorizontalScroll.Visible) panel1.HorizontalScroll.Value = cur.X; // 如果存在对应的滚动条,则赋值
if (panel1.VerticalScroll.Visible) panel1.VerticalScroll.Value = cur.Y;
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
Cursor = Cursors.Default;
}
private Point pt = Point.Empty; // 记录鼠标按下时的坐标
private Point def = Point.Empty; // 记录鼠标按下panel横纵滚动条的值
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (MouseButtons.Left != e.Button) return;
Cursor = Cursors.SizeAll;
pt = panel1.PointToClient(pictureBox1.PointToScreen(e.Location)); // 鼠标是按在picturebox上,需要转化成相对于panel的坐标
def.X = panel1.HorizontalScroll.Value; // HScroll值
def.Y = panel1.VerticalScroll.Value; // VScroll值
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (MouseButtons.Left != e.Button) return;
Point cur = panel1.PointToClient(pictureBox1.PointToScreen(e.Location)); // 当前鼠标坐标,同样需要转化成相对于panel的坐标
cur = new Point(pt.X - cur.X, pt.Y - cur.Y); // 计算差
cur.X = def.X + cur.X; // 计算和
cur.Y = def.Y + cur.Y;
if (0 > cur.X) cur.X = 0; // 如果超出范围,需要修正
if (panel1.Width < cur.X) cur.X = panel1.Width;
if (0 > cur.Y) cur.Y = 0;
if (panel1.Height < cur.Y) cur.Y = panel1.Height;
if (panel1.HorizontalScroll.Visible) panel1.HorizontalScroll.Value = cur.X; // 如果存在对应的滚动条,则赋值
if (panel1.VerticalScroll.Visible) panel1.VerticalScroll.Value = cur.Y;
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
Cursor = Cursors.Default;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询