,所以我试图制作一个滑块。我正在使用光标移动按钮的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
您应该使用按钮的父控件(Panel
,GroupBox
等)。