当前位置: 首页 > article >正文

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


http://www.kler.cn/a/539336.html

相关文章:

  • 【人工智能】Python中的序列到序列(Seq2Seq)模型:实现机器翻译
  • 数据结构——图
  • Git的使用
  • 在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
  • 家用报警器的UML 设计及其在C++和VxWorks 上的实现01
  • 蓝桥杯备赛——进制转化相关问题
  • Android网络优化之-HTTPDNS
  • PHP-trim
  • 2025_2_9 C语言中队列
  • Docker 部署 RabbitMQ | 自带延时队列
  • leetcode 做题思路快查
  • Docker 部署 Grafana 教程
  • LeetCode-二叉树展开为链表
  • 【实用技能】如何借助3D文档控件Aspose.3D, 在Java中无缝制作 3D 球体
  • Maven入门核心知识点总结
  • Maven 下载与配置教程:附百度网盘地址
  • brpc之Butex
  • windows11上,使用pipx安装Poetry,Poetry的安装路径是什么?
  • 数据结构与算法--实现链表的复制(链表中节点比较特殊,含有一个rand指针,指向任意一个节点)
  • 电脑运行黑屏是什么原因?原因及解决方法
  • PM2 与 Docker 结合使用:Node.js 应用的高效管理与部署
  • 项目的虚拟环境的搭建与pytorch依赖的下载
  • MyBatis-Plus快速使用
  • 【在线优化】【有源程序】基于遗传算法(GA)和粒子群优化(PSO)算法的MPPT控制策略
  • PHP的filter_var函数的安全问题
  • 相机开启状态下拔出SD卡导致的数据丢失问题及恢复方法