C#Halcon窗体鼠标交互生成菜单

embedded/2025/2/11 14:00:42/

       窗体鼠标交互生成菜单,移动鼠标作出相应的提示,并且可以进入相应事件。(一般可以应用到成品效果展示,或实战项目检测失败时,需做出人机交互选择时可应用,相对于按键交互,可以优化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){//超时后自动启动demohv_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.ppmy.cn/embedded/161343.html

相关文章

1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)

进入题目页面如下 直接开审 <?php // 定义一个名为 xctf 的类 class xctf {// 声明一个公共属性 $flag&#xff0c;初始值为字符串 111public $flag 111;// 定义一个魔术方法 __wakeup()// 当对象被反序列化时&#xff0c;__wakeup() 方法会自动调用public function __wa…

轻量级服务器http-server

安装 sudo npm install http-server -g 运行 1. 直接去到要跑起来的目录&#xff0c;在终端输入 cd xxxx文件夹http-server //只输入http-server的话&#xff0c;更新了代码后&#xff0c;页面不会同步更新http-server -c-1 //同步更新页面http-server -a 127.0.0.1 -p 808…

Jetpack之ViewBinding和DataBinding的区别

DataBinding与ViewBinding推出的时间 DataBinding推出的时间比较早‌&#xff0c;ViewBinding是后来推出的。 DataBinding在2015年7月发布的Android Studio v1.3.0版本上引入&#xff0c;并在2016年4月Android Studio v2.0.0版本上正式支持‌。 ViewBinding则是在2019年Andr…

在微服务中,如何使用feign在各个微服务中进行远程调用

在微服务中&#xff0c;如何使用feign在不同微服务中进行远程调用 在微服务中&#xff0c;如何使用feign在不同微服务中进行远程调用 步骤&#xff1a; 第一步&#xff1a; 引入feign依赖 <dependency><groupId>org.springframework.cloud</groupId><…

DeepSeek R1 Distill Llama 70B(免费版)API使用详解

DeepSeek R1 Distill Llama 70B&#xff08;免费版&#xff09;API使用详解 在人工智能领域&#xff0c;随着技术的不断进步&#xff0c;各种新的模型和应用如雨后春笋般涌现。今天&#xff0c;我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…

蓝耘智算平台部署deepseek-助力深度学习

一、deepseek的几大特点&#xff08;一&#xff09;自然语言处理能力&#xff08;二&#xff09;代码生成与编程辅助功能&#xff08;三&#xff09;数学推理与计算能力&#xff08;四&#xff09;多模态处理能力 二、蓝耘智算平台即 “元生代” 智算云平台三、蓝耘智算平台部署…

基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计

基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计 在 iOS 上实现一个基于 FFmpeg 和 OpenGLES 的视频预览和录制功能,需要结合 FFmpeg 的强大音视频处理能力和 OpenGLES 的高效图形渲染能力。以下是一个完整的技术方案设计,包含项目的架构设计、模块划分、技术选…

Linux之Https协议原理

Linux之Https协议原理 一.Https协议的概念二.常见的加密方法三.数据摘要&#xff08;数字指纹&#xff09;四.Https协议加密方法的逐渐完善4.1使用对称或者非对称加密4.2增加CA证书 一.Https协议的概念 Https协议是基于Http协议延申出的一种应用层协议&#xff0c;其原理就是在…