【IDL】编写程序启动界面

很多时候程序启动时需要花一定的时间进行界面初始化、配置文件读取等操作,需要用户等待,此时如果有个带漂亮图片或程序版权信息的界面在那放着会让人感觉程序启动中,马上就起来了。
从IDL实现上讲,无非就是显示一个不带菜单,不带标题栏的widget_base,里面显示了一张图片。
下面以一个常规的界面程序为例,注意代码中的调用部分。


启动界面


程序主界面

代码如下:

;$Id: show_splash_screen.pro 4 2008-01-30 21:13:44Z mpiper $
;+
; Shows an image without a window border on the screen.
;
; @returns widget identifier of top-level base
; @param image {in}{type=2 or 3 dimensional array} an image to
;       display
; @keyword true {in}{optional}{type=integer, 0-3}{default=0} order of
;         bands, 0 if 8-bit image
; @keyword order {in}{optional}{type=boolean} orientation of image
; @keyword title {in}{optional}{type=string} title of window to
;         display in icon
;-
;启动界面
function show_splash_screen, image, true=true, order=order
  compile_opt idl2
  on_error, 2
 
  true_local = n_elements(true) eq 0 ?  0 : true
 
  sz = size(image, /structure)
 
  if (true_local eq 0 and sz.n_dimensions ne 2) then $
   message, 'TRUE keyword must be set to 1, 2, 3 ' $
    + 'for 24-bit image'
   
  if (true_local ne 0 and sz.n_dimensions ne 3) then $
   message, 'TRUE keyword must be set to 0 for 8-bit image'
   
  xind = (true_local ne 1) ? 0 : 1
  yind = ((true_local eq 0) or (true_local eq 3)) ? 1 : 2
 ;屏幕分辨率计算
  device, get_screen_size=screen_size
 ;界面偏移量
  xoffset = (screen_size[0] - sz.dimensions[xind]) / 2
  yoffset = (screen_size[1] - sz.dimensions[yind]) / 2
 
  tlb = widget_base(tlb_frame_attr=4, /column, $
   xpad=0, ypad=0, xoffset=xoffset, yoffset=yoffset)
  draw = widget_draw(tlb, xsize=sz.dimensions[xind], $
   ysize=sz.dimensions[yind])
   
  widget_control, tlb, /realize
  widget_control, draw, get_value=win_id
 
  wset, win_id
  tv, image, true=true_local, order=keyword_set(order)

  return, tlb
end
 
;启动界面示例代码
;
pro splash_example
 ;读取启动界面要显示的数据
  file = filepath('rose.jpg', SUBDIRECTORY=['examples','data'])
  data = read_image(file)

 ;开始启动界面***
  splash_base = show_splash_screen(data,/true)
  ;
 ;创建程序内容,初始化界面、程序、数据等,注意,程序界面的tlb先是要隐藏的
  tlb = WIDGET_BASE($
   /column, $
  
   map = 0,$ ;隐藏
   mbar =result,$
   title ='test_button')
  ;
 WIDGET_CONTROL,tlb,/realize
 
  menu = WIDGET_BUTTON(result, value ='文件(&F)')
  fmenu = WIDGET_BUTTON(menu, value ='√打开')
 ;menu关键字
  mMenu = WIDGET_BUTTON(menu, value ='进入',/menu)
  tMenu = WIDGET_BUTTON(mMenu, value ='二级',/menu)
 ;separator关键字
  eMenu = WIDGET_BUTTON(menu, value ='退出',/SEPARATOR)
 
  ubase = WIDGET_BASE(tlb,/row)
  dbase = WIDGET_BASE(tlb,/row,/frame)
  ;
  b = WIDGET_BUTTON(ubase,value = '按钮',tooltip = '创建的button')
  b = WIDGET_BUTTON(ubase,value = '菜单', $
   tooltip = '菜单加对号')
  h = WIDGET_BUTTON(ubase,value = BINDGEN(2,40))
  ;
  bit =WIDGET_BUTTON(ubase,value =filepath('colorbar.bmp', SUBDIRECTORY=['resource','bitmaps']),/bitmap)
 ;单选button'
  exbase = WIDGET_BASE(dbase,/EXCLUSIVE,/column,/frame)
  eb1 = WIDGET_BUTTON(exbase,value ='',uName = 'right',/NO_RELEASE )
  eb2 = WIDGET_BUTTON(exbase,value ='',uName = 'error',/NO_RELEASE )
 ;选择第一个按钮
 widget_control,eb1,/SET_BUTTOn
 ;复合选择button
  nexbase = WIDGET_BASE(dbase,/NONEXCLUSIVE,/column)
  eb1 = WIDGET_BUTTON(nexbase,value ='envi')
  eb2 = WIDGET_BUTTON(nexbase,value ='idl')
 ;选择第一个按钮
 widget_control,eb1,/SET_BUTTOn
 ;创建显示组件
  wDraw = Widget_Draw(tlb,xsize = 600,ysize = 400)
 
 ;等待2秒
  wait,2
 
 ;销毁启动界面***
  Widget_control, splash_base,/destroy
 
 ;计算界面居中
 ;屏幕分辨率计算
  device, get_screen_size=screen_size
  geoInfo = widget_info(tlb,/geo)
 ;界面偏移量
  xoffset = (screen_size[0] - geoInfo.xSize) / 2
  yoffset = (screen_size[1] - geoInfo.ySize) /2
 Widget_Control,tlb, xoffset = xoffset, $
   yoffset = yoffset
   
 ;显示程序主界面
 widget_control,tlb,/map
 
;后面其他功能代码
;.....
end


知识点总结:
1、界面组件布局
2、菜单、按钮(单选、复选)按钮
3、启动界面

posted @   ENVI-IDL技术殿堂  阅读(563)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示