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

相关推荐
Coding茶水间1 小时前
基于深度学习的非机动车头盔检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·机器学习·计算机视觉
小猪快跑爱摄影3 小时前
【AutoCad 2025】【C#】零基础教程(四)——MText 常见属性
c#·autocad
炼钢厂4 小时前
C#6——DateTime
c#
roman_日积跬步-终至千里4 小时前
【计算机视觉(16)】语义理解-训练神经网络1_激活_预处理_初始化_BN
人工智能·神经网络·计算机视觉
Lv11770085 小时前
Visual Studio中的多态
ide·笔记·c#·visual studio
一个没有感情的程序猿5 小时前
前端实现人体骨架检测与姿态对比:基于 MediaPipe 的完整方案
机器学习·计算机视觉·前端框架·开源
wuguan_6 小时前
C#:多态函数重载、态符号重载、抽象、虚方法
开发语言·c#
我不是程序猿儿6 小时前
【C#】ScottPlot的Refresh()
开发语言·c#
ccLianLian6 小时前
计算机视觉·LaVG
人工智能·计算机视觉
工程师0076 小时前
C# 基于 HSL 与基恩士 PLC 通信
c#·mc协议·基恩士plc