gpt4 book ai didi

c# - 通过鼠标拖动滚动

转载 作者:太空狗 更新时间:2023-10-30 00:38:29 25 4
gpt4 key购买 nike

我正在尝试制作一个可滚动面板但没有滚动条并通过垂直拖动鼠标来滚动......这是到目前为止有人帮助我做的......:

 private void panel1_MouseEnter(object sender, EventArgs e)
{
panel1.AutoScroll = false;
}

private int ValidateChange(int change)
{
var padding = -1;
if (change < 0)
{
var max = (from Control control in Controls select control.Top + control.Height + padding).Concat(new[] { int.MinValue }).Max();

if (max < Height + Math.Abs(change))
{
return Height - max;
}
}
else
{
var min = (from Control control in Controls select control.Top).Concat(new[] { int.MaxValue }).Min();

if (min > padding - Math.Abs(change))
{
return padding - min;
}
}
return change;
}

private void HandleDelta(int delta)
{
var change = ValidateChange(delta);

foreach (Control control in Controls)
{
control.Top += change;
}

}

private void panel1_MouseWheel(object sender, MouseEventArgs e)
{
HandleDelta(e.Delta);
base.OnMouseWheel(e);
}

private Point _mouseLastPosition;

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_mouseLastPosition = e.Location;
}
base.OnMouseDown(e);
}

public void panel1_MouseMove(object sender, MouseEventArgs e)
{
if ((MouseButtons & MouseButtons.Left) != 0)
{
var delta = e.Y - _mouseLastPosition.Y;
HandleDelta(delta);
_mouseLastPosition = e.Location;
}
base.OnMouseMove(e);

}

但是速度太快了..编辑:鼠标拖动看起来有点奇怪我不知道为什么当我尝试使用鼠标滚轮时它会出错并给我这个错误:System.Core.dll 中出现类型为“System.StackOverflowException”的未处理异常行 var max = (from Control control in Controls select control.Top + control.Height + padding).Concat(new[] { int.MinValue }).Max();

最佳答案

发布的代码仅“滚动”或更确切地说是水平 移动面板。对于垂直滚动效果更改此:

   Panel pa = ss as Panel; pa.Left = pa.Left + ee.X - pPt.X;

为此:

   Panel pa = ss as Panel; pa.Top = pa.Top + ee.Y - pPt.Y;

为了有意义,“滚动”或“移动”面板也应该高于封闭形式,因此更改大小,可能是这样的:

    f2.Size = new Size(400, 300);
..
pan.Size = new Size(400, 600);

按钮也应该垂直放置,所以改变:

    b.Left = (b.Width + 12) * (i - 1);

    b.Top= (b.Height + 12) * (i - 1);

你复制评论的时候也错了:这个:

 pan.Parent = f2;

应该是循环中的最后一行。在循环中添加事件处理程序意味着 MouseMove 也被调用 10 次,移动的距离也是 10 倍。

这是正确编码后的样子:

enter image description here

要使 MouseWheel 正常工作,您可以像这样对其进行编码:

 pan.MouseWheel += (ss, ee) =>
{
Panel pa = ss as Panel;
pa.Top += ee.Delta > 0 ? 10 : -10;
};

更新 看起来您还想限制滚动,以便顶部和底部都不能移动到显示区域。这是实现这一目标的支票;诀窍是先进行检查,然后再进行移动:

            if (ee.Button.HasFlag(MouseButtons.Left))
{
Panel pa = ss as Panel;

int newTop = pa.Top + ee.Y - pPt.Y;

if ((newTop <= pan.Top && newTop + pan.Height > f2.ClientSize.Height) ||
(newTop >= pan.Top && newTop <= 0))
{
if (newTop <= pan.Top && newTop + pan.Height > f2.ClientSize.Height)
newTop = f2.ClientSize.Height - pan.Height;
pa.Top = newTop;
}
}

MouseWheel 代码应该以类似的方式检查和限制!

注意:正确的面板高度在这里至关重要。我原来的例子没有考虑到这一点,因为没有要求滚动限制。你可以像这样动态地得到它:

int panHeight = pan.Controls.Cast<Control>().Select(x => x.Bottom).Max();
pan.Height = panHeight; // maybe add a small gap here..?

关于c# - 通过鼠标拖动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40682608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com