WPF控件HSmartWindowControlWPF是不支持draw_*这样阻塞式的算子的,那么我们一般都是使用create_drawing_object_*这些算子生成图形。
Halcon中 操作代码:
- dev_get_window (WindowHandle)
- create_drawing_object_circle (100, 100, 80, DrawID)
- attach_drawing_object_to_window (WindowHandle, DrawID)
复制代码
通过附加窗口后,就可以进行交互式移动位置、修改大小了。
不再修改后,我们可以通过以下算子获取位置和生成图形对象。
- get_drawing_object_iconic (Object, DrawID)
- get_drawing_object_params (DrawID, ['row','column','radius'], GenParamValue)
复制代码
这里我获取了圆的中心位置和半径,需要注意的是,不同图形设置获取的参数名称是不一样的。
附加才会显示图形,不想显示就使用反附加
- detach_drawing_object_from_window (WindowHandle, DrawID)
复制代码
窗口句柄仍然是存在的,这个适合可以再次通过附加显示图形。
不用图形了,清空使用
- clear_drawing_object (DrawID)
复制代码
那么我们在WPF中除了上述操作以后,有时候还想知道多个图形对象中我操作的是哪个对象怎么办?
使用回调函数即可解决。
- set_drawing_object_callback
- 可支持以下事件:
- "on_attach" 附加图形到窗口的时候触发
- "on_detach" 图形脱离窗口附加的时候触发
- "on_drag" 拖拽图形的时候触发
- "on_resize" 改变大小的时候触发
- "on_select" 图形被选中的时候触发
复制代码
可以看到还是支持常规的几种事件的。
这个算子一般不推荐在HDevelop中使用,常规应用在联合开发中,比如在C#中实现,一般使用委托。
我这里以被选择作为例子进行讲解:
1.首先声明回调函数的类里面的实现
- private void HDrawingObjectCallBack(IntPtr drawID, IntPtr windowHandle, string type)
- {
- Console.WriteLine("Recv CallBack :{0}", type);
- }
复制代码
2.然后绑定函数到委托对象
- private HDrawingObject.HDrawingObjectCallback _drawingCallback = null;
- _drawingCallback = HDrawingObjectCallBack;
复制代码
3.每次我们创建图形对象的时候记得绑定上去
- HTuple hv_drawID;
- HOperatorSet.CreateDrawingObjectCircle(fRow, fCol, 15, out hv_drawID);
- IntPtr pCallBakc = Marshal.GetFunctionPointerForDelegate(_drawingCallback);
- HOperatorSet.SetDrawingObjectCallback(hv_drawID, "on_select", pCallBakc);
- HOperatorSet.AttachDrawingObjectToWindow(HalconWindow, hv_drawID);
复制代码
接下来就可以可以知道你操作的对象是哪个句柄对象了。
有个小问题,就是如果通过选中方式进行删除图形,那么最后一个无法获取on_select事件,也就始终无法解决。
这个时候,我们可以在注册回调的时候加一个on_drag拖拽事件,就可以了。
需要说明的是,千万不要在HDrawingObjectCallBack这个回调函数内部调用图形操作算子,例如DispObj,否则可能会发生死锁。
包括detach_drawing_object_from_window 和clear_drawing_object算子。
|