1

我有一个带有用户控件的 WinForms 应用程序,我在其中根据光标的位置动态更改光标。我将自定义光标创建为用户控件的静态成员,如下所示:

private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );

然后在OnMouseMove覆盖中设置适当的光标,如下所示:

this.Cursor = <some condition> ? _openHandCursor : Cursors.Default;

当我启动应用程序时,它可以正常工作。但是,经过几次光标更改(大约 20 次)后,它仍然使用默认(箭头)位图并且不再更改。但最奇怪的是,发生这种情况后,我检查了Handle当前Cursor值的属性,它等于_openHandCursor对象的句柄!因此,似乎该属性的值仍在正确设置,但屏幕上的光标位图没有得到更新。关于这种奇怪的行为有什么建议吗?

4

2 回答 2

1

改变

private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );

private static Cursor _openHandCursor = Properties.Resources.openHand;

当您创建Cursor对象 ( new Cursor (<Handle>)) 时,它只是从资源中重用与游标相同的句柄。由于您不存储对原始游标(由Properties.Resources.openHand.Handle属性 getter 创建)的引用,它将被垃圾收集。 Cursor类定义了终结器,它通过调用销毁句柄DestroyCursor(),使其无效。您创建的NowCursor具有相同的句柄,但它不知道该句柄不再有效。当您尝试设置无效光标时,操作系统仅使用默认光标。

于 2012-05-14T13:16:00.930 回答
0

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

伪代码:

MouseEnter Event

Change mouse cursor to hand

MouseLeave Event

Change mouse cursor to normal

这里

于 2012-05-14T13:14:33.117 回答