【IDL】自定义鼠标光标样式(直接图形法与对象图形法)

IDL的可视化界面程序中,实际使用时鼠标形状动态变化或按需变化是非常实用的一个功能。通过鼠标形状可以了解到系统的工具工作状态,如常用的平移(小手形状)、放缩(+-)或定位(+)工具。

IDL的可视化分为直接图形法和对象图形法,两种可视化模式中均可以设置鼠标形状,设置方法见附代码,示例效果图如下。

;鼠标形状创建函数
;通过这个想创建啥鼠标形状都可以了吧o(∩_∩)o
FUNCTION CURSORCREATE, normhand=normhand, handgrasp=handgrasp, magic=magic
  IF KEYWORD_SET(normhand) THEN BEGIN
    strArray = [ $
     '      ##      ', $
     '   ## # ###    ', $
     '  #  ## #  #   ', $
     '  #  ## #  # # ', $
     '   # #  #  ## #', $
     '   # #  #  #  #', $
     ' ## #      #  #', $
     '# ##         #', $
     '#  #  $    # ', $
     ' #           # ', $
     ' #          # ', $
     ' #         #  ', $
     '  ##########   ', $
     '   #########   ', $
     '    ########   ', $
     '               ']
  ENDIF
  IF KEYWORD_SET(handgrasp) THEN BEGIN
    strArray = [ $
     '               ', $
     '               ', $
     '               ', $
     '               ', $
     '               ', $
     '   ## ## ##    ', $
     '  #  # #  ##   ', $
     ' #       # #  ', $
     '  #        #  ', $
     ' ##        #  ', $
     ' #    $    #  ', $
     ' #         #   ', $
     ' #        #   ', $
     '  #########    ', $
     '   ########    ', $
     '   ########   ']
  ENDIF
 
  IF KEYWORD_SET(magic) THEN BEGIN
    strArray = [ $
     '     #        ', $
     '  #  #  #    ', $
     '  #######     ', $
     '  #    #     ', $
     '  #    #     ', $
     ' ###    ###    ', $
     '  #    #     ', $
     '  #    #     ', $
     '  ########    ', $
     ' #   # ###    ', $
     '         ###   ', $
     '          ###  ', $
     '           ### ', $
     '            ###', $
     '               ', $
     '               ']
     
  ENDIF
  cursor_image = CREATE_CURSOR(strArray, HOTSPOT=hotspot, MASK=mask)
  REGISTER_CURSOR, 'translate', cursor_image, HOTSPOT=hotspot, MASK=mask
  RETURN, cursor_image
END
;系统析构函数
PRO CHANGINGCURSORIMAGE_CLEANUP,top
  WIDGET_CONTROL,top,get_UValue = pState
  IF PTR_VALID(pState) THEN PTR_FREE, pState
END
;事件响应函数
PRO CHANGINGCURSORIMAGE_EVENT,ev
  ;获取结构体
  WIDGET_CONTROL,ev.top,get_UValue = pState
  ;判断事件除非组件uName
  uname = WIDGET_INFO(ev.id,/uName)
  CASE uName OF
    ;直接图形法
    'direct': BEGIN
     DEVICE, CURSOR_STANDARD = ((*pState).listValue)[ev.index]
    END
    ;对象图形法
    'object': BEGIN
     ;判断指针形状索引
     curIdx = ev.index
     IF curIdx GE 13 THEN BEGIN
       IF curIdx EQ 13 THEN  cursorImg = CURSORCREATE(/normhand) $
       ELSE IF curIdx EQ 14 THEN  cursorImg = CURSORCREATE(/handgrasp) $
     ELSE IF  curIdx EQ 15 THEN cursorImg = CURSORCREATE(/magic)
     (*pstate).oWindow->SETCURRENTCURSOR,image=cursorImg
    ENDIF ELSE (*pState).oWindow->SETCURRENTCURSOR, ((*pState).ListShow)[curIdx]
  END
  ELSE:
ENDCASE

END
;
;Author:dyq
;Date: 2011年3月21日
;主界面程序
PRO CHANGINGCURSORIMAGE
  ;创建界面
  tlb = WIDGET_BASE(title='鼠标形状',/column)
 
  wTab = WIDGET_TAB(tlb,uname = 'tab')
  ;直接图形法
  wBase1 = WIDGET_BASE(wTab,/column)
  wSelect = WIDGET_BASE(wBase1,/row )
  wLabel  = WIDGET_LABEL(wSelect,value='直接图形法--鼠标指针选择:')
  ;直接图形法的指针
  ListShow = ['Arrow','I-Beam','Hourglass','Black Crosshaire',$
    'Up Arrow','Size','Icon',$
    'Size NW-SE','Size NE-SW','Size E-W','Size N-S','Size All', $
    'Not Allowed','Pointing Hand','Arrow Hourglass','Help']
  listValue = [32512,32513,32514,32515,$
   32516,32640,32641, $
   32642,32643,32644,32645,32646, $
    32648, 32649, 32650, 32651]
  wDirSel = WIDGET_DROPLIST(wSelect,value = ListShow,$
    uname = 'direct')
  ;direct draw
  wDraw = WIDGET_DRAW(wBase1, $
    xSize =400,ySize =400)
  WIDGET_CONTROL,tlb,/realize
  WIDGET_CONTROL, wDraw,get_value = ddraw
  ;显示一个图像
  WSET,ddraw
  TVSCL,DIST(400)
 
  ;对象图形法
  wBase2 = WIDGET_BASE(wTab,/column)
  wSelect = WIDGET_BASE(wBase2,/row )
  wLabel  = WIDGET_LABEL(wSelect,value='对象图形法--鼠标指针选择:')
  ListShow = ['ARROW','CROSSHAIR','ICON','IBEAM',$
   'MOVE','ORIGINAL','SIZE_NE',$
   'SIZE_NW','SIZE_SE','SIZE_SW',$
   'SIZE_NS','SIZE_EW','UP_ARROW',$
   'userdefine1','userdefine2','userdefine3']
  wDirSel = WIDGET_DROPLIST(wSelect,value = ListShow,$
    uname = 'object')
  ;
  wDraw1 = WIDGET_DRAW(wBase2, $
    xSize =400,ySize =400, $
   graphics_level = 2,$
    /DRAG_NOTIFY , $
    retain = 2 )
  WIDGET_CONTROL, wDraw1,get_value = oWindow
  oView = OBJ_NEW('IDlgrView',color = [1,1,1]*255b)
  oWindow->SETPROPERTY, Graphics_tree =oView
  oWindow->DRAW
  ;存储下基本组件信息
  WIDGET_CONTROL,tlb, set_UValue = PTR_NEW($
    {oWindow: oWindow,listValue:listValue,ListShow: ListShow},/no_copy)
  ;事件响应
  XMANAGER, 'ChangingCursorImage',tlb,$
    cleanup = 'ChangingCursorImage_cleanup',/no_Block
END

 

posted @ 2024-06-28 14:32  地理遥感生态网平台  阅读(20)  评论(0编辑  收藏  举报