문제

간단한 이미지 디버거 시각화를 만들고 있습니다. 코드는 다음과 같습니다. 이미지 인스턴스를 수동으로 처리 해야하는지 확실하지 않습니까? 내 동적 이미지가 포함 된 Windows 양식 창과 그림 상자를 만들기 때문에. 양식이 종료 될 때는 특별 코드를 추가해야합니까?

코드는 다음과 같습니다.

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();
        }
    }
}

도움을 주셔서 감사합니다 :)

도움이 되었습니까?

해결책

쇼 메소드를 이것으로 변경하십시오.

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();
    } 
}

사용 () {} 블록은 닫힌 후 양식에 dispose를 호출하여 양식의 모든 것을 폐기합니다.

다른 팁

사진 상자 컨트롤은 이미지를 처리하지 않으므로 이것은 귀하에게 달려 있습니다.

음, 나는 여기서 사지로 나가서 그것을 처분해서는 안된다고 말할 것입니다.

나는 Visualizer를 만들지 않았고 Visual Studio가 이것을하는 것을 정확히 알지 못하지만, Visualizer에 객체를 처리하면 디버깅하는 코드를 깨뜨릴 수 있습니다.

그것은 모두이 줄로 내려진다 :

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

해당 객체가 클론이 아닌 경우 디버그 된 코드로 생성 된 객체를 처리합니다. 코드는 그 객체가 갑자기 배치 될 것으로 기대하지 않으며, S는 팬에 부딪쳐서 최소한 디버깅을 다시 시작해야합니다.

나는 그것을 안전하게 플레이하고 그것을 처분하지 않습니다. 당신은 디버깅하고 있습니다. 그것은 오래 살았던 과정이 아닙니다. 비트 맵 핸들을 누출하면 세상의 끝이 아닙니다 ...

나는 당신이 그것을 처분해야한다고 생각합니다. 메소드의 첫 번째 줄 (이미지 이미지 = ... 라인 주변)에 사용 ()을 추가하고 양식에 종료하기 만하면됩니다.

이미지를 처리하는 것이 안전하다고 생각합니다. 시각화 된 객체를 변경하려면 TransferData/TranferoBject/ReplaceAt/ReplaceObject 메서드 중 하나를 호출하여 다시 보내야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top