所以我试图制作一个滑块。我正在使用光标移动按钮的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是我试图将按钮的位置设置为按钮的点。
我希望有人能帮助我解决这些问题。提前谢谢!
答案 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
你应该使用按钮的父控件(Panel
,GroupBox
等)。
答案 1 :(得分:1)
我相信可以通过设置其他一些表单样式来修复闪烁:SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
在窗体的构造函数中。它将使用双缓冲,通常只是画得更快。
对于Cursor
课程,它与屏幕相关,而不是您的表格。您可以使用this.PointToClient()
函数来获取客户端的光标空间位置,如下所示:
Point clientCursor = this.PointToClient(Cursor.Position);
然后使用clientCursor在客户端空间中获取准确的X.