转HDevWindowStack详解
在HDevelop中编写好的程序在导出时,Halcon会帮我们转换成我们需要的语言,比如C++。例:HDevelop中有如下语句需要导出:
dev_close_window()
Halcon导出成C++语言就成了如下语句:
if (HDevWindowStack::IsOpen()) close_window(HDevWindowStack::Pop());
了解MFC的应该不难理解,这两句在底层做了什么!下面让我来讲解一下,呵呵
首先来看看HDevWindowStack这个类,其实这个类很简单,来看下头文件:
class LIntExport HDevWindowStack { public:
static void Push(const HTuple &win_handle); static HTuple Pop(); // no window open -> return empty tuple static HTuple GetActive(); // no window open -> return -1 static void SetActive(const HTuple &win_handle); // no window open -> done static bool IsOpen(); static void CloseAll(); };
只有6个静态方法,下面一一讲解此6个方法:
static void Push(const HTuple &win_handle); 众所周知,要想对某一窗口操作,必须知道窗口的句柄(可能这里说的太绝对,duilib除外),那么halcon采用了前者的思想,它底层就维护了这样一个窗口句柄,当然图形显示的句柄可能不止一个,所以这里的参数使用HTuple,这个结构就像一个水桶结构一样,可以装其他不同类型的数据结构。HTuple是HALCON跨平台的基础。如果没有HTuple,halcon什么也做不到!言归正传,此方法就是将此句柄下发给halcon,halcon将此句柄保存起来,以后便可对此句柄所指的窗口进行任何操作,包括销毁这个窗口!
static HTuple Pop(); 这个方法就是销毁这个句柄和句柄所指的窗口了,没什么好说的,如何销毁的,这里我只能猜一下:halcon底层维护了一个句柄队列,每Push一个句柄,在队列中添加一个句柄,相反每Pop一次,销毁这个句柄所指向的窗口,正如文中开始的两句话,首先判断窗口是否打开,如果打开了,就调用此Pop方法,销毁窗口,在后文中将重新打开窗口!
static HTuple GetActive(); 此方法就是从halcon的句柄队列中获取一个处于激活状态的窗口句柄,用于绘图操作,比如显示图像:read_image(),再调disp_obj(),当然参数是这里获取的窗口句柄
static void SetActive(const HTuple &win_handle); 功如其名,就是将某一个句柄所指的窗口处于激活状态,这个我在halcon中暂时没有用到。
static bool IsOpen(); 判断某一窗口是否打开,文章开头有使用,如果打开了,则关闭 static void CloseAll(); 关闭所有窗口,遍历底层的句柄队列,一一关闭并销毁
string path = “”; openFileDialog1.Filter = “JGP文件|.JPG|BMP文件|.BMP”; if (openFileDialog1.ShowDialog() == DialogResult.OK) { path = openFileDialog1.FileName; } else { return; } HOperatorSet.GenEmptyObj(out ho_Ok140352); HOperatorSet.GenEmptyObj(out ho_Regions); ho_Ok140352.Dispose(); HOperatorSet.ReadImage(out ho_Ok140352, path); ;
if (!HDevWindowStack.IsOpen())
{
HOperatorSet.SetWindowAttr("background_color", "black");
HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, "", "", out hv_AcqHandle);
HDevWindowStack.Push(hv_AcqHandle);
}
else
{
HOperatorSet.ClearWindow(HDevWindowStack.GetActive());
}
ho_Regions.Dispose();
HOperatorSet.Threshold(ho_Ok140352, out ho_Regions, 77, 125);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Ok140352, HDevWindowStack.GetActive());
}
ho_Ok140352.Dispose();
ho_Regions.Dispose();
- 【LeetCode】关关的刷题日记23——Leetcode 66. Plus One
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861A k-roun
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- Comparison of Apache Stream Processing Frameworks: Part 2
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
- Python3选择排序
- 【DeepMind 公开课-深度强化学习教程代码实战01】迭代法评估4*4方格世界下的随机策略
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861C Did yo
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861B Which
- 信用卡安全问题:被用户忽视的识别码
- Python3快速排序
- Python3插入排序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP基于GD2函数库实现验证码功能示例
- PHP合并两个或多个数组的方法
- PHP的mysqli_set_charset()函数讲解
- PHP常见加密函数用法示例【crypt与md5】
- PHP的mysqli_sqlstate()函数讲解
- PHP Laravel中的Trait使用方法
- PHP CURL使用详解
- 解析Python 偏函数用法全方位实现
- PHP读取目录树的实现方法分析
- python suds访问webservice服务实现
- 使用Python-OpenCV消除图像中孤立的小区域操作
- PHP实现数组和对象的相互转换操作示例
- PHP单元测试框架PHPUnit用法详解
- PHP5中使用mysqli的prepare操作数据库的介绍
- php中的explode()函数实例介绍