75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.ComponentModel;
 | ||
| using System.Data;
 | ||
| using System.Drawing;
 | ||
| using System.Linq;
 | ||
| using System.Text;
 | ||
| using System.Threading.Tasks;
 | ||
| using System.Windows.Forms;
 | ||
| using WeifenLuo.WinFormsUI.Docking;
 | ||
| 
 | ||
| namespace Check.Main.UI
 | ||
| {
 | ||
|     public partial class FormImageDisplay : DockContent
 | ||
|     {
 | ||
|         /// <summary>
 | ||
|         /// 相机名称
 | ||
|         /// </summary>
 | ||
|         public string CameraName { get; set; }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 当此显示窗口发生特定事件时(如ROI裁剪),触发此事件以通知外部(如日志系统)
 | ||
|         /// </summary>
 | ||
|         public event Action<string> OnDisplayEvent;
 | ||
| 
 | ||
|         // 使用我们全新的自定义控件
 | ||
|         private ZoomPictureBox zoomPictureBox;
 | ||
|         public FormImageDisplay()
 | ||
|         {
 | ||
|             InitializeComponent();
 | ||
| 
 | ||
|             // 实例化新的控件
 | ||
|             zoomPictureBox = new ZoomPictureBox
 | ||
|             {
 | ||
|                 Dock = DockStyle.Fill,
 | ||
|                 // 其他属性可以在这里设置,例如
 | ||
|                 // RectangleColor = Color.LawnGreen,
 | ||
|                 // BackgroundFillColor = Color.FromArgb(45, 45, 48)
 | ||
|             };
 | ||
|             this.Controls.Add(zoomPictureBox);
 | ||
| 
 | ||
|             // 订阅自定义控件的ROI裁剪完成事件
 | ||
|             zoomPictureBox.CroppingEnabled = false;
 | ||
|             //zoomPictureBox.Cropped += ZoomPictureBox_Cropped;
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 更新显示的图像(线程安全)。
 | ||
|         /// 此方法现在将图像设置到 ZoomPictureBox1 控件中。
 | ||
|         /// </summary>
 | ||
|         /// <param name="image">从相机事件传来的原始Bitmap</param>
 | ||
|         public void UpdateImage(Bitmap image)
 | ||
|         {
 | ||
|             if (zoomPictureBox != null && !zoomPictureBox.IsDisposed)
 | ||
|             {
 | ||
|                 zoomPictureBox.SetImageThreadSafe(image);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 // 如果PictureBox已经被释放,那么我们也应该释放这个多余的图像
 | ||
|                 image?.Dispose();
 | ||
|             }
 | ||
|         }
 | ||
|         // 重写 Close 方法,确保在窗口关闭时,内部的控件和资源也能被妥善处理
 | ||
|         public new void Close()
 | ||
|         {
 | ||
|             // 取消事件订阅,防止内存泄漏
 | ||
|             if (zoomPictureBox != null)
 | ||
|             {
 | ||
|                 //zoomPictureBox.Cropped -= ZoomPictureBox_Cropped;
 | ||
|             }
 | ||
|             base.Close();
 | ||
|         }
 | ||
|     }
 | ||
| }
 |