所以我试图制作一个滑块 . 我正在使用光标移动按钮的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 回答
我相信可以通过设置一些额外的表单样式来修复闪烁:
SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
在表单的构造函数中 . 它将使用双缓冲,通常只是绘制更快 .对于
Cursor
类,它是相对于屏幕而不是您的表单 . 您可以使用this.PointToClient()
函数来获取客户端的光标空间位置,如下所示:然后使用clientCursor在客户端空间中获取准确的X.
您必须将屏幕坐标转换为客户端坐标 .
而不是
this
,你应该使用按钮的父控件(Panel
,GroupBox
等) .