C# 未在Windows窗体中更新光标
我有一个WinForms应用程序,其中有一个用户控件,我可以根据光标的位置动态更改光标。我将自定义游标创建为用户控件的静态成员,如下所示:C# 未在Windows窗体中更新光标,c#,winforms,cursor,C#,Winforms,Cursor,我有一个WinForms应用程序,其中有一个用户控件,我可以根据光标的位置动态更改光标。我将自定义游标创建为用户控件的静态成员,如下所示: private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle ); this.Cursor = <some condition> ? _openHandCursor : Cursors.Default; 然后在OnMouseMo
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
this.Cursor = <some condition> ? _openHandCursor : Cursors.Default;
然后在OnMouseMove
override中,我设置了相应的光标,如下所示:
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
this.Cursor = <some condition> ? _openHandCursor : Cursors.Default;
this.Cursor=_openHandCursor:游标。默认值;
当我启动应用程序时,它工作正常。但是,在光标发生两次更改(大约20次)后,它将与默认(箭头)位图保持一致,不再更改。但最奇怪的是,在这种情况发生后,我检查当前
游标值的句柄属性,它等于\u openHandCursor
对象的句柄!因此,属性的值似乎仍在正确设置,但屏幕上的光标位图没有得到更新。有关于这种奇怪行为的建议吗?尝试在用户控件的MouseEnter
和MouseLeave
事件中更改光标
Psuedo代码:
MouseEnter事件
将鼠标光标更改为手动
MouseLeave事件
将鼠标光标更改为正常
请参见尝试在用户控件的MouseEnter
和MouseLeave
事件中更改光标
Psuedo代码:
MouseEnter事件
将鼠标光标更改为手动
MouseLeave事件
将鼠标光标更改为正常
请参见更改
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
到
当您创建Cursor
对象(newcursor()
)时,它只是从资源中重用与Cursor相同的句柄。
由于您不存储对原始游标的引用(由Properties.Resources.openHand.Handle
property getter创建),它将被垃圾收集。
Cursor
类定义终结器,该终结器通过调用DestroyCursor()
来销毁句柄,使其无效。现在,您创建的光标具有相同的句柄,但它不知道句柄不再有效。
当您试图设置无效光标时,操作系统仅使用默认光标。更改
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
到
当您创建Cursor
对象(newcursor()
)时,它只是从资源中重用与Cursor相同的句柄。
由于您不存储对原始游标的引用(由Properties.Resources.openHand.Handle
property getter创建),它将被垃圾收集。
Cursor
类定义终结器,该终结器通过调用DestroyCursor()
来销毁句柄,使其无效。现在,您创建的光标具有相同的句柄,但它不知道句柄不再有效。
当您试图设置无效光标时,操作系统仅使用默认光标。这段代码有些神秘之处。游标作为字节[]嵌入到资源中,而不是任何具有句柄属性的内容。你是在手工编辑Resources.Designer.cs文件吗?@HansPassant查看我对@max的回答的评论-我最初使用的资源是一个图标
。这段代码有点神秘。游标作为字节[]嵌入到资源中,而不是任何具有句柄属性的内容。你是在手工编辑Resources.Designer.cs文件吗?@HansPassant查看我对@max的答案的评论-我最初使用的资源是一个图标
。答案很好,谢谢。我在游标
构造函数中使用的资源最初是一个图标
,显然不正确。我更改了它,现在有了一个合适的.cur
文件(以字节[]
的形式),然后在游标
构造函数重载中使用系统.IO.MemoryStream
对象。回答得好,谢谢。我在游标
构造函数中使用的资源最初是一个图标
,显然不正确。我更改了它,因此现在有了一个适当的.cur
文件(以字节[]
的形式),然后在游标
构造函数重载中使用系统.IO.MemoryStream
对象。