Visual Studio C# 如何通过鼠标移动按钮的 X 位置而不闪烁



,所以我试图制作一个滑块。我正在使用光标移动按钮的X位置。

i具有3个功能,即Mousedown,MouseUp和Mousemove函数。在MouseUp和Mousedown函数中,我将变量设置为True和False,以告诉程序是否单击了鼠标。在Mousemove函数中,我告诉程序单击鼠标时将按钮的X位置设置为鼠标的X位置。这有效,但有2个问题。

第一个问题是,当我按下按钮并移动它时,该按钮与鼠标的X一起移动,但在鼠标和按钮之间有一个空间。看起来有点像这样:光标.......按钮当我更改表单的分辨率时,光标和按钮之间的空间更改。

第二个问题是,当我移动按钮时,它会闪烁一点。它只能以更高的速度进行,但在我的情况下是一个问题。

我的代码看起来像这样:

bool mouseDown = false;
private void volumeGrabBT_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        mouseDown = true;
    }
}
private void volumeGrabBT_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        mouseDown = false;
    }
}
private void volumeGrabBT_MouseMove(object sender, MouseEventArgs e)
{
    if (mouseDown == true)
    {
        Point volumeBTPoint = new Point();
        volumeBTPoint.X = Cursor.Position.X;
        volumeBTPoint.Y = volumeGrabBT.Location.Y;
        volumeGrabBT.Location = volumeBTPoint;
    }
}

volumegrabbt是我试图与鼠标一起移动的按钮。volumebtpoint是我要设置按钮位置的按钮的点。

我希望有人可以帮助我解决这些问题。预先感谢!

我相信可以通过设置一些其他形式样式来修复闪烁: SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);形式的构造函数。它将使用双重缓冲,通常会更快地绘制。

对于Cursor类,它相对于屏幕而不是您的表单。您可以使用this.PointToClient()函数来获取客户端的光标空间位置,例如:

Point clientCursor = this.PointToClient(Cursor.Position);

,然后使用客户端cursor在客户端空间中获得精确的X。

您必须将屏幕坐标转换为客户端坐标。

Point volumeBTPoint = new Point();
Point point = this.PointToClient(Cursor.Position);
volumeBTPoint.X = point.X;
volumeBTPoint.Y = volumeGrabBT.Location.Y;
volumeGrabBT.Location = volumeBTPoint;

而不是this您应该使用按钮的父控件(PanelGroupBox等)。

最新更新