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,赋值等等

相关推荐
枯萎穿心攻击1 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue3 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
超龄超能程序猿5 小时前
(三)PS识别:基于噪声分析PS识别的技术实现
图像处理·人工智能·计算机视觉
Chef_Chen7 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
加油吧zkf9 小时前
YOLO目标检测数据集类别:分类与应用
人工智能·计算机视觉·目标跟踪
昏睡红猹10 小时前
C#脚本化(Roslyn):如何在运行时引入nuget包
c#
张人玉11 小时前
C# 常量与变量
java·算法·c#
加油吧zkf11 小时前
水下目标检测:突破与创新
人工智能·计算机视觉·目标跟踪
加油吧zkf11 小时前
AI大模型如何重塑软件开发流程?——结合目标检测的深度实践与代码示例
开发语言·图像处理·人工智能·python·yolo
就是有点傻12 小时前
在C#中,可以不实例化一个类而直接调用其静态字段
c#