首页 > 编程语言 >IDL学习笔记(1)--可视化组件编程

IDL学习笔记(1)--可视化组件编程

时间:2023-09-04 16:06:46浏览次数:47  
标签:WIDGET -- top widget IDL base 可视化 ev id


作者:fbysss
关键字:IDL

!开头的是一些内置变量,比如!PI ,!PATH等
按Ctrl+Space可以打开代码提示
发布可执行文件只能使用MAKE_RT命令,而不是Export菜单
WIDGET_BASE 这个函数是窗口程序的基础。所有窗口元素都放置在WIDGET_BASE返回的窗口上。
base = WIDGET_BASE(/ROW, TITLE='标题') 表示创建一个顶级窗口,/ROW或者/COLUMN用来指定元素摆放的方式。
XOFFSET 和YOFFSET用来指定元素位置。一旦指定了/ROW或者COLUMN,坐标设置将被忽略.参数中的符号"/"表示该参数值设置为1。/row相当于 row = 1。也就是说,如果需要元素按照行来排列,可以使用/column(只有一列)或者row=n。
窗口创建完之后,需要使用WIDGET_CONTROL, base, /REALIZE 来显示
WIDGET_BASE(parent,/row.....)可以创建一个窗口放置在父窗口部件上。这时候不能指定TITLE参数,只有顶级窗口可以使用TITLE。
XMANAGER中注册,这样可以和事件处理程序挂钩

一个Button可以显示文字,也可以显示图片
用画图工具创建一个图片,写上自己的名字,保存为bmp格式,取名为fbysss.bmp,然后在工程中导入该文件,
加入按钮button=WIDGET_BUTTON(base, VALUE='fbysss.bmp', /BITMAP),啊哈,自己的名字已经在按钮上了!
要在运行期间修改图片,使用WIDGET_CONTROL, button, SET_VALUE='other.bmp', /BITMAP
ACCELERATOR参数用于设置快捷键,要注意,不能写成done=WIDGET_BUTTON(base, VALUE='执行',ACCELERATOR='6') ,快捷键必须是Ctrl/alt/shift与字母数字组合或者功能键F1-F12或其他除了字母和数字的键
UVALUE 参数是用户自定义的,可以用于辅助处理按下按钮之后的事件。


PRO example_event, ev 
 
; The uservalue  
  is 
   retrieved from a widget when an event occurs: 
WIDGET_CONTROL, ev.id, GET_UVALUE  
  = 
   uv 
 
;  
  If 
   the event occurred in the Done button, kill the widget 
; example: 
 
  if 
   (uv eq  
  ' 
  DONE') THEN WIDGET_CONTROL, ev.top, /DESTROY  
  
 
   
;  
  End 
   of the event handler part: 
 
  END 
   
 
; This  
  is 
   the routine that creates the widget  
  and 
   registers it  
  with 
   
; the XMANAGER: 
PRO Example
 
; Create the top 
  - 
  level base  
  for 
   the widget: 
base  
  = 
   WIDGET_BASE(TITLE 
  = 
  ' 
  Example')  
  
 
   
; Create the Done button  
  and 
    
  set 
   its uservalue  
  to 
    
  " 
  DONE 
  " 
  : 
done  
  = 
   WIDGET_BUTTON(base, VALUE  
  = 
    
  ' 
  Done', UVALUE = 'DONE')  
  
 
  ; Realize the widget (i.e., display it  
  on 
   screen): 
WIDGET_CONTROL, base,  
  / 
  REALIZE 
 
; Register the widget  
  with 
   the XMANAGER, leaving the IDL command  
; line active: 
XMANAGER,  
  ' 
  example', base, /NO_BLOCK  
  
 
   
;  
  End 
   of the widget creation part:

END   上面这段例程中,ev是什么意思呢?其作用相当于一个参数,在这里是一个WIDGET_EVENT结构,包括id,top和handle三个字段。其中id表示产生时间的窗体元素的Id,top为该元素所在顶级容器的id,handle似乎是事件处理程序相关联的元素句柄(待核实)


上面这段代码,通过XManager 注册事件,但handle是base。也就是说,即使添加了n个button,都会处理同样的事件,即释放窗口。


这句话可以用于将某个按钮与特定的事件处理程序相关联:fbysssButton=Widget_Button(base, Value='Spacial Button', Event_Pro='fbysssButton_clickEvent')

在上面的代码中加入:


pro fbysssButton_clickEvent,ev
void     = 
    DIALOG_MESSAGE( 
   ' 
   hello,i am fbysss!') 
   
    void  
   = 
    DIALOG_MESSAGE( 
   ' 
   ev.id:'+String(ev.id)) 
   
    void  
   = 
    DIALOG_MESSAGE( 
   ' 
   ev.top:'+String(ev.top)) 
   
    void  
   = 
    DIALOG_MESSAGE( 
   ' 
   ev.handler:'+String(ev.handler)) 
   
    end

IDL学习笔记(1)--可视化组件编程_structure

通过实验得知,id和handler的值一致,而把处理代码放入pro example_event中,top和handler一致。也就是说,虽然两个事件都是Button触发的,而example_event中的注册事件关联元素是base,fbysssButton_clickEvent中的注册事件关联元素是fbysssButton。


代码中还有一句GET_UVALUE = uv,这个也相当于一个别名,uv可以是其它名称,比如uvv。


注意:1.事件生效的前提是parent的事件通过XMANAGER注册。如果没有XMANAGER, 'example', base, /NO_BLOCK 这句话,就算指定了 'fbysssButton_clickEvent',点击该按钮也不会有反应。

2.一个组件可能产生多个事件,比如resize,move等,上面的例子一古脑全捕获,如何有针对性地进行处理呢?这么重要的特性,居然没有封装在Event的结构里面,让人很难理解。国内的书籍中这一点提的很少。还好有help文档,可也花了我不少时间才找到。关键代码如下:



IF     (TAG_NAMES( 
   event 
   ,  
   / 
   STRUCTURE_NAME) EQ  
   ' 
   WIDGET_TLB_MOVE') $  
   
          THEN 
    BEGIN 
;在这里加入事件处理程序
    END

标签:WIDGET,--,top,widget,IDL,base,可视化,ev,id
From: https://blog.51cto.com/u_16245757/7351651

相关文章

  • 《c++高级编程》笔记--内存管理
    作者:fbysss关键字:C++内存管理《c++高级编程》笔记1.new关键字使用关键字new时,内存是在堆(heap)里分配的,不使用new,内存是在堆栈(stack)分配的。句柄handle一般用来描述一个指针的指针。之所以使用“句柄”,是因为句柄允许底层软件在必要时移动内存。使用new的时候,会返回一个指针,并且......
  • Xml2Bean:为Webservice返回Collection准备的一个实用类
    作者:fbysss关键字:Webservice,Xml2Bean背景:Webservice 返回的是xml,如何得到Collection类型呢?最简单的方式就是把xml还原成Collection。准备包:commons-digester-1.8.jar源代码1:Xml2Beanpackagecn.edu.ustb.db.task.util;/***//***<p>标题:Xml2Bean.java</p>......
  • SqlServer2000数据库迁移"用户已存在"问题解决
    作者:fbysss关键字:sqlserver数据库用户,关联缺失背景:数据库从另外一台服务器备份之后还原,发现程序中登录数据库失败。排查:发现"安全性"->"登录"中的数据库用户与数据库没有关联,但是手工再关联,却报出错误21002:[sql-dmo]用户***已经存在的异常信息。而删除该数据库用户也无法进行,因为......
  • 迅雷占用80端口,小心了
        今天安装Apache的时候居然说80端口被占用,但本机并没有安装过IIS和apache,tomcat是8080,为何?    用netstat-ano 一查,找到0.0.0.0:80对应的pid,用tasklist查到该程序居然是Thunder.exe!真是没有想到。      很久以来,我对迅雷的印象还是不错的,但自从Web迅雷推......
  • sql server2005 jdbc解决自动自动增长列统一处理问题纪实
    作者fbysss关键字:自动增长列,jdbc,sqlserver2005背景:系统要支持多种数据库,统一insert的时候获取自动增长列的处理方式问题1:insert+select方案sqlserver2000可以使用insertSql +SELECT@@IDENTITYAS'Identity'的方式来获得,但是mysql则只能使用executeUpdate(insertSql);execut......
  • css盒子,很棒
    作者:fbysss关键字:css盒子css盒子模式其实还是很好的,今后的布局应该坚决贯彻。一些基础知识与技巧:1.什么是BOX?CSS把HTML中以<somesign>……</somesign>的部分称为BOX(容器),BOX有三类属性:padding、margin和border。2.在CSS中,类选择符在一个半角英文句点(.)之前,而id则在半角英文井号(#)......
  • 软件测试 | Dalvik虚拟机是如何执行程序的
    Android系统的架构采用分层思想,这样的好处是拥有减少各层之间的依赖性、便于独立分发、容易收敛问题和错误等优点。Android系统由Linux内核、函数库、Android运行时、应用程序框架以及应用程序组成。如图3-4的Android系统架构所示,Dalvik虚拟机属于Android运行时环境,它与一些核心库......
  • Tomcat5.5的管理模块的几点注意事项
    作者fbysss关键字:Tomcat,adminTomcat5.5默认没有admin模块了.得单独去网站下.下载后,根据相同目录结构拷贝到tomcat下.另外需要注意几个地方:否则点击TomcatAdministration会出现"Tomcat'sadministrationwebapplicationisnolongerinstalledbydefault.Downloadandinst......
  • Subversion 加锁功能
    作者fbysss关键字:svn   Subversion一样可以加锁,只不过需要单独去操作。checkout不会自动加锁。在Tortoise中可以使用GetLock菜单项来操作。   如果加锁者出差了,如何打开锁呢?通过breaklock来实现。这个好像要在browse里面进行。不用担心强行解锁会如何,因为一切操作都有记......
  • 软件测试 | Selenium-Grid架构
    Selenium-Grid是基于传统Selenium架构发展起来的,它有如下优点:1.Selenium测试案例、待测Web应用系统、RemoteControl/浏览器组合之间无须紧密耦合。它们之间通过HTTP进行通信,因此不需要工作在一台机器上。2.Selenium测试案例和待测Web应用系统与具体项目相关。不过,无论SeleniumRem......