在C#/.NET下,工具箱加载halcondotnet.dll(适用于.net framework 3.5及其以上,同样也适用于.net core)就可以看到两个控件:
HWindowControl (旧版本普通图形显示控件)
HSmartWindowControl (新版本智能图形显示控件)
不同VS对应的接口版本:
加载.NET控件和WPF控件的区别
这两个都是HALCON的图形显示控件,都可以用在WindowForm窗体中,而WPF需要用HWindowControlWPF和HSmartWindowControlWPF。
由于带WPF功能和对应不带的基本一致,所以主要还是分普通HWindowControl和HSmartWindowControl两种控件对比。
共同点:
1.两种控件都是可以获取HalconID和HWindow属性作为普通窗口基于对象或HOperatorSet算子集的方式进行操作和显示的;
2.均支持鼠标按下、弹起、移动和滚轮事件;
智能窗口相比传统普通窗口控件的区别:
1.它像任何其他控件一样使用(例如,它可以嵌入 TabControl或ScrollViewer中,或与其他控件重叠)。
2.提供了预定义的鼠标交互(移动窗口内容和使用鼠标滚轮缩放)。双击窗口可以重置视图。
3.控件会自动重新缩放而不会闪烁。
那么如何使用呢?你可以通过HSmartWindowControl的HalconWindow属性访问图形窗口
- private HWindow window;
- private void Form1_Load(object sender, System.EventArgs e)
- {
- window = windowControl.HalconWindow;
- }
复制代码
然后设置一些参数:
- window.SetDraw("margin");
- window.SetLineWidth(3);
复制代码
或者显示图形:
除了使用HSmartWindowControl 之外,你还可以直接使用算子OpenWindow来打开 HALCON 图形窗口:
- HWindow ZoomWindow = new HWindow(0, 0, width, height, 0, "visible", "");
复制代码
在上面的代码中,窗口在显示器上“自由浮动”地打开。你还可以通过在参数fatherWindow中传递它的句柄,在另一个 GUI 元素中打开它。
在图形窗口中显示任何内容之前,你应该使用运算符SetPart将图像部分设置为显示。
- ZoomWindow.SetPart(row1, col1, row1+height-1, col1+width-1);
复制代码
需要注意的是,在HDevelop 中的使用显示算子,需要使用带有前缀dev_的,例如,dev_open_window而不是 OpenWindow。
需要说明的是,与HSmartWindowControlWPF相比, HSmartWindowControl需要回调才能使用鼠标滚轮启用缩放:
- private void WindowControl_Load(object sender, EventArgs e)
- {
- this.MouseWheel += my_MouseWheel;
- }
复制代码
此外,你需要转换鼠标坐标,使其相对于HSmartWindowControl的左上角。
- private void my_MouseWheel(object sender, MouseEventArgs e)
- {
- Point pt = windowControl.Location;
- MouseEventArgs newe = new MouseEventArgs(e.Button, e.Clicks, e.X - pt.X, e.Y - pt.Y, e.Delta);
- windowControl.HSmartWindowControl_MouseWheel(sender, newe);
- }
复制代码
智能窗口响应以下鼠标事件:
- Click
- GotFocus, LostFocus
- MouseEnter, MouseLeave, MouseHover
- Resize, SizeChanged
- KeyDown, KeyUp, KeyPress
复制代码
需要注意的是,不是所有算子都可以与智能窗口控件一起使用。不支持以下算子:
- draw_nurbs, draw_nurbs_mod, draw_nurbs_interp, draw_nurbs_interp_mod
- drag_region1, drag_region2, drag_region3
- get_mbutton(_subpix), get_mposition(_subpix)
复制代码 那怎么办呢?用drawing相关算子替代,如:create_drawing_object_circle
例如,在WPF中使用MVVM模型:
- <ha:HSmartWindowControlWPF HDraw="fill">
- <!--Iconic items can be added using HIconicDisplayObjectWPFs-->
- <ha:HIconicDisplayObjectWPF IconicObject="{Binding DisplayImage}"/>
- <!--Also with individual drawing properties-->
- <ha:HIconicDisplayObjectWPF IconicObject="{Binding DisplayRegion}"
- HDraw="margin" HColor="magenta"/>
- <!--Messages can be displayed using HMessageDisplayObjectWPFs-->
- <ha:HMessageDisplayObjectWPF HMessageText="{Binding ImageName}"/>
- </ha:HSmartWindowControlWPF>
复制代码 因为控件的所有属性都支持数据绑定。
通过将对象添加到 Items 集合或设置 ItemsSource 属性,您可以指定控件应显示的内容,也可以使用纯 XAML 代码。
具体可以参考halcon编程指导手册(安装目录\doc\pdf\manualsprogrammers_guide.pdf大概第77页) |