idl结果显示窗口如何缩小_科学网—IDL界面和对象参数或数据传递之万能的uValue - 董彦卿的博文...

;+

;《IDL语言程序设计》

; --数据快速可视化与ENVI二次开发(配盘)

;

;示例源代码

;

;作者:董彦卿

;

;联系方式:sdlcdyq@sina.com

;

;-

;界面关闭响应程序

PRO WIDGET_EXAMPLES_CLEANUP, tlb

;获取uValue

WIDGET_CONTROL,tlb,get_uvalue=pstate

;因是指针,故需要销毁

PTR_FREE, pState

END

;界面事件响应程序

PROWIDGET_EXAMPLES_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

;注意销毁之前创建的指针

PTR_FREE, pState

;销毁界面

WIDGET_CONTROL,event.TOP,/destroy

RETURN

ENDIF

RETURN

END

;draw区域

'WIDGET_DRAW': BEGIN

CASE event.TYPE OF

;注意不同的类型对应的不同的事件

;键盘和鼠标等各自事件的结构体内容

0: BEGIN

CASE event.PRESS OF

1: value = '左键按下'

2: value = '中键按下'

4: BEGIN

value = '右键按下'

;弹出右键菜单

WIDGET_DISPLAYCONTEXTMENU,

event.ID, event.X, $

event.Y,

(*pState).CONTEXTBASE

END

ELSE: PRINT,event.PRESS

ENDCASE

END

1: BEGIN

CASE event.RELEASE OF

1: value = '左键释放'

2: value = '中键释放'

4: value = '右键释放'

ELSE: PRINT,event.RELEASE

ENDCASE

END

2: value = '鼠标移动'

7: BEGIN

IF event.CLICKS GT 0 THEN value='滚轮前滚' $

ELSE value='滚轮后滚'

END

4:BEGIN

value = '暴露事件'

;设置显示组件的大小

drawSize=

WIDGET_INFO((*pState).MYDRAW,/Geom)

;适应性显示

TVSCL,CONGRID(DIST(400),drawSize.XSIZE,drawSize.YSIZE)

END

5: value = 'key = ' +STRTRIM(STRING(event.CH),2)

6: value = 'key = ' +STRTRIM(STRING(event.CH),2)

ELSE:PRINT,event.TYPE

ENDCASE

;

WIDGET_CONTROL,(*pstate).TEXT1,set_value= value

END

ELSE:

ENDCASE

;获取当前组件的uName

uName = WIDGET_INFO(event.ID,/uname)

;点击了界面上按钮

IF uName EQ 'button' THEN BEGIN

tmp = DIALOG_MESSAGE((*pState).TESTSTR,/Infor)

ENDIF

;点击了右键菜单中的按钮

IF uName EQ 'contexButton1' THEN tmp = DIALOG_MESSAGE('右键菜单1',/infor)

IF uName EQ 'contexButton2' THEN tmp = DIALOG_MESSAGE('右键菜单2',/infor)

;修改界面大小

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 WIDGET_EXAMPLES

;创建一个主Base窗体

base1 = WIDGET_BASE(TITLE='界面程序示例', $

mBar = mBar , $

uname ='tlb', $

;按行排列

/COLUMN, $

;重设置大小时产生事件

/TLB_SIZE_EVENTS,$

;关闭时产生事件

/TLB_KILL_REQUEST_EVENTS)

;创建系统菜单

wFile = WIDGET_BUTTON(mbar,value = '文件(&F)')

wOpen = WIDGET_BUTTON(wFile, value = '打开(&O)')

wExit= WIDGET_BUTTON(wFile,

value = '退出(&E)', $

;添加分隔线

/Separator)

;创建一个按钮

base2=WIDGET_BASE(base1,/row)

label1=WIDGET_LABEL(base2,$

value='当前事件:')

text1=WIDGET_TEXT(base2, $

xSize =10)

button = WIDGET_BUTTON(base2,$

value ='按钮', $

uName ='button')

mydraw=WIDGET_DRAW(base1,$

retain=0,$

;设置大小

xsize=400,$

ysize=400,$

;滚轮时产生事件

/wheel_events,$

;点击按钮时产生事件

/button_events,$

;暴露(从遮挡到最前显示时)时产生事件

/expose_events,$

;鼠标移动时产生事件

/motion_events,$

;键盘敲击时事件

/keyboard_events,$

;设置组件的uName,即名字。

uname='mydraw')

;例示

WIDGET_CONTROL, base1, /REALIZE

;创建右键菜单界面

contextBase = WIDGET_BASE(mydraw, /CONTEXT_MENU)

;右键菜单中菜单选项

button1 = WIDGET_BUTTON(contextBase, $

VALUE='右键菜单1', $

uname = 'contexButton1')

button2 = WIDGET_BUTTON(contextBase, $

VALUE='右键菜单2', $

uname = 'contexButton2')

;获取系统初始化颜色模式

DEVICE, Get_Decomposed = oriD

;显示伪彩色图像

DEVICE, decomposed =0

;载入系统颜色表

LOADCT,23

;显示一个400*400的方形图像

imgData = DIST(400)

TVSCL,imgData

;获取组件的大小信息

sz = WIDGET_INFO(base1,/geom)

drawSZ = WIDGET_INFO(myDraw,/geom)

;显示区域与主界面的边界间隔

drawSpace = [sz.XSIZE,sz.YSIZE] - [drawSZ.XSIZE,drawSZ.YSIZE]

;创建结构体,包含各个组件ID和参数

state={label1:label1,$

contextBase: contextBase, $

text1:text1,$

oriD: oriD, $

imgData : imgData , $

drawSpace: drawSpace, $

testStr: '初始字符串!',$

mydraw:mydraw}

;创建指针

pstate=PTR_NEW(state,/no_copy)

;将指针信息存到tlb的uvalue中保存

WIDGET_CONTROL,base1,set_uvalue=pstate

;关联产生事件

XMANAGER, 'WIDGET_EXAMPLES', base1, $

cleanup = 'WIDGET_EXAMPLES_CLEANUP',/NO_BLOCK

;也可用这个方式:直接指定事件程序,event_handler ='abc'

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值