在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()就可。