WPF+Halcon 培训项目实战(8):WPF+Halcon初次开发

前言

为了更好地去学习WPF+Halcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。

相关链接

微软系列技术教程 WPF 年度公益课程

Halcon开发 CSDN博客专栏

个人学习的Gitee 项目地址仓库

项目专栏

WPF+Halcon实战项目

运行环境

  • .net core 8.0
  • visual studio 2022
  • halcon HDevelop 20.11
  • windows 11

匹配图片

在这里插入图片描述

WPF Halcon组件

WPF的 Halcon组件我之前使用过,有兴趣的可以去看我的专栏里面找Halcon WPF 开发学习笔记

Halcon开发 CSDN博客专栏

HSmartWindowControlWPF绑定

我们这里基于ViewModel的形式开发。所以我们需要将HSmartWindowControlWPF(后面简称HS组件) 绑定到我们的DataContext中。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

读取图片

我们在Resources文件夹中添加一张图片
在这里插入图片描述
确保自己已经完成了Resources文件夹的设置,不清楚的可以看上一章的WPF项目初始化

WPF+Halcon 培训项目实战(7):目标匹配助手

在这里插入图片描述

运行代码

            ReadImgBtn = new RelayCommand(() =>
            {
   
                try
                {
   
                    MsgHelper.Info("读取图片");
                    var Image = new HImage();
                    Image.ReadImage("Resources/1.png");
                    HalconWindow.HalconWindow.DispObj(Image);
                }
                catch(Exception ex) {
   

                    MsgHelper.Error("HS组件加载图片失败!:" +ex.Message);
                }
                
            });

运行结果

在这里插入图片描述

抖动问题解决

Halcon WPF 开发学习笔记:HSmartWindowControlWPF正常加载

代码修改为

            ReadImgBtn = new RelayCommand(() =>
            {
   
                try
                {
   
                    MsgHelper.Info("读取图片");
                    var Image = new HImage();
                    Image.ReadImage("Resources/1.png");

                    HalconWindow.HalconWindow.DispObj(Image);
                    //读取后将图片居中
                    HalconWindow.SetFullImagePart();
                    //读取后将图片完全拉伸充满整个屏幕
                    //HalconWindow.SetFullImagePart(Image);

                }
                catch (Exception ex) {
   

                    MsgHelper.Error("HS组件加载图片失败!:" +ex.Message);
                }
                
            });

运行结果

在这里插入图片描述

绘制矩形

这个图片读取成功之后,说明我们的Halcon组件已经加载成功了。现在我们代码添加以下别的功能。

InitRectangleBtn = new RelayCommand(() =>
{
   
    MsgHelper.Info("生成矩形");
    var drawObj = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100,200,300,400);
    HalconWindow.HalconWindow.AttachDrawingObjectToWindow(drawObj);
});

绘制图像会消失

在这里插入图片描述
因为我们没有声明一个公有变量,所以每次运行完代码他就默认把矩形窗口释放掉了。所以我们需要重新生成矩形窗口。

InitRectangleBtn = new RelayCommand(() =>
{
   
    MsgHelper.Info("生成矩形");
    rect = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100,200,300,400);
    HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);
});

在这里插入图片描述

绘制对象绑定事件

在这里插入图片描述
一共有5种事件:

  • OnAttach:附加
  • OnDetach:分离
  • OnDrag:拖动
  • OnResize:缩放
  • OnSelect:选中

我们添加以下打印函数看看结果:

 InitRectangleBtn = new RelayCommand(() =>
 {
   
     MsgHelper.Info("生成矩形");
     rect = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100,200,300,400);
     HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);
     rect.OnAttach(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>
     {
   
         NLogHelper.Debug("附加事件");
     }));
     rect.OnDrag(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>
     {
   
         NLogHelper.Debug("拖动事件");
     }));
     rect.OnResize(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>
     {
   
         NLogHelper.Debug("缩放事件");
     }));
     rect.OnSelect(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>
     {
   
         NLogHelper.Debug("选中事件");
     }));
     rect.OnDetach(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>
     {
   
         NLogHelper.Debug("分离事件");
     }));

 });

在这里插入图片描述
根据我的测试,主要是拖动和缩放事件。选中很难触发。附加和分离应该是有个触发的方式,现在不了解。

拖动事件

InitRectangleBtn = new RelayCommand(() =>
{
   
    MsgHelper.Info("生成矩形");
    rect = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100,200,300,400);
    HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);
    rect.OnDrag(new HDrawingObject.HDrawingObjectCallbackClass((id, window, type) =>
    {
   
        var hv_type = id.GetDrawingObjectParams("type");
        var row1 = id.GetDrawingObjectParams("row1");
        var row2 = id.GetDrawingObjectParams("row2");
        var column1 = id.GetDrawingObjectParams("column1");
        var column2 = id.GetDrawingObjectParams("column2");
        //打印坐标
        NLogHelper.Debug($"拖动事件: {
     hv_type}:{
     row1} {
     column1} {
     row2} {
     column2} ");
        
    }));
});

在这里插入图片描述

相关推荐

  1. MySQL DBA项目实战系列培训课程【MySQL 8.4最新版】

    2023-12-30 00:44:02       10 阅读
  2. web 前端开发培训:深入探索与实战应用

    2023-12-30 00:44:02       14 阅读
  3. K8s初次入门

    2023-12-30 00:44:02       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-30 00:44:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-30 00:44:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-30 00:44:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-30 00:44:02       20 阅读

热门阅读

  1. 计算机网络-期末不挂科-第一章-概述

    2023-12-30 00:44:02       38 阅读
  2. Video面试题

    2023-12-30 00:44:02       35 阅读
  3. Vue.js项目部署至Linux服务器的详细步骤

    2023-12-30 00:44:02       37 阅读
  4. git回退2个错误的分支

    2023-12-30 00:44:02       31 阅读
  5. Docker六 | Docker Compose容器编排

    2023-12-30 00:44:02       28 阅读
  6. 安装 yarn、pnpm、功能比较

    2023-12-30 00:44:02       42 阅读
  7. Python开发雷点总结

    2023-12-30 00:44:02       37 阅读
  8. Ascend C算子开发常见问题案例

    2023-12-30 00:44:02       36 阅读
  9. C语言,指针链表详解解说及代码示例

    2023-12-30 00:44:02       42 阅读
  10. 面试题:BIO、NIO、AIO 的区别是什么?

    2023-12-30 00:44:02       43 阅读