如何利用IDL程序自动添加ENVI菜单呢?下面就是解决办法:

ENVI自身有个ENVI_DEFINE_MENU_BUTTON。
       是这么定义的,如功能扩展函数名称为Envi_file_info,event,那么只需在函数中添加个过程PRO Envi_file_info_define_buttons, buttonInfo,然后菜单的添加工作就可以在这个过程下完成了。
       ENVI_DEFINE_MENU_BUTTON的调用格式如下:ENVI_DEFINE_MENU_BUTTON, ButtonInfo [, /DISPLAY], $ EVENT_PRO=string | /MENU | UVALUE=string [, POSITION=long integer or string] [, REF_INDEX=long integer] [, REF_UVALUE=variable], REF_VALUE=string [, SEPARATOR={0 | 1 | -1}] [, /SIBLING], VALUE=string
; 其中
; Display-是创建在主菜单还是显示菜单
; VALUE -菜单的显示信息 -必须的
; UVALUE -必须的
; EVENT_PRO-程序事件名称
; Menu- 是否为菜单
; REF_INDEX-如REF_VALUE不唯一则可用此来设置
; REF_VALUE -作为parent的已存在菜单名
; SIBLING -是否创建同级菜单
; ...+++看一个例子
PRO Envi_file_info_define_buttons, buttonInfo
; 创建主菜单-在Basic Tools菜单前后
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '自定义菜单after', $
    /MENU, REF_VALUE = 'Basic Tools', /SIBLING, POSITION = 'after'
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '自定义菜单before', $
    /MENU, REF_VALUE = 'Basic Tools', /SIBLING, POSITION = 'before'
   
;创建子菜单
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '功能都有了,添加点儿啥呢?', $
    uValue = '', $
    event_pro ='Envi_file_info', $
    REF_VALUE = '自定义菜单before'
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '确实不好加!', $
    uValue = '', $
    event_pro ='Envi_file_info', $
    REF_VALUE = '自定义菜单before'
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '加分隔线咋样?', $
    uValue = '', $
    event_pro ='Envi_file_info',$
    REF_VALUE = '自定义菜单before' , $
    /SEPARATOR
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '后来的,加个塞', $
    uValue = '', $
    event_pro ='Envi_file_info', $
    REF_VALUE = '自定义菜单before', POSITION = 'first'   
   
;创建显示菜单
ENVI_DEFINE_MENU_BUTTON, buttonInfo, $
    VALUE = '自定义菜单', $
    /Display, $
    /MENU, REF_VALUE = 'File', $
    /SIBLING, POSITION = 'after'
ENVI_DEFINE_MENU_BUTTON, buttonInfo, $
    VALUE = '更不知道加啥了', $
    UValue =' ', $
    /Display, $
    event_pro ='Envi_file_info', $
    REF_VALUE = '自定义菜单'   
   
END
;+
;description:
;    ENVI query image
; Author: DYQ 2009-5-15;
;
PRO Envi_file_info,event
; COMPILE_OPT STRICTARR

;选择文件
ENVI_OPEN_FILE, fname, r_fid=fid

;如无效则返回
IF fid[0] EQ -1 THEN BEGIN
    msg = DIALOG_MESSAGE('未打开文件或数据错误!',/Error)
    RETURN
ENDIF

;数据信息查询
ENVI_FILE_QUERY, fid, ns=ns, nl=nl, nb=nb, fname=fname
;提示
msg = DIALOG_MESSAGE('输入文件名:'+ fName + STRING(13B)+ $
    ';波段数:'+STRING(nb)+ STRING(13B)+ $
';大小:'+STRING(ns)+'*'+STRING(nl),$
/Information)

OK!