在C++中,一個dev_disp_text()函數的導出對應 set_display_font()和DispText()兩個函數,一般在C++中是先調用set_display_font()設置好字體后,再調用DispText()函數,但是這里卻有着致命的bug;
這個截圖是halcon導出文件中set_display_font函數中的部分代碼,原理通過QueryFont(hv_WindowHandle, &hv_AvailableFonts)這一句,將所有你系統的字體存儲到hv_AvailableFonts,然后通過hv_Indices = hv_AvailableFonts.TupleFind(HTuple(hv_Fonts[hv_Fdx]))這一句來返回尋找hv_Fonts[hv_Fdx])(這是你自己定義的字體,比如halcon中的mono),如果沒有找到返回-1,找到了就break,然后通過后續代碼設置字體。
但是理想是美好的,這里會有很嚴重的bug,就是不管你怎么樣,hv_Indices都是-1,也就是在你系統的字體庫中沒有找到你想要的字體。然后后續代碼就會拋出異常。
解決方法:在halcon中不要使用dev_disp_message()函數,改用set_font()+set_tposition()+write_string(),這樣你生成的cpp文件中就不會有set_display_font()和DispText()這兩個函數了。但是有一個地方要注意,就是在halcon中比如你調用了下面這幾句來設置字體樣式
1 query_font (WindowHandle, Font) 2 FontWithSize := Font[0]+'-20' 3 set_font (WindowHandle, FontWithSize)
你在導出成c++文件的時候結果是
1 QueryFont(hv_WindowHandle, &hv_Font); 2 hv_FontWithSize = HTuple(hv_Font[0])+"-20"; 3 SetFont(hv_WindowHandle, hv_FontWithSize);
這里的第二行會出錯,必須手動改成:(這里參考了http://www.ihalcon.com/read-10972.html)
1 QueryFont(hv_WindowHandle, &hv_Font); 2 hv_FontWithSize = HTuple(hv_Font[0]) + "20-"; 3 SetFont(hv_WindowHandle, hv_FontWithSize);
設置完set_font()后再設置set_tposition()+write_string()就可。