c#中如何使用mouse事件控制滚动条

来源:百度知道 编辑:UC知道 时间:2024/06/19 01:44:15
我做的是一个图像查看功能
我使用的是在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键拖动图片只是移动滚动条来查看的效果不一样,后来我想了想

试试下面这代码,细节方面自己改改

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.