加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

IDL中自定义类和自定义组件

(2012-10-05 18:55:16)
标签:

it

杂谈

分类: envi idl
hexiaoyaoIDL中自定义类和自定义组件 日志中写到:

IDL主要着重于数据处理方面,在界面方面不是很恰如人意,因此很多东西需要自己去写。用IDL开发多了,觉得有些东西还是做成类或者组件比较方便。

1、在自定义组件时通过函数调用,即程序一般以Function开头,编程和一般的窗体界面没什么大区别,主要是设置为有阻拦程序,同时具有函数返回值,在函数内部传递参数用指针比较方便,但是要注意指针的释放。

以下为一个我做得InputDialog的例子,

Pro IDLInputDialog_event,sEvent
    widget_control,sEvent.top,get_uvalue=psState
    widget_control,sEvent.id,get_uvalue=uval
    case uval of
         'OK':begin
              widget_control,(*psState).wInputText,get_value=strInput
              if strlen(strtrim(strInput)) eq 0 then begin
                   re=dialog_message('输入文本不能为空',/information,title='注意')
                   widget_control,sEvent.top,set_uvalue=psState
                   return
              endif
              (*psState).strInput=strtrim(strInput)
              widget_control,sEvent.top,set_uvalue=psState
              widget_control,sEvent.top,/destroy
              return
         end
         'Cancel':begin
              widget_control,sEvent.top,set_uvalue=psState
              widget_control,sEvent.top,/destroy
              return
         end
    endcase
    widget_control,sEvent.top,set_uvalue=psState
end
Function IDLInputDialog,group_leader=group_leader
    if not keyword_set(group_leader) then begin
         wBase=widget_base(title='输入对话框',tlb_frame_attr=3,/column)
    endif else begin
         wBase=widget_base(title='输入对话框',tlb_frame_attr=3,/column,group_leader=group_leader,/floating)
    endelse
         wInput=widget_base(wBase,/frame,/column,/base_align_left)
              wInputlabel=widget_label(wInput,value='请输入')
              wInputText=widget_text(wInput,value='',uvalue='InputText',/editable,scr_xsize=150,scr_ysize=20)         
         wOptBase=widget_base(wBase,/row)
              wOkButton=widget_button(wOptBase,value='确定',uvalue='OK')
              wCancelbutton=widget_button(wOptBase,value='取消',uvalue='Cancel')
    widget_control,wBase,/realize
    sState={wBase:wBase $
           ,wInputText:wInputText $
           ,strInput:'' $
           }
    psState=ptr_new(sState,/no_copy)
    widget_control,wBase,set_uvalue=psState
    xmanager,'IDLInputDialog',wBase,event_handler='IDLInputDialog_event';,/no_block
    strInput=(*psState).strInput
    ptr_free,psState
    return,strInput              
end

运行界面如下

http://rsgisman.bokee.com/photo/view.fcgi?mode=3&id=3480806

 

用自定义的类时一般具有Define,Init,Destroy或者Cleanup,就够了,如果需要功能强点就需要用Setproperty,和Getproperty属性以及其他的事件处理过程。详细可以看看IDL自带的那些类,IDLgrColorBar,IDLgrLegend等。

以下是做得几个组件的实例。

1、颜色表和调色板工具

http://rsgisman.bokee.com/photo/view.fcgi?mode=3&id=3478100

2、对话框选择字体和颜色

http://rsgisman.bokee.com/photo/view.fcgi?mode=3&id=3478110

3、进度条

http://rsgisman.bokee.com/photo/view.fcgi?mode=3&id=3478132

4、IDL自带的色度条IDLgrColorBar很难实现密度分割设定的颜色,而以下的自定义的完全可根据密度分割来建立色度条并添加标注

http://rsgisman.bokee.com/photo/view.fcgi?mode=3&id=3478251

5、比例尺,仿照ENVI中的比例尺实现的自定义类,长度宽度都可改变,而且按照分辨率计算实际距离,标注和比例尺的节数可以随设置改变,

http://rsgisman.bokee.com/photo/view.fcgi?mode=3&id=3478252

 


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有