开启左侧

[HALCON文档] HWindowControl与HSmartWindowControl区别

[复制链接]
Criss 发表于 2022-11-24 20:10:43 | 显示全部楼层 |阅读模式
在C#/.NET下,工具箱加载halcondotnet.dll(适用于.net framework 3.5及其以上,同样也适用于.net core)就可以看到两个控件:
HWindowControl (旧版本普通图形显示控件)
HSmartWindowControl (新版本智能图形显示控件)

不同VS对应的接口版本:
微信截图_20221124212114.png

加载.NET控件和WPF控件的区别
1.png
2.png

这两个都是HALCON的图形显示控件,都可以用在WindowForm窗体中,而WPF需要用HWindowControlWPF和HSmartWindowControlWPF。
由于带WPF功能和对应不带的基本一致,所以主要还是分普通HWindowControl和HSmartWindowControl两种控件对比。

共同点:
1.两种控件都是可以获取HalconID和HWindow属性作为普通窗口基于对象或HOperatorSet算子集的方式进行操作和显示的;
2.均支持鼠标按下、弹起、移动和滚轮事件;

智能窗口相比传统普通窗口控件的区别:
1.它像任何其他控件一样使用(例如,它可以嵌入 TabControl或ScrollViewer中,或与其他控件重叠)。
2.提供了预定义的鼠标交互(移动窗口内容和使用鼠标滚轮缩放)。双击窗口可以重置视图。
3.控件会自动重新缩放而不会闪烁。

那么如何使用呢?你可以通过HSmartWindowControl的HalconWindow属性访问图形窗口
  1. private HWindow    window;
  2. private void Form1_Load(object sender, System.EventArgs e)
  3. {
  4.   window = windowControl.HalconWindow;
  5. }
复制代码


然后设置一些参数:
  1. window.SetDraw("margin");
  2. window.SetLineWidth(3);
复制代码

或者显示图形:
  1. img.DispObj(window);
复制代码


除了使用HSmartWindowControl 之外,你还可以直接使用算子OpenWindow来打开 HALCON 图形窗口:
  1. HWindow ZoomWindow = new HWindow(0, 0, width, height, 0, "visible", "");
复制代码

在上面的代码中,窗口在显示器上“自由浮动”地打开。你还可以通过在参数fatherWindow中传递它的句柄,在另一个 GUI 元素中打开它。
在图形窗口中显示任何内容之前,你应该使用运算符SetPart将图像部分设置为显示。
  1. ZoomWindow.SetPart(row1, col1, row1+height-1, col1+width-1);
复制代码

需要注意的是,在HDevelop 中的使用显示算子,需要使用带有前缀dev_的,例如,dev_open_window而不是 OpenWindow。

需要说明的是,与HSmartWindowControlWPF相比, HSmartWindowControl需要回调才能使用鼠标滚轮启用缩放:
  1. private void WindowControl_Load(object sender, EventArgs e)
  2. {
  3.   this.MouseWheel += my_MouseWheel;
  4. }
复制代码

此外,你需要转换鼠标坐标,使其相对于HSmartWindowControl的左上角。
  1. private void my_MouseWheel(object sender, MouseEventArgs e)
  2. {
  3.     Point pt = windowControl.Location;
  4.     MouseEventArgs newe = new MouseEventArgs(e.Button, e.Clicks, e.X - pt.X, e.Y - pt.Y, e.Delta);
  5.     windowControl.HSmartWindowControl_MouseWheel(sender, newe);
  6. }
复制代码


智能窗口响应以下鼠标事件:
  1. Click
  2. GotFocus, LostFocus
  3. MouseEnter, MouseLeave, MouseHover
  4. Resize, SizeChanged
  5. KeyDown, KeyUp, KeyPress
复制代码


需要注意的是,不是所有算子都可以与智能窗口控件一起使用。不支持以下算子:
  1. draw_nurbs, draw_nurbs_mod, draw_nurbs_interp, draw_nurbs_interp_mod
  2. drag_region1, drag_region2, drag_region3
  3. get_mbutton(_subpix), get_mposition(_subpix)
复制代码
那怎么办呢?用drawing相关算子替代,如:create_drawing_object_circle

例如,在WPF中使用MVVM模型:
  1. <ha:HSmartWindowControlWPF HDraw="fill">
  2.   <!--Iconic items can be added using HIconicDisplayObjectWPFs-->
  3.   <ha:HIconicDisplayObjectWPF IconicObject="{Binding DisplayImage}"/>
  4.   <!--Also with individual drawing properties-->
  5.   <ha:HIconicDisplayObjectWPF IconicObject="{Binding DisplayRegion}"
  6.   HDraw="margin" HColor="magenta"/>
  7.   <!--Messages can be displayed using HMessageDisplayObjectWPFs-->
  8.   <ha:HMessageDisplayObjectWPF HMessageText="{Binding ImageName}"/>
  9. </ha:HSmartWindowControlWPF>
复制代码
因为控件的所有属性都支持数据绑定。
通过将对象添加到 Items 集合或设置 ItemsSource 属性,您可以指定控件应显示的内容,也可以使用纯 XAML 代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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