【IDL】鼠标信息显示界面(同理可实现鹰眼图等)
IDL实现程序界面时,很多时候需要实现鼠标当前值的显示,即那个鼠标信息时时显示小窗体。
很多时候初学者想不明白,咋着能时时显示那个鼠标信息呢。
参考下面的代码,知识点如下:
1、界面构建(菜单、按钮、文本框、显示区域)
2、界面中鼠标与键盘的事件响应(事件判断)
3、界面由鼠标修改大小(位置计算,组件修改)
4、界面关闭确认(判断关闭事件,确认是否关闭)
5、鼠标信息显示功能(时时显示鼠标位置坐标)
附代码:
;+
;2010年7月北京IDL培训班-示例代码
;
;
; Author: DYQ 2010-7-8;
; Modified By DYQ:2011年12月15日
; 添加鼠标信息显示界面
; BBS: http://bbs.esrichina-bj.cn/ESRI/forum-28-1.html
; E-Mail: dongyq@esrichina-bj.cn
; Blog: http://hi.baidu.com/dyqwrp
;-
; 事件响应程序
PRO TEST_EVENTS_EVENT, event
;获得顶base的uvalue,即组件信息指针结构体
WIDGET_CONTROL,event.TOP,get_uvalue=pstate
CASE TAG_NAMES(event,/STRUCTURE_NAME) OF
;关闭事件
'WIDGET_KILL_REQUEST': BEGIN
tmp = DIALOG_MESSAGE('确认关闭?',$
title ='关闭系统',/question)
IF tmp EQ 'Yes' THEN BEGIN
;注意销毁之前创建的指针
WIDGET_CONTROL,event.TOP,get_uValue = pState
PTR_FREE, pState
;销毁界面
WIDGET_CONTROL,event.TOP,/destroy
RETURN
ENDIF
RETURN
END
;draw区域
'WIDGET_DRAW': BEGIN
CASE event.TYPE OF
;注意不同的类型对应的不同的事件
;键盘和鼠标等各自事件的结构体内容不一定一致的
0: BEGIN
PRINT,event.PRESS
IF(event.PRESS AND 1) NE 0 THEN BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='左键按下'
ENDIF
IF(event.PRESS AND 2) NE 0 THEN BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='中键按下'
ENDIF
IF(event.PRESS AND 4) NE 0 THEN BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='右键按下'
ENDIF
END
1: BEGIN
IF(event.RELEASE AND 1) NE 0 THEN BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='左键释放'
ENDIF
IF(event.RELEASE AND 2) NE 0 THEN BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='中键释放'
ENDIF
IF(event.RELEASE AND 4) NE 0 THEN BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='右键释放'
ENDIF
END
2: BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='鼠标移动'
;鼠标位置
WIDGET_CONTROL,(*pState).WSHOWXY, set_Value = ' 鼠标位置:X'+STRTRIM(event.X,2)+' Y'+STRTRIM(event.Y,2)
END
3: BEGIN
END
4: BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value='暴露事件'
END
5: BEGIN
WIDGET_CONTROL,(*pstate).TEXT1,set_value = 'ch = ' +STRTRIM(STRING(event.CH),2)
END
6: BEGIN
IF event.KEY EQ 1 THEN BEGIN
PRINT,event.CH
END
END
7: BEGIN
IF event.CLICKS GT 0 THEN WIDGET_CONTROL,(*pstate).TEXT1,set_value='滚轮前滚' $
ELSE WIDGET_CONTROL,(*pstate).TEXT1,set_value='滚轮后滚'
END
ELSE: PRINT,event.TYPE
ENDCASE
END
ELSE:
ENDCASE
uName = WIDGET_INFO(event.ID,/uname)
IF uName EQ 'button' THEN BEGIN
;tmp = DIALOG_MESSAGE('信息', /Info)
tmp = DIALOG_MESSAGE((*pState).TESTSTR,/Infor)
ENDIF
;设置大小
IF uName EQ 'tlb' THEN BEGIN
;显示组件大小适应程序大小
drawXSize = event.X -(*pState).DRAWSPACE[0]
drawYSize = event.Y -(*pState).DRAWSPACE[1]
;设置tlb大小(可忽略,因Draw组件后面已经设置了大小)
WIDGET_CONTROL,event.TOP,xSize = event.X,ySize = event.Y
;设置显示组件的大小
WIDGET_CONTROL,(*pState).MYDRAW,xsize = drawXSize, ySize = drawYSize
;适应性显示
TVSCL,CONGRID(DIST(400),drawXSize,drawYSize)
ENDIF
END
;
PRO TEST_MOUSE_EVENTS
; 创建一个主Base窗体
tlb = WIDGET_BASE(TITLE='窗口事件演示', $
xoffset =200, $
yOffset =100, $
mBar = mBar , $
uname ='tlb', $
/COLUMN, $
;重设置大小时产生事件
/TLB_SIZE_EVENTS,$
;关闭时产生事件
/TLB_KILL_REQUEST_EVENTS)
;创建系统菜单
wFile = WIDGET_BUTTON(mbar,value = '文件(&F)')
; 创建一个按钮
base1=WIDGET_BASE(tlb,/row)
label1=WIDGET_LABEL(base1,$
value='当前窗口事件:')
text1=WIDGET_TEXT(base1, $
xSize =10)
button = WIDGET_BUTTON(base1,$
value ='按钮', $
uName ='button')
mydraw=WIDGET_DRAW(tlb,$
retain=1,$
;设置大小
xsize=400,$
ysize=400,$
;滚轮时产生事件
/wheel_events,$
;按钮时产生事件
/button_events,$
;暴露(从遮挡到最前显示时)时产生事件
/expose_events,$
;鼠标移动时产生事件
/motion_events,$
;键盘敲击时事件
keyboard_events = 2,$
;设置组件的uName,及名字,以便组件的区分及调用。
uname='mydraw')
WIDGET_CONTROL, tlb, /REALIZE
;创建鼠标信息窗体
wInfoBase = WIDGET_BASE($
group_leader =tlb,$
xsize = 200, $
/floating,$
title = '信息界面',$
ySize = 25 )
wShowXY = WIDGET_LABEL(wInfoBase,$
xsize = 190,$
value=' 鼠标位置:')
; 初始化它们
WIDGET_CONTROL, wInfoBase, /REALIZE
;获取组件的大小信息
sz = WIDGET_INFO(tlb,/geom)
PRINT,sz.XSIZE
PRINT,sz.YSIZE
drawSZ = WIDGET_INFO(myDraw,/geom)
;显示区域与主界面的边界间隔
drawSpace = [sz.XSIZE,sz.YSIZE] - [drawSZ.XSIZE,drawSZ.YSIZE]
;是否显示伪彩色
DEVICE, decomposed =0
;载入系统颜色表
LOADCT,23
;显示一个400*400的方形图像
TVSCL,DIST(400)
;创建结构体,包含各个组件ID
state={label1:label1,$
text1:text1,$
drawSpace: drawSpace, $
testStr : '程序初始字符串,',$
wShowXY: wShowXY,$
mydraw:mydraw}
;创建指针
pstate=PTR_NEW(state,/no_copy)
;将指针信息存到tlb的uvalue中保存
WIDGET_CONTROL,tlb,set_uvalue=pstate
;关联产生事件
XMANAGER, 'test_events', tlb,/NO_BLOCK
;也可用这个方式:直接指定事件程序,event_handler ='abc'
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?