如何使用预定义函数捕获ROI变更事件?现有代码无响应求助
问题排查与修复
你的代码存在两个关键问题,导致roi_changed事件无触发反馈:
1. 事件监听器注册参数错误
ImageDisplayAddEventListener仅接受单个消息映射字符串作为第三个参数,你拆分两个字符串分别传入,导致roi_changed的映射未被正确注册。需将多个事件映射用分号;合并为一个字符串。
2. ROI变更事件的回调函数签名不匹配
roi_changed事件的回调函数参数数量、顺序不符合DM的定义,正确参数列表应为:void 回调函数名( object self, number flags, ImageDisplay disp, number roi_flags, ROI theRoi )
你的代码多了disp_flags参数且顺序错误,导致事件触发时无法正确调用回调。
修正后的完整代码
class CListen { CListen( object self ) { Result( "\n CListen object " + self.ScriptObjectGetId() + " created in memory."); } ~CListen( object self ) { Result( "\n CListen object " + self.ScriptObjectGetId() + " removed from memory."); } // 修正参数匹配roi_changed事件定义 void OnROI_c( object self, Number flags, ImageDisplay disp, Number roi_flags, ROI theRoi ) { string nam = "[" + disp.ImageDisplayGetImage().GetLabel() + "]" result( "\n ROI changed in " + nam + ", flags: " + roi_flags ) } void OnClick( object self, number flags, imageDisplay disp, number mx, number my ) { string name = "[" + disp.ImageDisplayGetImage().GetLabel() + "]" result( "\n Mouse-click in " + name + " at " + mx + " / " + my ) } } { image img := RealImage( "Test", 4, 100, 100 ) img.ShowImage() imageDisplay disp = img.ImageGetImageDisplay( 0 ) ROI theRoi = NewROI() theRoi.ROISetRectangle( 10, 10, 40, 40 ) disp.ImageDisplayAddROI( theRoi ) object listener = Alloc( CListen ) // 合并事件映射为单个字符串 string messagemap = "unassociated_click:OnClick;roi_changed:OnROI_c" number listenID = ImageDisplayAddEventListener( disp, listener, messagemap ) }
验证说明
运行修正后的代码:
- 点击图像空白区域,会触发
OnClick输出点击坐标 - 拖动或修改ROI时,会触发
OnROI_c输出ROI变更标识信息
内容的提问来源于stack exchange,提问作者E Voelkl
相关产品推荐
相关产品推荐

