光标未在Windows窗体中更新

时间:2012-05-14 12:41:16

标签: c# winforms cursor

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

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

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

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

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

2 个答案:

答案 0 :(得分: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()来销毁句柄,使其无效。现在,您创建的Cursor具有相同的句柄,但它不知道句柄不再有效。 当您尝试设置无效光标时,操作系统只使用默认光标。

答案 1 :(得分:0)

尝试更改UserControls的MouseEnterMouseLeave事件中的光标。

Psuedo代码:

MouseEnter Event

Change mouse cursor to hand

MouseLeave Event

Change mouse cursor to normal

请参阅here