首页 文章

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

提问于
浏览
0

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

我有3个函数,mouseDown,mouseUp和mouseMove函数 . 在mouseUp和mouseDown函数中,我将变量设置为true和false,以告诉程序是否单击了鼠标 . 在mouseMove函数中,我告诉程序在单击鼠标时将按钮的x位置设置为鼠标的x位置 . 这有效,但有2个问题 .

第一个问题是,当我按下按钮并移动它时,按钮随着鼠标的x移动,但它在鼠标和按钮之间有一个空格 . 它看起来有点像:CURSOR ....... BUTTON当我改变表格的分辨率时,光标和按钮之间的空格会改变 .

第二个问题是,当我移动按钮时,它会闪烁一些 . 它只能在更高的速度下执行此操作,但在我的情况下这是一个问题 .

我的代码看起来像这样:

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是我试图将按钮的位置设置为的按钮的点 .

我希望有人可以帮我解决这些问题 . 提前致谢!

2 回答

  • 1

    我相信可以通过设置一些额外的表单样式来修复闪烁: SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 在表单的构造函数中 . 它将使用双缓冲,通常只是绘制更快 .

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

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

    然后使用clientCursor在客户端空间中获取准确的X.

  • 1

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

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

    而不是 this ,你应该使用按钮的父控件( PanelGroupBox 等) .

相关问题