当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 c#

Posted

技术标签:

【中文标题】当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 c#【英文标题】:How to change my mouse cursor when my mouse hover on specified area of my control? using c# 【发布时间】:2015-11-18 10:25:13 【问题描述】:

我认为我的标题几乎说明了我的问题。但让我们再深入一点。

我的问题是:-

每当我的鼠标悬停在指定的坐标和区域上时,我都有这个带有 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 事件期间提供给此方法。非常感谢

【问题讨论】:

你的目标是什么:Winforms? WPF? ASP? ...?? 总是相应地标记您的问题!另请查看Rectangle.Contains - 实际错误在 else 子句中。删除它并在 if; 中设置一个标志;在循环之后检查这个..! 我在 if 子句上使用了 break。非常感谢@TaW。光标位置的另一件事似乎在我的区域之外发生了变化。你觉得这个 if 子句有什么问题吗? if (((Xm >= current.X) && (Xm = current.Y) && (Ym Break 也是一个不错的选择。 - (Ym 【参考方案1】:

看看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;

【讨论】:

再次感谢 Rectangle.Contains【参考方案2】:

正如 cmets 中所述,问题在于您在循环中一遍又一遍地设置光标。定义一个变量并在循环之后检查它是否已更改。此外,如果您发现与矩形重叠,您可以使用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;


【讨论】:

【参考方案3】:

请使用 return / break 来停止循环,否则它会继续检查。这就是它对最后一个起作用而对其他不起作用的原因,因为迭代继续并且 else 条件执行。

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;
            

【讨论】:

以上是关于当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 c#的主要内容,如果未能解决你的问题,请参考以下文章

当用户将鼠标悬停在 TreeView 控件的特定 TreeNode 控件上时显示不同的光标

R情节,当鼠标悬停在图上时正常光标

将鼠标悬停在 url RichTextBox 上时更改光标

当鼠标悬停(悬停)在对象上时,鼠标光标应该改变(three.js)

Vue JS - 如何更改鼠标悬停时显示的组件的位置

如何在鼠标悬停时更改边框粗细