Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未在Windows窗体中更新光标_C#_Winforms_Cursor - Fatal编程技术网

C# 未在Windows窗体中更新光标

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

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

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
对象。