繁体   English   中英

我是否需要处置或破坏自定义游标

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM