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

博文

IDL鼠标信息显示界面(同理可实现鹰眼图等

已有 4584 次阅读 2011-12-15 23:03 |个人分类:IDL技术|系统分类:科研笔记| 信息, 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




https://blog.sciencenet.cn/blog-344887-518874.html

上一篇:IDL与C#混合编程技术
下一篇:ENVI二次开发基础入门与基本函数使用
收藏 IP: 180.111.11.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

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

GMT+8, 2024-11-23 18:43

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部