在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(); 關閉所有窗口,遍歷底層的句柄隊列,一一關閉並銷毀
added by xiejl
