前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >转HDevWindowStack详解

转HDevWindowStack详解

作者头像
vv彭
发布2020-10-27 11:06:07
1.2K0
发布2020-10-27 11:06:07
举报
文章被收录于专栏:c#学习笔记

在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); ;

代码语言:javascript
复制
        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();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档