C#Halcon窗体鼠标交互生成菜单
窗体鼠标交互生成菜单,移动鼠标作出相应的提示,并且可以进入相应事件。(一般可以应用到成品效果展示,或实战项目检测失败时,需做出人机交互选择时可应用,相对于按键交互,可以优化UI布局)
实现效果
UI布局
菜单交互事件
private void uiButton2_Click(object sender, EventArgs e)
{
showWorkMsg(listView1, "测试开始", Color.DarkBlue);
HW.ClearWindow();
FitImage(HIMage, hWC);
//加载参数
LoadParam();
//窗体设置
HW.SetLineWidth(5);
HW.SetColor("black");
HW.SetDraw("margin");
HW.DispObj(ho_LabelRegions);
//设置字体大小并加载菜单栏文字
Form1.SetDisplayFont(HW, tbx_FountSize.Text, "true");
Form1.DisMsg(HW, hv_Labels, ImgOrWindow.image, hv_TestRowOffest + hv_LabelRow1, (hv_LabelColumn1 + hv_LabelColumn2) / 2 + hv_TestColOffest, "lime green", "false");
//初始化一些参数
HTuple hv_Exception = new HTuple(), hv_Highlighted = new HTuple(), hv_MButtonOut = new HTuple();
HTuple hv_AutoCounterOut = new HTuple(), hv_HighlightedOut = new HTuple();
HTuple hv_Now = new HTuple(), hv_MaxCounter = new HTuple();
HObject ho_LabelHighlighted = null;
HOperatorSet.GenEmptyObj(out ho_LabelHighlighted);
HTuple hv_TestResult = new HTuple();
//相应事件返回消息
hv_TestResult.Dispose();
hv_TestResult = "";
while ((int)(hv_ItemSelected.TupleNot()) != 0)
{
Application.DoEvents();
//获取鼠标位置
try
{
hv_MRow.Dispose(); hv_MColumn.Dispose(); hv_MButton.Dispose();
HOperatorSet.GetMposition(HW, out hv_MRow, out hv_MColumn,
out hv_MButton);
}
catch (HalconException HDevExpDefaultException1)
{
HDevExpDefaultException1.ToHTuple(out hv_Exception);
hv_MButton.Dispose();
hv_MButton = 0;
}
//突出显示鼠标位置下的标签
hv_Highlighted.Dispose();
hv_Highlighted = (((((((new HTuple(0)).TupleConcat(
(((((hv_MRow - hv_LabelRow1) / hv_LabelHeight)).TupleFloor())).TupleInt()
))).TupleMax())).TupleConcat((new HTuple(hv_Labels.TupleLength())) - 1))).TupleMin();
//忽略非交互模式下的鼠标输入
if ((int)(hv_Interactive.TupleNot()) != 0)
{
hv_MButton.Dispose();
hv_MButton = 0;
hv_Highlighted.Dispose();
hv_Highlighted = new HTuple(hv_AutoCounter);
//在非交互模式下,此过程用于在Timeout中指定的给定时间后切换到下一个演示部分。
//这是通过点击相应的菜单项来完成的。
hv_MButtonOut.Dispose();
hv_MButtonOut = new HTuple(hv_MButton);
hv_AutoCounterOut.Dispose();
hv_AutoCounterOut = new HTuple(hv_AutoCounter);
hv_HighlightedOut.Dispose();
hv_HighlightedOut = new HTuple(hv_Highlighted);
hv_Now.Dispose();
HOperatorSet.CountSeconds(out hv_Now);
if ((int)(new HTuple(((hv_Now - hv_TimeSinceLastInteraction)).TupleGreater(hv_Timeout))) != 0)
{
//超时后自动启动demo
hv_MaxCounter.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_MaxCounter = (new HTuple(hv_Labels.TupleLength()
)) - 1;
}
if ((int)(new HTuple(hv_AutoCounterOut.TupleGreater(hv_MaxCounter))) != 0)
{
//退出
hv_MButtonOut.Dispose();
hv_MButtonOut = 4;
}
else
{
//切换到下一个演示部分
hv_HighlightedOut.Dispose();
hv_HighlightedOut = new HTuple(hv_AutoCounter);
hv_AutoCounterOut.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_AutoCounterOut = hv_AutoCounter + 1;
}
hv_MButtonOut.Dispose();
hv_MButtonOut = 1;
}
}
}
//在非交互模式下完成所有演示时停止
if ((int)(new HTuple(hv_Highlighted.TupleEqual(new HTuple(hv_Labels.TupleLength())))) != 0)
{
break;
}
//如果当前选择已更改,则更新菜单图形
if ((int)(new HTuple(hv_Highlighted.TupleNotEqual(hv_LastSelection))) != 0)
{
//显示菜单标签并突出显示当前选定的项目
HW.SetColor("black");
HW.SetDraw("margin");
HW.DispObj(ho_LabelRegions);
ho_LabelHighlighted.Dispose();
HOperatorSet.SelectObj(ho_LabelRegions, out ho_LabelHighlighted,hv_Highlighted + 1);
HW.SetColor("#00B900");
HW.DispObj(ho_LabelHighlighted);
hv_LastSelection.Dispose();
hv_LastSelection = new HTuple(hv_Highlighted);
}
//评估鼠标按钮
if ((int)(new HTuple(hv_MButton.TupleEqual(4))) != 0)
{
//右击:退出程序
break;
}
else if ((int)(new HTuple(((hv_MButton % 2)).TupleEqual(1))) != 0)
{
//左键点击:根据当前选择选择演示部分
switch (hv_Highlighted.I)
{
case 0:
Application.DoEvents();
FitImage(HIMage, hWC);
hv_TestResult.Dispose();
hv_TestResult = "选择测试1 赋值111111";
Form1.DisMsg(HW, hv_TestResult, ImgOrWindow.image, 100, 100, "red", "false");
showWorkMsg(listView1, hv_TestResult, Color.DarkBlue);
HOperatorSet.WaitSeconds(1);
break;
case 1:
Application.DoEvents();
FitImage(HIMage, hWC);
hv_TestResult.Dispose();
hv_TestResult = "选择测试2 赋值222222";
Form1.DisMsg(HW, hv_TestResult, ImgOrWindow.image, 100, 100, "red", "false");
showWorkMsg(listView1, hv_TestResult, Color.DarkBlue);
HOperatorSet.WaitSeconds(1);
break;
case 2:
Application.DoEvents();
FitImage(HIMage, hWC);
hv_TestResult.Dispose();
hv_TestResult = "选择测试3 赋值333333";
Form1.DisMsg(HW, hv_TestResult, ImgOrWindow.image, 100, 100, "red", "false");
showWorkMsg(listView1, hv_TestResult, Color.DarkBlue);
HOperatorSet.WaitSeconds(1);
break;
case 3:
Application.DoEvents();
FitImage(HIMage, hWC);
hv_TestResult.Dispose();
hv_TestResult = "选择测试4 赋值444444";
Form1.DisMsg(HW, hv_TestResult, ImgOrWindow.image, 100, 100, "red", "false");
showWorkMsg(listView1, hv_TestResult, Color.DarkBlue);
HOperatorSet.WaitSeconds(1);
break;
case 4:
Application.DoEvents();
FitImage(HIMage, hWC);
hv_TestResult.Dispose();
hv_TestResult = "选择测试5 赋值555555";
Form1.DisMsg(HW, hv_TestResult, ImgOrWindow.image, 100, 100, "red", "false");
showWorkMsg(listView1, hv_TestResult, Color.DarkBlue);
HOperatorSet.WaitSeconds(1);
break;
}
//演示后重新绘制菜单
HW.ClearWindow();
FitImage(HIMage, hWC);
HW.SetColor("black");
HW.SetDraw("margin");
HW.DispObj(ho_LabelRegions);
Form1.DisMsg(HW, hv_Labels, ImgOrWindow.image, hv_TestRowOffest + hv_LabelRow1, (hv_LabelColumn1 + hv_LabelColumn2) / 2 + hv_TestColOffest, "lime green", "false");
hv_LastSelection.Dispose();
hv_LastSelection = -1;
hv_TimeSinceLastInteraction.Dispose();
HOperatorSet.CountSeconds(out hv_TimeSinceLastInteraction);
}
}
}
switch (***)
{
case ***
}
这里可以调用方法,绘制ROI,赋值等等