菜单栏设计 PRO IDLGui ;构建界面 ;显示 ;添加事件 tlb=WIDGET_BASE(xsize=400,ysize=400,/column,mbar=mbar);实现基类 file=WIDGET_BUTTON(mbar, $ ;新建button, value='文件') open=widget_button(file,value='打开',/menu) jpg=widget_button(open,value='jpg') exist=widget_button(file,value='退出',/SEPARATOR) WIDGET_CONTROL,tlb,/realize END 效果------------------------------------》 定义一个界面并赋予事件过程 idlgui.pro PRO IDLGui_event,event ;_event:程序关联 if(tag_names(event,/STRUCTURE_NAME) eq 'WIDGET_KILL_REQUEST') then begin result=DIALOG_MESSAGE("是否关闭",/QUESTION) CASE (result) OF 'Yes': BEGIN WIDGET_CONTROL,event.TOP,/DESTROY return END 'No': BEGIN RETURN END ELSE: BEGIN END ENDCASE endif ;print,'now here' uname=WIDGET_INFO(event.ID,/uname) ;help,event, PRINT,'Now, you clicked '+uname ;获取变量 WIDGET_CONTROL,event.TOP,GET_UVALUE=ptr CASE (uname) OF 'open': BEGIN file=DIALOG_PICKFILE(FILTER='*.jpg',path=(*ptr).path,GET_PATH=path2); ;get_path:记住当前选中的路径然后赋值给path (*ptr).path=path2 WIDGET_CONTROL,(*ptr).BTTEXT,SET_VALUE=file;设置值bttext END 'show': BEGIN WIDGET_CONTROL,(*ptr).BTTEXT,GET_VALUE=file; READ_JPEG,file,data wset,(*ptr).wind;设置当前窗口 TVSCL,data,/true;tv只认当前窗口 END 'exit': BEGIN widget_control,event.top,/DESTROY;销毁 END ENDCASE END PRO IDLGui ;构建界面 ;显示 ;添加事件 COMPILE_OPT idl2 tlb=WIDGET_BASE(/column,mbar=mbar,/TLB_KILL_REQUEST_EVENTS);实现基类 xsize=400,ysize=400, file=WIDGET_BUTTON(mbar, $ ;新建button, value='文件') open=WIDGET_BUTTON(file,value='打开',/menu,uname='open') jpg=WIDGET_BUTTON(open,value='jpg',uname='open') exist=WIDGET_BUTTON(file,value='退出',/SEPARATOR,uname='exit') ;工具栏---带有系统图标的,如果是外部的图片用绝对路径 btbase=WIDGET_BASE(tlb,/row) btOpen=WIDGET_BUTTON(btbase,value='open.bmp',/BITMAP,uname='open') btshow=WIDGET_BUTTON(btbase,value='advanced.bmp',/BITMAP,uname='show') ;文本框 bttext=WIDGET_TEXT(btbase,XSIZE=70) dbase=WIDGET_BASE(tlb,/row) draw=WIDGET_DRAW(dbase,xsize=500,ysize=500) ;居中 DEVICE,GET_SCREEN_SIZE=screen_size;得到屏幕大小 result=WIDGET_INFO(tlb,/geometry);得到窗体的几何信息 ;help,result ;计算窗体两边的偏移量 offset=[screen_size[0]-result.SCR_XSIZE,screen_size[1]-result.SCR_YSIZE]/2 ;将得到的偏移量应用到应用程序 WIDGET_CONTROL,tlb,xoffset=offset[0],yoffset=offset[1],/realize widget_control,draw,GET_VALUE=wind ;传递变量---结构体+指针 pstate={bttext:bttext,$ wind:wind, $ path:''} ptr=PTR_NEW(pstate,/NO_COPY) WIDGET_CONTROL,tlb,SET_UVALUE=ptr ;事件 Xmanager,'IDLGui',tlb ,/no_block;no_block----idl命令行失效,xmanager在最上面定义event END 效果