You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

463 lines
15 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 版权所有(C) ChoiceTech Corporation。保留所有权利。
// 此代码的发布遵从
// ChoiceTech 公共许可(HY-PLhttp://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
{
/// <summary>
/// halcon鼠标缩放控件
///
/// 描述:
/// 1, 必须首先通过this.HobjectToHimage(HObject hobject)传入图片,此图片称为"背景图"
/// 2, 有了背景图,就可以通过本控件自定义的 this.DispObj(HObject hObj)显示HObject,类似原方法
/// 3,默认显示红色,DispObj(HObject hObj,string color)可显示其他颜色
/// </summary>
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;
}
/// <summary>
/// 初始化控件
/// </summary>
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));
}
/// <summary>
/// 绘制模式下,不允许缩放和鼠标右键菜单
/// </summary>
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;
}
}
/// <summary>
/// 设置image,初始化控件参数
/// </summary>
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);
}
}
}
/// <summary>
/// 获得halcon窗体控件的句柄
/// </summary>
public IntPtr HWindowHalconID
{
get { return this.mCtrl_HWindow.HalconID; }
}
public HWindowControl getHWindowControl()
{
return this.mCtrl_HWindow;
}
/// <summary>
/// 状态条 显示/隐藏 CheckedChanged事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
/// <summary>
/// 保存窗体截图到本地
/// </summary>
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);
}
}
/// <summary>
/// 保存原始图片到本地
/// </summary>
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);
}
}
/// <summary>
/// 图片适应大小显示在窗体
/// </summary>
/// <param name="hw_Ctrl">halcon窗体控件</param>
private void DispImageFit(HWindowControl hw_Ctrl)
{
try
{
this.viewWindow.resetWindowImage();
}
catch (Exception)
{
}
}
/// <summary>
/// 鼠标在空间窗体里滑动,显示鼠标所在位置的灰度值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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());
}
}
/// <summary>
/// Hobject转换为的临时Himage,显示背景图
/// </summary>
/// <param name="hobject">传递Hobject,必须为图像</param>
public void HobjectToHimage(HObject hobject)
{
if (hobject == null || !hobject.IsInitialized())
{
ClearWindow();
return;
}
this.Image = new HImage(hobject);
}
#region 缩放后,再次显示传入的HObject
/// <summary>
/// 默认红颜色显示
/// </summary>
/// <param name="hObj">传入的region.xld,image</param>
public void DispObj(HObject hObj)
{
lock (this)
{
viewWindow.displayHobject(hObj, null);
}
}
/// <summary>
/// 重新开辟内存保存 防止被传入的HObject在其他地方dispose后,不能重现
/// </summary>
/// <param name="hObj">传入的region.xld,image</param>
/// <param name="color">颜色</param>
public void DispObj(HObject hObj, string color)
{
lock (this)
{
viewWindow.displayHobject(hObj, color);
}
}
#endregion
/// <summary>
/// 鼠标离开事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mCtrl_HWindow_MouseLeave(object sender, EventArgs e)
{
//避免鼠标离开窗口,再返回的时候,图表随着鼠标移动
viewWindow.mouseleave();
}
}
}