当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 C#
How to change my mouse cursor when my mouse hover on specified area of my control? using c#
我认为我的标题几乎说明了我的问题的一切。但让我们更深入一点。
我的问题是:-
只要我的鼠标悬停在指定的坐标和区域上,我就会得到这个矩形列表,其中包含 X、Y、宽度和高度。我想让我的光标变成手或其他东西。但是我的代码似乎对前面的矩形区域不起作用,但它对列表中的最后一个矩形区域有效。有什么解决方法可以指导我吗
void MouseChanger(MouseEventArgs e)
{
RectangleF[] allRectangles = new RectangleF[aListDrawings.Count];
aListDrawings.CopyTo(allRectangles);
if (allRectangles.Length == 0)
return;
RectangleF currentSelected = RectangleF.Empty;
foreach (RectangleF rec in allRectangles)
{
float Xm = e.X;
float Ym = e.Y;
RectangleF current = GetOffsetRectangle(rec);
if (((Xm >= current.X) && (Xm <= (current.X + current.Width))) && ((Ym >= current.Y) && (Ym <= (current.Y + current.Width))))
{
this.Cursor = Cursors.Hand;
}
else
{
this.Cursor = Cursors.Default;
}
}
}
正如您在参数中看到的,MouseEventArgs 将在 MouseMove 事件期间提供给此方法。非常感谢
真正的错误在else子句中。删除它并在if中设置一个标志;循环后检查这个..:
bool flag = false;
foreach (RectangleF rec in allRectangles)
{
if (rec.Contains(e.Location))
{
this.Cursor = Cursors.Hand;
flag = true;
break;
}
}
if (!flag) this.Cursor = Cursors.Default;
如评论中所述,问题是您在循环中一遍又一遍地设置光标。定义一个变量并在循环后检查它是否已更改。此外,如果您发现与矩形重叠,则可以使用 break;
离开循环。正如@TaW 在他的回答中提到的那样,Rectangle.Contains 使整个事情变得更容易。
void MouseChanger(MouseEventArgs e)
{
RectangleF[] allRectangles = new RectangleF[aListDrawings.Count];
aListDrawings.CopyTo(allRectangles);
if (allRectangles.Length == 0)
return;
RectangleF currentSelected = RectangleF.Empty;
var overlap = false;
foreach (RectangleF rec in allRectangles)
{
float Xm = e.X;
float Ym = e.Y;
RectangleF current = GetOffsetRectangle(rec);
if (((Xm >= current.X) && (Xm <= (current.X + current.Width))) && ((Ym >= current.Y) && (Ym <= (current.Y + current.Width))))
{
overlapse=true;
break;
}
}
this.Cursor = overlapse ? Cursors.Hand : Cursors.Default;
}
请使用return/break 来停止循环,否则它会继续检查。这就是它对最后一个工作而不对其他工作的原因,因为迭代继续并且条件执行。
if (((Xm >= current.X) && (Xm <= (current.X + current.Width))) && ((Ym >= current.Y) && (Ym <= (current.Y + current.Width))))
{
this.Cursor = Cursors.Hand;
return;
}
else
{
this.Cursor = Cursors.Default;
}
我认为我的标题几乎说明了我的问题的一切。但让我们更深入一点。
我的问题是:-
只要我的鼠标悬停在指定的坐标和区域上,我就会得到这个矩形列表,其中包含 X、Y、宽度和高度。我想让我的光标变成手或其他东西。但是我的代码似乎对前面的矩形区域不起作用,但它对列表中的最后一个矩形区域有效。有什么解决方法可以指导我吗
void MouseChanger(MouseEventArgs e)
{
RectangleF[] allRectangles = new RectangleF[aListDrawings.Count];
aListDrawings.CopyTo(allRectangles);
if (allRectangles.Length == 0)
return;
RectangleF currentSelected = RectangleF.Empty;
foreach (RectangleF rec in allRectangles)
{
float Xm = e.X;
float Ym = e.Y;
RectangleF current = GetOffsetRectangle(rec);
if (((Xm >= current.X) && (Xm <= (current.X + current.Width))) && ((Ym >= current.Y) && (Ym <= (current.Y + current.Width))))
{
this.Cursor = Cursors.Hand;
}
else
{
this.Cursor = Cursors.Default;
}
}
}
正如您在参数中看到的,MouseEventArgs 将在 MouseMove 事件期间提供给此方法。非常感谢
真正的错误在else子句中。删除它并在if中设置一个标志;循环后检查这个..:
bool flag = false;
foreach (RectangleF rec in allRectangles)
{
if (rec.Contains(e.Location))
{
this.Cursor = Cursors.Hand;
flag = true;
break;
}
}
if (!flag) this.Cursor = Cursors.Default;
如评论中所述,问题是您在循环中一遍又一遍地设置光标。定义一个变量并在循环后检查它是否已更改。此外,如果您发现与矩形重叠,则可以使用 break;
离开循环。正如@TaW 在他的回答中提到的那样,Rectangle.Contains 使整个事情变得更容易。
void MouseChanger(MouseEventArgs e)
{
RectangleF[] allRectangles = new RectangleF[aListDrawings.Count];
aListDrawings.CopyTo(allRectangles);
if (allRectangles.Length == 0)
return;
RectangleF currentSelected = RectangleF.Empty;
var overlap = false;
foreach (RectangleF rec in allRectangles)
{
float Xm = e.X;
float Ym = e.Y;
RectangleF current = GetOffsetRectangle(rec);
if (((Xm >= current.X) && (Xm <= (current.X + current.Width))) && ((Ym >= current.Y) && (Ym <= (current.Y + current.Width))))
{
overlapse=true;
break;
}
}
this.Cursor = overlapse ? Cursors.Hand : Cursors.Default;
}
请使用return/break 来停止循环,否则它会继续检查。这就是它对最后一个工作而不对其他工作的原因,因为迭代继续并且条件执行。
if (((Xm >= current.X) && (Xm <= (current.X + current.Width))) && ((Ym >= current.Y) && (Ym <= (current.Y + current.Width))))
{
this.Cursor = Cursors.Hand;
return;
}
else
{
this.Cursor = Cursors.Default;
}