当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 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 事件期间提供给此方法。非常感谢

看看Rectangle.Contains

真正的错误在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;
            }