【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