设置首页收藏本站
开启左侧

[C#] WPF使用Halcon的Drawing相关算子操作说明

[复制链接]
绝地武士 发表于 2023-3-27 18:39:18 | 显示全部楼层 |阅读模式
WPF控件HSmartWindowControlWPF是不支持draw_*这样阻塞式的算子的,那么我们一般都是使用create_drawing_object_*这些算子生成图形。
Halcon中 操作代码:
  1. dev_get_window (WindowHandle)
  2. create_drawing_object_circle (100, 100, 80, DrawID)
  3. attach_drawing_object_to_window (WindowHandle, DrawID)
复制代码

通过附加窗口后,就可以进行交互式移动位置、修改大小了。

不再修改后,我们可以通过以下算子获取位置和生成图形对象。
  1. get_drawing_object_iconic (Object, DrawID)
  2. get_drawing_object_params (DrawID, ['row','column','radius'], GenParamValue)
复制代码

这里我获取了圆的中心位置和半径,需要注意的是,不同图形设置获取的参数名称是不一样的。

附加才会显示图形,不想显示就使用反附加
  1. detach_drawing_object_from_window (WindowHandle, DrawID)
复制代码

窗口句柄仍然是存在的,这个适合可以再次通过附加显示图形。

不用图形了,清空使用
  1. clear_drawing_object (DrawID)
复制代码


那么我们在WPF中除了上述操作以后,有时候还想知道多个图形对象中我操作的是哪个对象怎么办?
使用回调函数即可解决。
  1. set_drawing_object_callback
  2. 可支持以下事件:
  3. "on_attach" 附加图形到窗口的时候触发
  4. "on_detach" 图形脱离窗口附加的时候触发
  5. "on_drag" 拖拽图形的时候触发
  6. "on_resize" 改变大小的时候触发
  7. "on_select" 图形被选中的时候触发
复制代码

可以看到还是支持常规的几种事件的。

这个算子一般不推荐在HDevelop中使用,常规应用在联合开发中,比如在C#中实现,一般使用委托。

我这里以被选择作为例子进行讲解:
1.首先声明回调函数的类里面的实现
  1. private void HDrawingObjectCallBack(IntPtr drawID, IntPtr windowHandle, string type)
  2. {
  3.       Console.WriteLine("Recv CallBack :{0}", type);
  4. }
复制代码


2.然后绑定函数到委托对象
  1. private HDrawingObject.HDrawingObjectCallback _drawingCallback = null;
  2. _drawingCallback = HDrawingObjectCallBack;
复制代码


3.每次我们创建图形对象的时候记得绑定上去
  1. HTuple hv_drawID;
  2. HOperatorSet.CreateDrawingObjectCircle(fRow, fCol, 15, out hv_drawID);
  3. IntPtr pCallBakc = Marshal.GetFunctionPointerForDelegate(_drawingCallback);
  4. HOperatorSet.SetDrawingObjectCallback(hv_drawID, "on_select", pCallBakc);
  5. HOperatorSet.AttachDrawingObjectToWindow(HalconWindow, hv_drawID);
复制代码


接下来就可以可以知道你操作的对象是哪个句柄对象了。

有个小问题,就是如果通过选中方式进行删除图形,那么最后一个无法获取on_select事件,也就始终无法解决。
这个时候,我们可以在注册回调的时候加一个on_drag拖拽事件,就可以了。
需要说明的是,千万不要在HDrawingObjectCallBack这个回调函数内部调用图形操作算子,例如DispObj,否则可能会发生死锁。
包括detach_drawing_object_from_window 和clear_drawing_object算子。







奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
雾里看花 发表于 2023-3-27 21:31:57 | 显示全部楼层
感谢分享
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
hejet111 发表于 2023-3-30 16:09:45 | 显示全部楼层
感谢分享
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
fishball82 发表于 2023-4-24 15:32:09 | 显示全部楼层
感谢分享
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
yezi1562 发表于 2023-5-30 14:10:42 | 显示全部楼层
感谢分享
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
向泽铭 发表于 2024-3-12 17:46:59 | 显示全部楼层
感谢分享
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
1176386444 发表于 2024-7-29 11:17:07 | 显示全部楼层
这个创建的circle对象能不能支持重写?
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
视觉沙漠 发表于 2025-3-3 15:56:37 | 显示全部楼层
感谢分享
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表