halcon19的HDrawingObject回调事件与halcon12稍微有不同,主要区别在于回调函数的数据类型与12的不一样,以C++为例,在halcon19的文档描述中的callback函数原型(long, long, char*)。
但是如果在c++中以这样的函数写,前两个参数的值获取不到,根据hdrawingobject.h中定义,handle的数据类型为Hlong,这与halcon12不同,因此尝试用(Hlong, Hlong, char*)的函数类型获取一下前两个参数的值。经过验证,完全正确。
例程
定义全局变量
HObject ho_Image;
HTuple hv_Width, hv_Height, hv_WindowHandle; //windowHandle最好为全局变量
vector<Hlong> drawingObjectIndexs;
vector<HDrawingObject> drawingObjects;
绘制矩形图形
SetColor(hv_WindowHandle, "red");
SetDraw(hv_WindowHandle, "margin");
SetLineWidth(hv_WindowHandle, 3);
HTuple Row1, Column1, Row2, Column2;
DrawRectangle1(hv_WindowHandle, &Row1, &Column1, &Row2, &Column2);
HDrawingObject rect = HDrawingObject(Row1, Column1, Row2, Column2);
rect.SetDrawingObjectParams("color", "blue");
attachDrawingObject(rect);//绑定图形到窗口并绑定回调函数
绑定回调函数
void attachDrawingObject(HDrawingObject draw){
Hlong id = draw.GetHandle();
selectDrawingObject = id;
drawingObjectIndexs.push_back(id);
drawingObjects.push_back(draw);
draw.SetDrawingObjectCallback("on_select", (void*)CallBack_Select);
draw.SetDrawingObjectCallback("on_drag", (void*)CallBack_Drag);
AttachDrawingObjectToWindow(hv_WindowHandle, draw);
AttachBackgroundToWindow(ho_Image, hv_WindowHandle);
}
回调函数实现
void CallBack_Select(Hlong id, Hlong WindowHandle, char* type) {
selectDrawingObject = id;
HDrawingObject obj = HDrawingObject(id);
obj.SetDrawingObjectParams("color", "orange");
HTuple left = obj.GetDrawingObjectParams("column1");
HTuple top = obj.GetDrawingObjectParams("row1");
HTuple right = obj.GetDrawingObjectParams("column2");
HTuple bottom = obj.GetDrawingObjectParams("row2");
cout << "left = " << (double)left << ", top = " << (double)top
<< ", right = " << (double)right << ", bottom = " << (double)bottom << endl;
}
void CallBack_Drag(Hlong id, Hlong WindowHandle, char* type) {
selectDrawingObject = id;
HDrawingObject obj = HDrawingObject(id);
obj.SetDrawingObjectParams("color", "gray");
}