当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 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 控件上时显示不同的光标