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

时间:2016-12-12 12:29:08

标签: c# winforms visual-studio visual-studio-2015

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

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

第一个问题是,当我按下按钮并移动它时,按钮会随着鼠标的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 个答案:

答案 0 :(得分: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等)。

答案 1 :(得分:1)

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

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

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

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

相关问题