ENVI提供了一些自带WIDGET供用户调用,在二次开发中可以节省大量时间。可以通过ENVI帮助查看WIDGET组件使用方法和功能说明,如图1所示,为ENVI自带组件列表。
ENVI自带组件在单个使用时非常方便,可以利用auto_wid_mng获取组件的输入信息。但是如果我们需要在自己编写的界面中使用ENVI自带组件,或同时使用两个甚至多个自带组件时利用auto_wid_mng就不能方便获取每个组件的输入信息了。

图1 ENVI自带组件列表
下面通过一个示例介绍如何自由组合使用ENVI自带组件。以widget_map和widget_outfm为例,创建如图2所示的界面,并点击OK按钮时获取每个组件的输入信息。

图2 同时使用2个ENVI自带组件
代码如下:
PRO BASE_EVENT, ev
WIDGET_CONTROL, ev.TOP, get_uvalue = pState
outf = pState.OUTF
mapw = pState.MAPW
;响应事件
CASE WIDGET_INFO(ev.ID, /uname) OF
'ok': BEGIN
;获取信息
WIDGET_CONTROL, mapw, get_value = mapw_value
PRINT, '获取的投影坐标信息******************************************'
HELP, mapw_value
WIDGET_CONTROL, outf, get_value = outf_value
PRINT, '获取的输出路径信息******************************************'
HELP, outf_value
END
ELSE:
ENDCASE
END
PRO TEST_ENVI_WIDGET
;
COMPILE_OPT idl2
ENVI, /restore_base_save_files
ENVI_BATCH_INIT
;创建顶级Base
base = WIDGET_BASE(title = 'ENVI Widget', /column)
;创建投影坐标系选择组件
mapw = WIDGET_MAP(base, /frame)
;创建输出文件选择组件
outf = WIDGET_OUTFM(base, uvalue='outf', /frame)
;创建按钮
ok = WIDGET_BUTTON(base, value = 'OK', uname = 'ok')
WIDGET_CONTROL, base, /realize
;将mapw和outf两个组件ID存储在base的uvalue中
pState = {outf:outf, mapw:mapw}
WIDGET_CONTROL, base, set_uvalue = pState
XMANAGER, 'base', base, /no_block
END
使用演示:参数设置好之后(如图3所示),点击OK按钮,得到如下结果,利用这些信息便可以进行下一步处理了。
获取的投影坐标信息******************************************
** Structure <188d5c00>, 3 tags, length=224, data length=202, refs=1:
MAP_X DOUBLE 111.00000
MAP_Y DOUBLE 45.000000
PROJ STRUCT -> ENVI_PROJ_STRUCT Array[1]
获取的输出路径信息******************************************
** Structure <18744090>, 3 tags, length=24, data length=22, refs=1:
NAME STRING 'D:\Temp\test_envi_widget.dat'
IN_MEMORY LONG 0
COMPRESSION INT 0

图3 参数设置结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?