可以';浏览标签时不要像手机一样滚动

本文关键字:手机 滚动 一样 浏览 标签 可以 | 更新日期: 2023-09-27 18:26:51

所以我使用了这个链接中的代码,

如何获得类似智能手机的滚动winforms触摸屏应用程序(滚动面板)

但我遇到了一个问题,在表单中,如果用户点击标签并试图滚动,它就不会移动。因此,我将事件设置为使用相同方法的标签。

lbl.MouseDown += new MouseEventHandler(this.QuestionPanelMouseDown);
lbl.MouseMove += new MouseEventHandler(this.QuestionPanelMouseMove);

这使得它在你点击标签时滚动得超级快。为了适应这种情况,我尝试创建一个新的鼠标移动方法,但将+5和-5改为+1和-1。它减缓了速度,但还不够。位置是int,所以我不能比+1或-1慢。

我认为这个问题与发送的位置有关,它与标签有关,而不是面板本身,但我想不出真正解决这个问题的方法。

可以';浏览标签时不要像手机一样滚动

经过大量搜索,我找到了答案。当使用链接中的代码时,我更换了

e.Location

带有

PointToClient(Cursor.Position)

所以它看起来是这样的。

Point mouseDownPoint;
private void innerpanel_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        this.mouseDownPoint = PointToClient(Cursor.Position);
}
private void innerpanel_MouseMove(object sender, MouseEventArgs e)
{
    Point MouseLoc = PointToClient(Cursor.Position);
    if (e.Button != MouseButtons.Left)
        return;
    if ((mouseDownPoint.X == MouseLoc.X) && (mouseDownPoint.Y == MouseLoc.Y))
        return;
    Point currAutoS = innerpanel.AutoScrollPosition;
    if (mouseDownPoint.Y > MouseLoc.Y)
    {
        //finger slide UP
        if (currAutoS.Y != 0)
            currAutoS.Y = Math.Abs(currAutoS.Y) - 5;
    }
    else if (mouseDownPoint.Y < MouseLoc.Y)
    {
        //finger slide down
        currAutoS.Y = Math.Abs(currAutoS.Y) + 5;
    }
    else
    {
        currAutoS.Y = Math.Abs(currAutoS.Y);
    }
    if (mouseDownPoint.X > MouseLoc.X)
    {
        //finger slide left
        if (currAutoS.X != 0)
            currAutoS.X = Math.Abs(currAutoS.X) - 5;
    }
    else if (mouseDownPoint.X < MouseLoc.X)
    {
        //finger slide right
        currAutoS.X = Math.Abs(currAutoS.X) + 5;
    }
    else
    {
        currAutoS.X = Math.Abs(currAutoS.X);
    }
    innerpanel.AutoScrollPosition = currAutoS;
    mouseDownPoint = MouseLoc; //IMPORTANT
}

然后,我为面板内的所有内容制作了鼠标向下和鼠标移动事件,这样无论你点击哪里,它都会以相同的速度滚动。