[英]Do I need to dispose or destroy custom cursors
我正在使用类似于该问题的已接受答案的代码来创建自定义光标。 我以为我可以问,“完成自定义光标后该怎么办?” 但具体来说,我的问题分为两部分:
一:我看到了使用反射来设置光标的“ ownHandle”字段的代码。 这样是否会导致在处理Cursor对象时(本机)句柄被破坏? 如果没有,那该怎么办?
第二:我是否必须手动布置游标对象,或者将新的游标分配给控件会导致控件为我布置光标? 例如:
private void customCursorButton_Clicked(object sender, EventArgs e)
{
this.Cursor = NativeMethods.LoadCustomCursor(@"c:\windows\cursors\aero_busy.ani");
}
private void defaultCursorButton_Clicked(object sender, EventArgs e)
{
var tmp = this.Cursor; // do I have to do this
this.Cursor = Cursors.Default;
tmp.Dispose(); // and this?
}
仅在知道100%的情况下,才应在对象上调用Dispose(),以确保该对象未在其他任何地方使用。 调用Dispose()是可选的 ,该对象的终结器确保始终进行清除。 并且100%确保没有在其他任何地方使用它。 从事这项工作只是有点慢。
对于单个游标对象,它没有什么意义,游标最多只有几千个字节的内存。 但是您的代码会为每次单击一次又一次地创建光标,并且易于处理不会赢得很多奖金的父级光标(Cursor属性是一个环境属性)。 因此,需要付出努力的适当代码应类似于以下内容:
private Cursor CustomCursor;
private void customCursorButton_Clicked(object sender, EventArgs e)
{
if (CustomCursor == null) CustomCursor = NativeMethods.LoadCustomCursor(@"c:\windows\cursors\aero_busy.ani");
this.Cursor = CustomCursor;
}
private void defaultCursorButton_Clicked(object sender, EventArgs e)
{
var prev = this.Cursor;
this.Cursor = Cursors.Default;
if (prev == CustomCursor) {
CustomCursor.Dispose();
CustomCursor = null;
}
}
protected override OnFormClosed(FormClosedEventArgs e)
{
base.OnFormClosed(e);
if (CustomCursor != null) CustomCursor.Dispose();
}
有一个简单的诊断程序可以知道您误会了。 任务管理器通常不适合分析.NET应用程序,但是很高兴向您显示在这种情况下丢失Dispose()调用是否使您陷入麻烦。 使用“查看+选择列”并勾选“ GDI对象”,它可以非常精确地跟踪光标对象(除其他GDI对象之外)。 使显示的值超过数百是麻烦,付出或失败的标志。
请注意,您必须使用Environment.GetFolderPath()来检索Windows的安装位置。 并且处理失败时,没有硬保证游标将始终可用。 细节,细节。
您应该处置正在创建的对象,并且您的处理方式看起来不错。
只是不要忘记在关闭窗体时也要释放自定义光标。
我看到了使用反射来设置光标的“ ownHandle”字段的代码。 这样是否会导致在处理Cursor对象时(本机)句柄被破坏? 如果没有,那该怎么办?
它应该释放手柄。 处置旨在释放非托管资源。
我是否必须手动布置游标对象,或者将新的游标分配给控件会导致控件为我布置光标?
丢失对包含非托管资源的对象的引用是一个坏主意。 最终将对其进行GC处理,然后将调用描述符,以放置该对象,但仍然如此。
但是,重新分配属性Cursor
是另一回事。 可能会创建属性的setter来单独处理旧值,但是,我强烈感觉它不会这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.