LearningENVI&IDL分享 http://blog.sciencenet.cn/u/dongyanqing Learning ENVI&IDL

博文

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

已有 4781 次阅读 2011-3-21 21:32 |个人分类:IDL技术|系统分类:科研笔记| 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: 2011321

;主界面程序

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




https://wap.sciencenet.cn/blog-344887-424930.html

上一篇:IDL的sav文件双击不能打开的问题解决(Win7或Windows Server2008
下一篇:ENVI二次开发的内部(猜测)示例代码分析
收藏 IP: 125.39.134.*| 热度|

0

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-27 04:40

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部