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

相关推荐
码小跳2 小时前
Halcon案例(一):C#联合Halcon识别路由器上的散热孔
图像处理·c#
读心悦2 小时前
CSS结构性伪类、UI伪类与动态伪类全解析:从文档结构到交互状态的精准选择
css·ui·交互
神仙别闹5 小时前
基于C#+MySQL实现(WinForm)企业设备使用信息管理系统
开发语言·mysql·c#
czhaii5 小时前
PLC脉冲位置 单片机跟踪读取记录显示
开发语言·c#
白熊1885 小时前
【计算机视觉】OpenCV实战项目:基于Tesseract与OpenCV的字符识别系统深度解析
人工智能·opencv·计算机视觉
Ronin-Lotus6 小时前
图像处理篇---MJPEG视频流处理
图像处理·python·opencv
LuvMyLife7 小时前
基于Win在VSCode部署运行OpenVINO模型
人工智能·深度学习·计算机视觉·openvino
gaosushexiangji7 小时前
基于千眼狼高速摄像机与三色掩模的体三维粒子图像测速PIV技术
人工智能·数码相机·计算机视觉
神仙别闹7 小时前
基于C#+SQL Server开发(WinForm)租房管理系统
数据库·oracle·c#
六bring个六7 小时前
qtcreater配置opencv
c++·qt·opencv·计算机视觉·图形渲染·opengl