IDL_GUI

菜单栏设计
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
效果
 

image
posted @ 2015-01-30 17:50  上官瑾文  阅读(869)  评论(0编辑  收藏  举报