IDL如何编写一个对象图形系统

2018-12-27 16:37

交互式绘图

简介:

IDL中的组件程序采用用户图形界面(GUI),它允许用户在程序中控制信息流,使用名为控件的简单图形控制元件,如下拉菜单,按钮和滚动条等来实现与组件程序的交互。XLOADCT就是IDL中的一个组件程序。

组件程序的优点在于可对用户隐藏用来建立及运行程序的代码,因此用户几乎不需要有什么准备知识就可以自如的使用该程序。当然组件程序使用时的难易取决于程序员的设计和编写能力。

在IDL中编写组件程序是很容易的,用于创建组件程序代码可在任何IDL支持的平台下运行。组件程序一般用来为IDL的内置图形例程提供用户界面。本章中我们将建立一个允许用户控制某些IDL直接绘图功能的组件程序。

IDL组件工具

IDL组件工具是一组函数和过程,它们用于创建并控制组件程序。表4-1列出了10种基本的IDL组件工具,可在组件程序中联合使用以形成复杂的用户界面(无需或只需稍作改动就可在任何运行IDL的机器上使用)。 组件类型 ActiveX control 函数定义 WIDGET_ACTIVEX 描述 在IDL组件程序中嵌入ActiveX控制(只可在WindowsNT/2000平台下运行) 基底组件用作放置其它组件(包括其它基底组件)的平台。 按钮组件有四种:开关按钮、复选按钮、单选按钮和菜单按钮。 绘制组件用于显示IDL图象, 下拉列表组件与按钮组件类似,但是选中时,会出现一系列选项。用户可从中自行选择。 标签组件包含了一些不可编辑的文本。 列表组件提供一系列的列表,用户可使用鼠标从中选择一个或多个。 滚动条组件在两端点间有一个可以移动的标示物。滚动条的值由标示物的位置决定。 表格组件储存并显示表格形式的数据。表中的单个元素可被编辑使用。 文本组件用于显示文本行或接收用户的输入文本信息。 Base WIDGET_BASE Button WIDGET_BUTTON Draw Droplist WIDGET_DRAW WIDGET_DROPLIST Label List WIDGET_LABEL WIDGET_LIST Slider WIDGET_SLIDER Table WIDGET_TABLE Text WIDGET_TEXT 表4-1:IDL组件工具箱中的十种基本组件

组件程序实质上是等级性的,表示程序中单个组件间关系的图表看起来就像一棵树。组件的

1

顺序,称为组件层次构架,决定了GUI的显示状况。程序员对GUI中单个组件的布局有绝对的控制权。

在IDL中,每个组件通过使用其相应的组件创建函数(见表4-1)生成。例如要创建一个按钮组件,应用如下格式调用WIDGET_BUTTON函数: button_id=widget_button(parent_id)

变量button_id是该组件从创建函数返回后取得的唯一标识。组件名用于创建组件后对组件的控制操作。在组件层次构架中,变量parent_id是位于按钮组件直接上方的组件标识(组件名)。

表4-2中列出了WIDGET_CONTROL,WIDGET_INFO和XMANAGER等例程。通过使用这些例程可实现对组件的控制和交互。 帮助例程 WIDGET_CONTROL WIDGET_INFO WIDGET_DISPLAYCONTEXTMENU XMANAGER 描述 用于改变组件的行为或外表面。 此函数用于获得一个组件或组件系统的信息 显示包含菜单或按钮的上下菜单 此过程用于控制组件程序的信息流 表4-2:与组件程序交互的三个例程 例如,要改变刚才创建按钮的标签,可使用WIDGET_CONTROL过程,将组件名传入: widget_control,button_id,set_value=?A Push Button?

WIDGET_CONTROL的另一个重要应用是将组件按层次绘制在屏幕上。只有调用带REALIZE关键字的WIDGET_CONTROL过程后才能看到组件的层次构架。

为了能在程序中取得我们的例子中按钮组件的组件名,可使用带PARENT关键字的WIDGET_INFO过程:

parent_id=widget_info(button_id,/parent)

关于XMANAGER的使用将在“IDL组件编程模型”一节中做详细讲解。

建立界面

建立了IDL组件编程的基础之后,我们就可以编写简单的组件程序了。下面这个名为PLOTINTERACTIVE的程序是一个界面程序,用它可用用户提供的数据显示线型图,并实现IDL直接绘图PLOT过程的一些功能,。

在IDL中打开新编辑窗输入下述代码,保存为文件plotinteractive.pro。 plotinteractive

pro plotinteractive, data

; Test whether the input parameter was passed.

if (n_params() eq 0) then data=sin(findgen(36)*10*!dtor)

; create the top-level base.

tlb=widget_base(title='Interactive plot', /column)

; create a draw widget.

Draw = widget_draw(tlb, xsize=500, ysize=200)

; create a row base to hold a series of controls. Controlbase = widget_base(tlb,/row)

; create a droplist to hold line style choices.

2

linestyles=['Solid','Dotted','Dashed','Dash Dot',$ 'Dash Dot Dot','Long Dash']

linestylesyledrop = widget_droplist(controlbase, value=linestyles,$ title='Linestyle', event_pro='plotinteractive_ls' )

; Draw the widget hierarchy to the screen. widget_control, tlb, /realize end

这就完成了编写PLOTINTERACTIVE的第一步工作。图4-1显示了此程序的组件层次构架。 tlb draw controlbase

Line style drop

图4-1:PLOTINTERACTIVE 中的初始组件层次构架

顶层基底

每个组件程序都有一个顶层基底(TLB)。TLB是充当组件层次构架根部的基底组件,它是层次构架中的最外层框架,包括系统控制栏和菜单栏。由于TLB位于组件层次构架的根部,所以它是没有父组件的,层次构架中的其他所有组件都有父组件。通过使用TLB的关键字可以访问GUI的很多属性。

基底组件

基底组件是组成组件层次构架的“砖块”,它是建立其他组件的基础。创建某组件后,它在屏幕上的位置取决于其上层基底的属性。基底组件决定着子组件的布局、填充、间距和排列格式。在PLOTINTERACTIVE中,COLUMN关键字将TLB组件定义为按列基底,ROW关键字将controlbase定义为按行基底。按列基底的子组件将按创建顺序由顶至底排列,按行基底的子组件则是依创建顺序从左到右排列。

绘制组件

绘制组件是用于显示IDL图形的长方形区域。绘制组件与直接图形法中的WINDOW过程生成的图形窗口或对象绘图法中的窗口对象类似。绘制组件用于接收并响应鼠标操作。只要多加一点代码,就可实现对绘制组件中图形大小的改动。

绘制组件中的图形

创建绘制组件的目的是显示或与IDL图形实现交互。为了在某绘制组件上施行直接图形操

3

作就需要给出绘制组件的窗口索引号。创建绘制组件后,用几乎无所不能的WIDGET_CONTROL过程即可获取其窗口索引号。在PLOTINTERACTIVE中适当位置添加下列黑体部分: plotinteractive

;Realize the top-level base widget_control, tlb, /realize

; Get the window index of the draw widget and set it to be the ; current window .

widget_control, draw, get_value=win_id wset, win_id

; Draw a plot.

plot, data,linestyle=0 end

窗口索引号得自绘制组件的组件标识且保存在变量win_id中。用WSET过程可将此窗口设置为当前窗口。现在组件程序中的所有图形都会被直接送至绘制组件。 注意:实现绘制组件后即可获取其值(VALUE)。

编译和执行

用IDLED菜单或在命令输入窗口输入下述指令编译并执行PLOTINTERACTIVE: IDL>.compile plotinteractive IDL> plotinteractive

所得结果是一个小组件程序,绘图组件中有一幅图形。虽可激活下拉列表组件,但还不能实现任何操作。此组件程序的界面将如图4-2所示。

图4-2

现在我们已经完成了创建该组件程序的第一步。下面我们将扩充代码来激活组件并接收用户的输入。

事件处理

组件程序中对用户操作的接收或响应被称为事件处理。每个IDL组件程序都必须执行一个

4

事件处理模块,其中含有事件发生时将调用的例程以及为其他例程分配事件的例程。组件程序由三部分组成,事件处理例程和事件分配例程是其中的两部分。 IDL组件编程模型

一个IDL程序包括三个部分:

1. 组件创建模块。此例程(或一组例程)用于建立并实现组件层次构架,同时调用

XMANAGER注册该组件程序。这个模块也被称为组件的定义模块,若是单个程序就称为组件的定义例程。

2. XMANAGER过程。此过程等待事件发生并将其分配给合适的事件处理器,对它的调用

是在组件定义模块中进行的。XMANAGER提供了从组件创建模块到事件处理模块的桥梁。

3. 事件处理模块。此模块是一个例程或一组例程,事件发生时将通过XMANAGER过程进

行调用。事件处理模块中的单个例程都由事件处理器调用,事件处理器中含有处理事件信息的代码并会响应事件(例如,按一下按钮将图形显示在绘制组件中)。一个组件程序能够有一个或多个事件处理器――这取决于编写代码的效率和风格。 图4-3表明了IDL组件程序三部分间的关系。 start 事件 处理 模块 组件创建 模块 {event} event loop xmanager (blocking) finish 图4-3:IDL组件程序模型的三个部分

所有的组件程序都由创建例程开始,它建立并实现组件层次构架,创建例程还将调用XMANAGER。一经调用,XMANAGER就会在后台运行,等待事件发生。一旦某事件发生,XMANAGER就会创建一个事件结构体并将其传入恰当的事件处理器,事件处理器是由触发事件的组件或位于其上层的某个组件指定的。事件处理器的任务是分解事件结构体中的信息并响应事件。例如,Plot按钮的事件处理器就会使用存于事件结构体中的绘制组件名在绘制组件中画出图形。事件处理器可能是在组件刚创建时就用EVENT_PRO关键字设定的。例如考查下述在PLOTINTERACTIVE中创建下拉列表组件的指令: linestyledrop=widget_droplist(controlbase,value=linestyles,$ title=?Linestyle?,event_pro=?plotinteractive_ls?)

我们为plotinteractive_ls字符串设置了EVENT_PRO关键字。用户从下拉列表中选择一个项目时就会触发事件,这会通知XMANAGER调用名为PLOTINTERACTIVE_LS的过程并将事件结构体传入作为参数。

5


IDL如何编写一个对象图形系统.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:给水排水管网系统期末考试复习资料整理(完整版)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: