光标未在 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对象的句柄!因此,似乎属性的值仍在正确设置,但屏幕上的光标位图未更新。对这种奇怪的行为有什么建议吗?

光标未在 Windows 窗体中更新

更改

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具有相同的句柄,但它不知道该句柄不再有效。操作系统仅在您尝试设置无效光标时使用默认光标。

尝试更改用户控件的MouseEnterMouseLeave事件中的光标。

伪代码:

MouseEnter Event

Change mouse cursor to hand

MouseLeave Event

Change mouse cursor to normal

看这里