// 版权所有(C) ChoiceTech Corporation。保留所有权利。 // 此代码的发布遵从 // ChoiceTech 公共许可(HY-PL,http://choicetech.cn/hy-pl.html)的条款。 // //版权所有(C) ChoiceTech Corporation。保留所有权利。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using HalconDotNet; using System.Diagnostics; namespace ChoiceTech.Halcon.Control { /// /// halcon鼠标缩放控件 /// /// 描述: /// 1, 必须首先通过this.HobjectToHimage(HObject hobject)传入图片,此图片称为"背景图" /// 2, 有了背景图,就可以通过本控件自定义的 this.DispObj(HObject hObj)显示HObject,类似原方法 /// 3,默认显示红色,DispObj(HObject hObj,string color)可显示其他颜色 /// public partial class HWindow_Final : UserControl { #region 私有变量定义. private HWindow /**/ hv_window; //halcon窗体控件的句柄 this.mCtrl_HWindow.HalconWindow; private ContextMenuStrip /**/ hv_MenuStrip; //右键菜单控件 // 窗体控件右键菜单内容 ToolStripMenuItem fit_strip; ToolStripMenuItem saveImg_strip; ToolStripMenuItem saveWindow_strip; ToolStripMenuItem barVisible_strip; ToolStripMenuItem histogram_strip; private HImage /**/ hv_image; //缩放时操作的图片 此处千万不要使用hv_image = new HImage(),不然在生成控件dll的时候,会导致无法序列化,去你妈隔壁,还好老子有版本控制,不然都找不到这种恶心问题 private int /**/ hv_imageWidth, hv_imageHeight; //图片宽,高 private string /**/ str_imgSize; //图片尺寸大小 5120X3840 private bool /**/ drawModel = false; //绘制模式下,不允许缩放和鼠标右键菜单 public ViewWindow.ViewWindow viewWindow; /**/ //ViewWindow public HWindowControl hWindowControl; /**/ // 当前halcon窗口 #endregion private bool IsDesignMode() { bool flag = false; #if DEBUG if(LicenseManager.UsageMode== LicenseUsageMode.Designtime) { flag = true; } else if(Process.GetCurrentProcess().ProcessName=="devenv") { flag = true; } #endif return flag; } /// /// 初始化控件 /// public HWindow_Final() { InitializeComponent(); // viewWindow = new ViewWindow.ViewWindow(mCtrl_HWindow); hWindowControl = this.mCtrl_HWindow; if(!IsDesignMode()) { hv_window = this.mCtrl_HWindow.HalconWindow; } // 设定鼠标按下时图标的形状 // 'arrow' 'default' 'crosshair' 'text I-beam' 'Slashed circle' 'Size All' // 'Size NESW' 'Size S' 'Size NWSE' 'Size WE' 'Vertical Arrow' 'Hourglass' // // hv_window.SetMshape("Hourglass"); fit_strip = new ToolStripMenuItem("Adapt window"); fit_strip.Click += new EventHandler((s, e) => DispImageFit(mCtrl_HWindow)); barVisible_strip = new ToolStripMenuItem("Show StatusBar"); barVisible_strip.CheckOnClick = true; barVisible_strip.CheckedChanged += new EventHandler(barVisible_strip_CheckedChanged); m_CtrlHStatusLabelCtrl.Visible = false; mCtrl_HWindow.Height = this.Height; saveImg_strip = new ToolStripMenuItem("Save original image"); saveImg_strip.Click += new EventHandler((s, e) => SaveImage()); saveWindow_strip = new ToolStripMenuItem("Save window thumb image"); saveWindow_strip.Click += new EventHandler((s, e) => SaveWindowDump()); histogram_strip = new ToolStripMenuItem("Show histogram(H)"); histogram_strip.CheckOnClick = true; histogram_strip.Checked = false; hv_MenuStrip = new ContextMenuStrip(); hv_MenuStrip.Items.Add(fit_strip); hv_MenuStrip.Items.Add(barVisible_strip); hv_MenuStrip.Items.Add(new ToolStripSeparator()); hv_MenuStrip.Items.Add(saveImg_strip); hv_MenuStrip.Items.Add(saveWindow_strip); barVisible_strip.Enabled = true; fit_strip.Enabled = false; histogram_strip.Enabled = false; saveImg_strip.Enabled = false; saveWindow_strip.Enabled = false; mCtrl_HWindow.ContextMenuStrip = hv_MenuStrip; mCtrl_HWindow.SizeChanged += new EventHandler((s, e) => DispImageFit(mCtrl_HWindow)); } /// /// 绘制模式下,不允许缩放和鼠标右键菜单 /// public bool DrawModel { get { return drawModel; } set { //缩放控制 viewWindow.setDrawModel(value); //绘制模式 不现实右键 if (value == true) { mCtrl_HWindow.ContextMenuStrip = null; } else { //恢复 mCtrl_HWindow.ContextMenuStrip = hv_MenuStrip; } drawModel = value; } } /// /// 设置image,初始化控件参数 /// public HImage Image { get { return this.hv_image; } set { if (value != null) { if (this.hv_image != null) { this.hv_image.Dispose(); } this.hv_image = value; hv_image.GetImageSize(out hv_imageWidth, out hv_imageHeight); str_imgSize = String.Format("{0}X{1}", hv_imageWidth, hv_imageHeight); //DispImageFit(mCtrl_HWindow); try { barVisible_strip.Enabled = true; fit_strip.Enabled = true; histogram_strip.Enabled = true; saveImg_strip.Enabled = true; saveWindow_strip.Enabled = true; } catch (Exception) { } viewWindow.displayImage(hv_image); } } } /// /// 获得halcon窗体控件的句柄 /// public IntPtr HWindowHalconID { get { return this.mCtrl_HWindow.HalconID; } } public HWindowControl getHWindowControl() { return this.mCtrl_HWindow; } /// /// 状态条 显示/隐藏 CheckedChanged事件 /// /// /// void barVisible_strip_CheckedChanged(object sender, EventArgs e) { ToolStripMenuItem strip = sender as ToolStripMenuItem; this.SuspendLayout(); if (strip.Checked) { m_CtrlHStatusLabelCtrl.Visible = true; //mCtrl_HWindow.Height = this.Height - m_CtrlHStatusLabelCtrl.Height - m_CtrlHStatusLabelCtrl.Margin.Top - m_CtrlHStatusLabelCtrl.Margin.Bottom; mCtrl_HWindow.HMouseMove += HWindowControl_HMouseMove; } else { m_CtrlHStatusLabelCtrl.Visible = false; //mCtrl_HWindow.Height = this.Height; mCtrl_HWindow.HMouseMove -= HWindowControl_HMouseMove; } //DispImageFit(mCtrl_HWindow); this.ResumeLayout(false); this.PerformLayout(); } public void showStatusBar() { barVisible_strip.Checked = true; } /// /// 保存窗体截图到本地 /// private void SaveWindowDump() { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "PNG图像|*.png|所有文件|*.*"; if (sfd.ShowDialog() == DialogResult.OK) { if (String.IsNullOrEmpty(sfd.FileName)) return; //截取窗口图 HOperatorSet.DumpWindow(HWindowHalconID, "png best", sfd.FileName); } } /// /// 保存原始图片到本地 /// private void SaveImage() { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "BMP图像|*.bmp|所有文件|*.*"; if (sfd.ShowDialog() == DialogResult.OK) { if (String.IsNullOrEmpty(sfd.FileName)) { return; } HOperatorSet.WriteImage(hv_image, "bmp", 0, sfd.FileName); } } /// /// 图片适应大小显示在窗体 /// /// halcon窗体控件 private void DispImageFit(HWindowControl hw_Ctrl) { try { this.viewWindow.resetWindowImage(); } catch (Exception) { } } /// /// 鼠标在空间窗体里滑动,显示鼠标所在位置的灰度值 /// /// /// private void HWindowControl_HMouseMove(object sender, HMouseEventArgs e) { if (hv_image != null) { try { int button_state; double positionX, positionY; string str_value; string str_position; bool _isXOut = true, _isYOut = true; HTuple channel_count; HOperatorSet.CountChannels(hv_image, out channel_count); hv_window.GetMpositionSubPix(out positionY, out positionX, out button_state); str_position = String.Format("ROW: {0:0000.0}, COLUMN: {1:0000.0}", positionY, positionX); _isXOut = (positionX < 0 || positionX >= hv_imageWidth); _isYOut = (positionY < 0 || positionY >= hv_imageHeight); if (!_isXOut && !_isYOut) { if ((int)channel_count == 1) { double grayVal; grayVal = hv_image.GetGrayval((int)positionY, (int)positionX); str_value = String.Format("Val: {0:000.0}", grayVal); } else if ((int)channel_count == 3) { double grayValRed, grayValGreen, grayValBlue; HImage _RedChannel, _GreenChannel, _BlueChannel; _RedChannel = hv_image.AccessChannel(1); _GreenChannel = hv_image.AccessChannel(2); _BlueChannel = hv_image.AccessChannel(3); grayValRed = _RedChannel.GetGrayval((int)positionY, (int)positionX); grayValGreen = _GreenChannel.GetGrayval((int)positionY, (int)positionX); grayValBlue = _BlueChannel.GetGrayval((int)positionY, (int)positionX); _RedChannel.Dispose(); _GreenChannel.Dispose(); _BlueChannel.Dispose(); str_value = String.Format("Val: ({0:000.0}, {1:000.0}, {2:000.0})", grayValRed, grayValGreen, grayValBlue); } else { str_value = ""; } m_CtrlHStatusLabelCtrl.Text = str_imgSize + " " + str_position + " " + str_value; } } catch (Exception ex) { //不处理 } } } public void ClearWindow() { try { this.Invoke(new Action( () => { //this.hv_image = null; m_CtrlHStatusLabelCtrl.Visible = false; barVisible_strip.Enabled = false; fit_strip.Enabled = false; histogram_strip.Enabled = false; saveImg_strip.Enabled = false; saveWindow_strip.Enabled = false; mCtrl_HWindow.HalconWindow.ClearWindow(); viewWindow.ClearWindow(); } )); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } /// /// Hobject转换为的临时Himage,显示背景图 /// /// 传递Hobject,必须为图像 public void HobjectToHimage(HObject hobject) { if (hobject == null || !hobject.IsInitialized()) { ClearWindow(); return; } this.Image = new HImage(hobject); } #region 缩放后,再次显示传入的HObject /// /// 默认红颜色显示 /// /// 传入的region.xld,image public void DispObj(HObject hObj) { lock (this) { viewWindow.displayHobject(hObj, null); } } /// /// 重新开辟内存保存 防止被传入的HObject在其他地方dispose后,不能重现 /// /// 传入的region.xld,image /// 颜色 public void DispObj(HObject hObj, string color) { lock (this) { viewWindow.displayHobject(hObj, color); } } #endregion /// /// 鼠标离开事件 /// /// /// private void mCtrl_HWindow_MouseLeave(object sender, EventArgs e) { //避免鼠标离开窗口,再返回的时候,图表随着鼠标移动 viewWindow.mouseleave(); } } }