光标未在 Windows 窗体中更新
本文关键字:更新 窗体 Windows 光标 | 更新日期: 2023-09-27 18:34:01
我有一个带有用户控件的WinForms应用程序,我根据光标的位置动态更改光标。我将自定义游标创建为用户控件的静态成员,如下所示:
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
然后在OnMouseMove
覆盖中,我设置了适当的光标,如下所示:
this.Cursor = <some condition> ? _openHandCursor : Cursors.Default;
当我启动应用程序时,它工作正常。但是,在几次光标更改(大约 20 次)后,它坚持使用默认(箭头)位图,不再更改。但最奇怪的是,发生这种情况后,我检查当前Cursor
值的Handle
属性,它等于_openHandCursor
对象的句柄!因此,似乎属性的值仍在正确设置,但屏幕上的光标位图未更新。对这种奇怪的行为有什么建议吗?
更改
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
自
private static Cursor _openHandCursor = Properties.Resources.openHand;
当您创建对象(new Cursor (<Handle>)
)时Cursor
它只是重用与资源中的游标相同的句柄。由于您不存储对原始游标(由属性 getter 创建Properties.Resources.openHand.Handle
)的引用,因此它将被垃圾回收。 Cursor
类定义了终结器,它通过调用 DestroyCursor()
来破坏句柄,使其无效。现在,您创建的Cursor
具有相同的句柄,但它不知道该句柄不再有效。操作系统仅在您尝试设置无效光标时使用默认光标。
尝试更改用户控件的MouseEnter
和MouseLeave
事件中的光标。
伪代码:
MouseEnter Event
Change mouse cursor to hand
MouseLeave Event
Change mouse cursor to normal
看这里