Jer*_*sen 0 c# cursors idisposable custom-controls
我正在使用类似于此问题的接受答案的代码来制作自定义光标.我想我可以问,"当我完成自定义光标后我该怎么办?" 但具体来说,我的问题分为两部分:
一:我看到使用反射来设置光标的"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?
}
Run Code Online (Sandbox Code Playgroud)
如果您知道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();
}
Run Code Online (Sandbox Code Playgroud)
有一个简单的诊断可以知道你弄错了顺便说一下.任务管理器通常不适合分析.NET应用程序,但很高兴向您展示在这种情况下丢失Dispose()调用是否会让您遇到麻烦.使用View + Select Columns并勾选"GDI Objects",它可以非常准确地跟踪光标对象(除了其他GDI对象).让显示的值超过几百是一个麻烦,给予或接受的迹象.
请注意,您必须使用Environment.GetFolderPath()来检索Windows的安装位置.处理失败,没有硬性保证光标始终可用.细节,细节.
| 归档时间: |
|
| 查看次数: |
705 次 |
| 最近记录: |