我有一个显示图像的用户控件,将鼠标悬停在该控件上时,图像名称显示在图像下方的标签中。我已将此用户控件放在TableLayoutPanel
单元格中,该单元格创建了一个图像表。
我试图在鼠标移到每个控件上,甚至在窗体本身上时更改光标。
我试图把
Cursor.Current = Cursors.Hand
在MouseEnter
控制器的情况下TableLayoutPanel
,即使是父形式也没有运气。什么都没发生。为什么?
我还注意到,这在用户控件中很常见,在输入用户控件时很难更改鼠标光标。
有谁知道如何在用户控件中更改光标?
在内部,每个窗口都有一个与之关联的游标。(在Windows中,控件是一种窗口。)当鼠标指针移到该窗口上时,操作系统将向其发送一条消息(WM_SETCURSOR),询问应显示哪个光标。窗口以其关联的光标进行响应,系统使用它。例如,这就是文本框显示I型光标的方式。
当然,光标是全局资源,因此,尽管可以临时更改它,但只要将鼠标指针移到另一个控件上,就会发生上述过程,并且光标将变回原处。这就是您设置时发生的情况Cursor.Current
。这对全局游标进行了临时更改,但是与您的控件相关联的游标实际上已还原了该临时更改。像这样的临时变化时非常方便,例如,呈现出忙状态光标。它使您不必记住将忙碌的游标更改回标准指针。
如果在鼠标指针悬停在控件上时始终希望显示特定的光标,则需要将该光标与该控件关联。操作系统提供了一种执行此操作的方法,并且WinForms中有一个非常简单的包装程序。只需将控件的Cursor
属性设置为所需的任何类型的游标即可。这可以是系统提供的标准游标之一,也可以是Cursor
您创建的自定义对象。您可以在设计时或在控件的构造函数中设置此属性。
值得注意的是,该Cursor
属性是环境属性,这是一种特殊类型的属性。如果尚未将环境属性显式设置为值,它将从控件的父级继承其值。因此,这意味着您可以Cursor
为整个Form设置属性,并且该窗体上的所有控件都将继承该值并显示相同的光标。(在内部,每个控件实际上是一个单独的窗口,因此,如果没有此窗口,则需要遍历并为每个控件设置光标。)
但是,如果您的眼睛敏锐,您会立即发现问题。的Cursors.Hand
光标是难看和非标。(这不会影响其他Cursors
选项。)由于使用时间长,WinForms实际上并未为此使用系统的Hand光标。它使用自己的硬编码黑白版本,像拇指酸痛一样伸出来。如果要修复它,将需要一些额外的工作。我不久前写了一个解决方案,展示了如何继承和修复内置的LinkLabel控件。您可以将其调整为适用于任何控件,包括UserControl
。除名称外,所有代码均相同。在我在这里开始回答后阅读了背景信息之后,您应该清楚地知道代码在做什么。
最后的警告:Cursors.Hand
光标经常被滥用。有时,您会看到人们在按钮或其他控件上使用此光标,只是表示可以“单击”它。手形光标几乎专门用于Web样式的超链接。操作系统本身遵循此约定,精心设计的应用程序也应遵循此约定。这意味着它不应用于标准按钮或任何看起来柔韧的东西,而应将其用于承受能力较弱且否则无法单击的链接。我不能从问题中看出您的用例是否合适。可能是因为听起来像您已经创建了超链接。但是我只是想为了将来的读者而提及这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句