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的滚动条的属性,通过改变滚动条的值来移动滚动条查看图像,不知道这种想法行不行,如果行的话怎么做,或者有更好的方法也行,只要效果像那个图片查看器的效果就行了,我先在这谢谢了,急啊!!
展开
 我来答
ChikaIto
2008-11-14 · TA获得超过326个赞
知道小有建树答主
回答量:205
采纳率:0%
帮助的人:0
展开全部
试试下面这代码,细节方面自己改改

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;
}
帐号已注销
2008-11-15 · TA获得超过672个赞
知道答主
回答量:312
采纳率:0%
帮助的人:63.9万
展开全部
v
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式