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

相关推荐
一木 之林41 分钟前
提示词工程学习总结:用 Few-shot 把大模型调教成金融文本分类、抽取与匹配的自动化流水线
人工智能·学习·计算机视觉·金融·分类
小蒋观天下1 小时前
端侧大模型在安防摄像头部署实操(上)|行业痛点、架构选型、落地思路解析
大数据·人工智能·安全·计算机视觉·ai大模型
天若有情6734 小时前
开源|Comfort Lang v1.0.1,一款主打清爽交互的新型命令式编程语言
python·开源·交互·编程语言·项目分享·repl·comfort lang
段一凡-华北理工大学4 小时前
高炉炼铁机器视觉与智能识别十八讲~系列文章06:铁口与出铁场:出铁状态识别与渣铁分离判断
人工智能·数码相机·计算机视觉·高炉出铁识别·高炉渣铁分离·高炉铁口识别
这张生成的图像能检测吗7 小时前
(论文速读)FE-CLIP:把频域信息注入 CLIP,做零样本异常检测与分割
人工智能·opencv·目标检测·计算机视觉·缺陷检测·异常检测
指针向南7 小时前
MP4索引怎样影响边下边播
图像处理·人工智能·计算机视觉
YOLO数据集集合7 小时前
桥梁损伤实例分割数据集 | 桥梁损伤 实例分割 裂缝检测 钢筋外露 混凝土剥落9160期
人工智能·目标检测·计算机视觉·桥梁·桥梁损害·桥梁数据集
wflynn7 小时前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github·nvidia·amd·directx12
黑妹天下第一乖10 小时前
第 10 讲:阿加犀 AidVoice 端侧语音交互与语音识别实战
图像处理·人工智能·数码相机·opencv·交互·语音识别·xcode
小蒋观天下10 小时前
端侧大模型在安防摄像头部署实操(下篇)|模型量化、推理加速、视频接入与量产调优
大数据·人工智能·算法·安全·机器学习·计算机视觉·ai大模型