我正在制作一个简单的Image Debugger Visualizer。代码如下。我不确定是否需要手动处理Image实例?因为我正在创建一个Windows窗体窗口和里面的PictureBox包含我的动态图像..我需要在窗体终止时添加一些特殊代码,处理这个?
这是代码..
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.DebuggerVisualizers;
using DebuggerVisualizers;
[assembly: DebuggerVisualizer(
typeof (ImageDebuggerVisualizer),
typeof (VisualizerObjectSource),
Target = typeof (Image),
Description = "Image Visualizer")]
namespace DebuggerVisualizers
{
public class ImageDebuggerVisualizer : DialogDebuggerVisualizer
{
protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
{
Image image = (Image) objectProvider.GetObject();
Form form = new Form
{
Text = ("Image Visualizer - " + image.HorizontalResolution + " " + image.VerticalResolution),
Width = image.Width,
Height = image.Height
};
PictureBox pictureBox = new PictureBox {Image = image, SizeMode = PictureBoxSizeMode.AutoSize};
form.Controls.Add(pictureBox);
form.ShowDialog();
}
}
}
感谢您的帮助:))
答案 0 :(得分:2)
将Show方法更改为:
protected override void Show(IDialogVisualizerService windowService,
IVisualizerObjectProvider objectProvider)
{
Image image = (Image) objectProvider.GetObject();
using (Form form = new Form())
{
PictureBox pictureBox = new PictureBox();
pictureBox.Image = image;
form.Controls.Add(pictureBox);
form.ShowDialog();
}
}
using(){}块在关闭后会在窗体上调用Dispose,它也会处理窗体上的所有内容。
答案 1 :(得分:1)
图片框控件不处理图像,所以这取决于你,是的。
答案 2 :(得分:1)
我从未创建过可视化工具,但我并不完全知道Visual Studio会这样做,但在我看来,如果你在可视化工具中处理了一个对象,你可能会破坏你正在调试的代码。
这一切都归结为这一行:
Image image = (Image) objectProvider.GetObject();
如果该对象不是克隆,那么您将处置由正在调试的代码创建的对象。代码不会期望该对象突然被丢弃,并且S会击中风扇,导致您至少不得不重新启动调试。
我会安全地玩它而不是处理掉它。想一想 - 你正在调试。这不是一个漫长的过程。如果你确实泄漏了一个位图句柄,那它就不是世界末日......
答案 3 :(得分:0)
我认为你应该处理它。它应该很简单,只需在方法的第一行添加一个using()(在Image image = ...行周围),然后在form.ShowDialog()之后结束它。
我认为处理图像是安全的,因为如果要更改可视化对象,则必须调用TransferData / TranferObject / ReplaceDat / ReplaceObject方法之一将其发送回来。