2

我正在制作一个简单的 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();
        }
    }
}

谢谢你的帮助 :)

4

4 回答 4

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,这也将处理表单上的所有内容。

于 2008-11-25T15:03:00.853 回答
1

图片框控件不会处理图像,所以这取决于您,是的。

于 2008-11-25T13:55:59.147 回答
1

嗯,我要在这里站出来,说你不应该处理它。

我从未创建过可视化工具,我也不完全知道 Visual Studio 会这样做,但在我看来,如果您在可视化工具中处理对象,您可能会破坏正在调试的代码。

这一切都归结为这一行:

Image image = (Image) objectProvider.GetObject();

如果该对象不是克隆,那么您将处置由正在调试的代码创建的对象。代码不会期望该对象会突然被释放,并且 S 会撞到风扇,导致您至少必须重新开始调试。

我会安全地玩它,而不是丢弃它。想想看——你在调试。这不是一个长期存在的过程。如果您确实泄漏了位图句柄,那并不是世界末日...

于 2008-11-25T14:35:34.577 回答
0

我认为你应该处理它。这应该很简单,只需在方法的第一行(围绕 Image image = ... 行)添加 using() 并在 form.ShowDialog() 之后结束它。

我认为处置图像是安全的,因为如果您想更改可视化对象,您必须调用 TransferData/TranferObject/ReplaceDat/ReplaceObject 方法之一将其发回。

于 2008-11-25T14:45:41.280 回答