MicroStation开发语言(MDL)应用教程

MicroStation开发语言(MDL)应用教程
MicroStation开发语言(MDL)应用教程

MicroStation开发语言(MDL)应用教程

第一章 MDL介绍

一、MicroStation的开发工具

1.UCMs ………… User Commands

2.MicroCSL …… MicroStation Customer Support Library

3.MDL …………… MicroStation Development Language

二、何为MDL

MDL是MicroStation的“应用引擎 (Application Engine)”,MDL可以直接在MicroStation中运行并且表现为MicroStation本身的一部分。许多MicroStation的命令都可以在MDL中应用。

三、MDL的组成

1.标准C (ANSI C) 程序设计语言(当然有某些限制和扩展);

2.一整套开发工具(包括C编译器、连接器、链接库、资源编译器和资源库、Make程序以及调试工具);

3.MicroStation内部的用于执行MDL应用程序的伪码解释器;

4.MicroStation内部的MDL调试器;

5.大量的运行库函数;

6.可以改变MicroStation各种行为的钩子(Hooks)函数,所谓钩子函数是指那些在某种事件发生时被MicroStation

自动执行的函数;

7.GUI开发工具,可以用于开发基于Motif的图形用户界面(包括:对话框、下拉菜单等);

8.资源管理器;

四、运行及卸载MDL应用程序

在MicroStation命令窗口中运行MDL应用时,可以指定一个应用名称和任务识别码(Task ID),其中前者是必须的。具体使用方法如下:

MDL LOAD|SILENTLOAD [DEBUG|NODEBUG] <应用名> [,<任务识别码>] [<参数>]

MicroStation将首先在当前目录下查找用户在命令行中指定的应用,如果找不到,再到由MicroStation环境变量MS_EXE和MS_MDL指定的目录下去寻找。

如果用户未指定应用程序的扩展名,MicroStation将首先寻找无扩展名的文件,其次才是.MA文件和.RSC文件。因此运行时最好键入应用程序的全名。

卸载 MDL应用的命令为:MDL UNLOAD|SILENTUNLOAD [<任务识别码>]

MDL应用还可以在MDL对话框中装载运行,该对话框如图1-1所示。通过MDL对话框也可以卸载MDL应用。

图1-1、MDL对话框

五、MDL的高级调用方式

1.在一个MDL应用中调用另一个MDL应用:使用MicroStation的内部函数mdlSystem_LoadMDLProgram;

2.在MicroStation初始化时(打开DGN文件之前或者进入图形模式之前)调入MDL应用:使用环境变量

MS_INITAPPS和配置变量MS_DGNAPPS,如果要调用多个MDL程序,用分号(;)隔开,语法如下:

MS_DGNAPPS=应用程序名[,任务识别码] [/D];

3.在DGN文件打开时运行MDL应用:使用mdlSystem_CreateStartupElement函数在DGN文件中创建一个启动元素

(Start-up Element,类型代码为66),即可在MicroStation打开DGN文件后立即运行指定的MDL程序;

4.KEYIN应用:MDL KEYIN <应用名> <命令字串>。

六、MDL的高级卸载方式

1.在程序中使用标准C的 “exit”函数卸载程序;

2.MicroSt ation退出时可自动卸载MDL程序;

3.应用程序发生严重错误时会自动退出;

4.在一个应用中卸载另一个应用使用MicroStation内部函数mdlSyatem_unloadMDLProgram;

在MDL调试器中使用QUIT命令可以卸载一个应用程序。

第二章 MDL开发环境

1.开发环境变量

MDL开发环境使用一些变量来定义各种环境参数(表1-1)。

表1-1、MDL开发环境变量列表

变量描述类型缺省值

 

MS MicroStation系统目录环境变量

MDL_COMP mcomp和rsctype的命令行参数环境变量-I%MS%

RSC_COMP rcomp的命令行参数环境变量-I%MS%

BMAKE_OP bmake的命令行参数环境变量-I%MS%

 

MS_MDL 搜寻MDL应用的路径配置变量

 

MS_MDLAPPS 在MDL对话框中列出的应用程序配置变量

在DOS和Windows NT操作系统中,环境变量可以在AUTOEXEC.BAT中设置,同时需要在其中设置的还有MicroStation 系统路径。用户级别的环境变量设置可以从MicroStation命令窗口中选择User --> Workspace option --> Modify User Configuration option菜单(如图2-1所示)激活变量设置对话框(图2-2),在该对话框中选择需要配置的变量进行设置。

图2-1、通过菜单激活变量设置对话框

图2-2、变量设置对话框

二、MDL应用的结构

一个MDL应用由两个主要的部分组成,即程序部分与资源部分。其中程序部分是必须的,而资源部分是可选的。

三、程序代码(Program Code)

程序文件以 .MC为扩展名,该文件中包含实现各种功能的函数代码。M C文件中的函数可以有如下几种类型:

1.主函数(Main Function)

与标准C语言不同,MDL中的主函数可以缺省。主函数通常用于应用程序的初始化,在该应用载入时执行。

2、命令处理函数(Command Process Function)

该函数基于用户事件(User Events)定义应用程序的执行命令。

3、钩子函数(Hook Function)

这种函数通常与对话框或者对话框中的Item相联系,用于修改和增加其功能。

 

四、资源代码(Resource Code)

资源文件以 .R为扩展名,用于定义应用程序的用户界面部分,以下是几种类型的资源组件。资源文件不是一个MDL应用所必须的。

1.对话框定义(Dialog Box Dinfintions)用于定义对话框以及对话框中的元素(Item)。

2.命令表(Command Tables)用于映射键入命令到命令处理函数。

3.消息列表(Message Lists)用于存储处理期间的消息及提示信息的文本字符串。

五、头文件(Head Files)

头文件以 .H为扩展名,用于给程序常量设置识别名以及定义将要在多个源码(程序)文件中使用的变量。使用时将头文件包含(Include)到程序文件中。

六、函数声明文件

函数声明文件以 .FDF为扩展名,用于声明函数原型(prototype)。这有助于减少诸如函数提前引用(即在定义函数之前引用)的编译错误,同时方便了调用函数时的参数检查。MDL使用ANSI C语言的函数原型声明。在MicroStaion系统目录下的MDL\INCLUDE目录中存放着MDL内部函数的原型声明文件(*.FDF)。

七、MDL工具列表

工具描述

mcomp MDL源程序编译器(生成目标代码)

mlink 链接器(链接库文件中的有关目标代码到程序中)

mlib 对象库管理器(用于维护库文件中的目标代码)

rcomp 资源编译器

rlib 资源库管理器(比如把多个资源文件链接到一个资源文件或者程序文件)

rsctype 类型(Type)生成器(生成类型定义以便对话框管理器可在运行时模拟C表达式)

bmake(CLIX & DOS)

MDL应用编译器(用于编译工程文件中指定的应用程序)

bmakewin (Windows NT)

八、MDL Compiler -- mcomp

mcomp用于把源程序编译成目标码,即把 .MC文件编译成 .MO文件。

.MC ----> .MO

语法: mcomp [-参数1 -参数2 …] 源文件名

参数: -c 只编译,不联结;

-g 生成调试信息;

-idir 使用dir目录中的头文件 ;

-pi 显示头文件

编译参数的环境变量设置: MDL_COMP环境变量可用于设置mcomp编译命令行参数,以下是DOS &

Windows NT操作系统下autoexec.bat文件中的环境变量设置示范。

SET MDL_COMP=-I\WIN32APP\INGR\USTATION\MDL\INCLUDE

九、MDL Linker -- mlink

mlink用于链接mcomp产生的目标码和编译库,生成应用或程序文件。

.MO, .ML ---> .MP, .MA

语法mlink [-参数1 -参数2 ] 输入文件名

参数: afile 指定输出文件(默认为输入文件名.MA);

-g[d|n|o] 产生调试信息;

-gd和-g:产生所有可用的调试信息;

-gn:产生部分调试信息 ;

-go:不产生任何调试信息;

-ssize 指定MicroStation之外的运行堆栈大小,若未指定,mlink将基于内部算法产

生一个默认堆栈大小。

十、MDL Libarian-- mlib

mlib用于把MDL目标码联结到编译库文件中

.MO ---> .ML

语法mlib 命令[v/c] 库文件 [输入文件]

参数: a 增加object到库;

d 从库中删除object;

t 显示库文件内容;

x 从库中还原object; 设置参数

v将显示较多的信息。如果需要更新库中内容,必须先删除要更新的Object,然后

再加入新的Object。

十一、Resource Compiler-- rcomp

rcomp工具用于把资源源文件编译成二进制的资源目标文件。默认的输出文件是 .RSC文件,对命令表文件,也可为其产生 .H 头文件。

.R ---> .RSC, .H

语法rcomp [-参数1 -参数2 … ] 输入文件

参数: -h 产生头文件;

-idir 使用dir目录中的头文件;

-pi 显示头文件

编译参数的环境变量设置: 编译参数的环境变量设置: RSC_COMP可用于指定编译命令行参数。以下是DOS

& Windows NT操作系统autoexec.bat文件中的环境变量设置示范。

SET RSC_COMP=-I\WIN32APP\INGR\USTATION\MDL\INCLUDE

十二、Resource Librarian-- rlib

该工具用于联结资源目标代码文件和应用程序文件到一个单一MDL应用或者资源目标代码文件。默认的输出是 .RSC文件。.RSC, .MP ---> .MA .RSC

语法: rlib [-参数1 -参数2 …] 输入文件

?参数

-ofile 指定输出文件(默认为输入文件名.MA)

-v 冗余开关(若指定,将产生较多的输出信息)

十三、Type Generator -- rsctype

该工具用于从包含C类型定义(C type definitions)的文件中产生资源源文件。因为对话框管理器不能“理解”结构(structure)以及联合(union)中的数据。所以rsctype工具将分离结构及联合中的数据,并把它们转换存储到资源源文件(.H)中。type.mt ---> type.r

?语法

rsctype [-参数1 -参数2…] 输入文件

?参数

-idir 使用dir目录中的头文件

-pi 显示头文件

注意!命名自己的type文件时一定要小心,因为如果不按惯例命名,就有覆盖已有 .R文件的危险。

?编译参数的环境变量设置

MDL_COMP可用于指定编译命令行参数。以下是DOS & Windows NT操作系统autoexec.bat文件中的环境变量设置示范。

SET MDL_COMP=-I\WIN32APP\INGR\USTATION\MDL\INCLUDE

十四、文件类型

在MDL开发应用过程中的不同阶段,将有不同类型的文件产生或使用到,不同的文件类型通过相应的文件扩展名来区别。

1、创建资源时用到的文件类型

表2-2、创建资源时用到的文件类型

扩展名描述

cmd.r 包含命令表的资源源文件

cmd.h 包含应用命令号的头文件,由rcomp -h产生

cmd.rsc编译后的命令表资源文件

扩展名描述

typ.mt包含C结构和联合的类型文件

typ.r rsctype产生的资源源文件

typ.rsc编译后的类型资源文件

扩展名描述

.r 资源源文件

.rsc编译后的资源源文件

扩展名描述

msg.r 包含消息资源的资源源文件

msg.rsc编译后的消息资源文件

扩展名描述

dlg.r 包含对话框及其item资源的资源源文件

dlg.rsc编译后的对话框及其item的资源文件

2、创建程序时用到的文件类型

表4、创建程序时用到的文件类型扩展名描述

.h 源程序用到的标准头文件

txt.h 包含文本串的头文件

.fdf 包含函数原型的函数声明文件

.mc MDL源程序文件

.mo 由.mc文件编译成的目标文件

.mp 用mlink生成的程序文件

.ml 用mlib生成的包含目标代码的库文件

.mi rlib产生的中间文件

.ma应用文件(MicroStation中运行)

十五、MDL文件类型及相互其关系

图4表明了不同的MDL应用组件是如何编译到一起的。

图4、MDL文件类型及其相互关系

十六、间接命令行参数

以上提到的这些开发工具,在实际使用过程中都要键入大量命令行参数,有没有减少这种烦琐的参数输入的方法呢?有,那就是使用参数文件(option files)把经常使用的参数设置写到一个文本文件中,然后在命令行中加上 @option_file,即:

command @option_file

第三章 bMake工具

bMake工具允许用户使用工程文件编译整个MDL应用。工程文件定义了组成一个MDL应用的各种宏并指定了各从属文件的编译关联。bMake工具通过判断文件创建的时间可以识别工程文件中是否有文件被改变、删除等。

一、工程文件的文件格式

?工程文件中包含一系列描述应用将如何编译的语句,这些语句有以下几种类型:

1.宏(Marco)

2.条件(Conditionals)

3.Build命令

4.从属(Dependencies)

5.规则

?工程文件的几个通用规则:

1.规则和从属语句之后必须有一空行;

2.如果一条语句分几行写,用“\”表示后续;

3.在任何操作系统中,目录的分隔符一律采用“/”(不用“\”);

4.注释用“#”符号打头。

二、宏(Macros)

宏是一种定义,它给字符串定义一个宏名,在使用时,这个宏名就代表该字符串。您可以引用已有的宏,当然也可以建立自己的宏。下面是一些预定义的宏:

表3-1、预定义的宏

宏定义

$@ 当前目标文件

$? 所有从属文件新于目标文件

$=最新从属文件

$<当前从属文件

$* 目标文件的基名(忽略后缀)

$% 第一个从属文件所在目录

msdos.IP32.unix.macintosh.vax.etc.指定操作系统的各种宏

?宏定义的几种方式:

1.在工程文件内定义;

2.工程文件以外的可被作为宏引用的环境变量;

3.在命令行中使用-D开关。

宏定义的语法:macroname = string

例如:BaseDir = $(MS)/mdl/example/basic

三、条件(Conditionals)

条件是工程文件中的流控制语句,条件语句必须以“%”打头。

表3-2、条件语句的关键字

条件描述

%include文件名包含工程头文件

%ifdef 宏 OR %if宏如果宏已经定义,执行后面的语句

%ifndef 宏如果宏未定义,执行后面的语句

%else与%ifdef ,%if,%ifndef配合使用,表示其条件为假

%elif 在if条件为假时再判断另一条件

%endif结束if条件

 

四、Build命令

Build命令是被从属和规则用来建立目标文件的一系列语句行。如果未定义Build命令,预定义的规则将使用mdl.mki文件中的内容。

表3-3、各种Build命令标志

标志描述

@ 命令不回显

$ 强制回显,即使使用了silent模式

~ 使用内嵌的bmake命令,例如: ~CURRENT设置目标文件的日期为当前日期; ~TIME

设置目标文件的时间为当前时间

> 文件把所有的命令行写入指定的文件中,直到出现“<”标志

<关闭“>”标志指定的文件

五、从属(Dependencies)

从属语句指定了用那些源文件生成目标文件。当任一个源文件被改变时会执行从属语句。

从属语句的语法:目标文件: 从属1 从属2 … 从属n [build命令]

例如:$(o)basic.mo :$(BaseDir)basic.mc $(BaseDir)basic.h

六、规则(Rules)

“规则”用于定义如何使用给定扩展名的从属文件来建立指定扩展名的目标文件。许多规则都已经在mdl.mki中定义过了。如果一个目标文件有多个从属文件,其中第一个文件的扩展名将用来寻找规则。如果对一个目标文件使用了多个规则,只有最后一个有效。规则的语法:.从属文件扩展名.目标文件扩展名:build命令

以下的mdl.mki文件显示了规则的范例

七、运行bMake

bMake命令把MDL源码文件编译成应用。在Windows NT中使用bMakeWin命令

bMake的语法:bMake [options] 工程文件(*.mke)

bMakeWin [options] 工程文件(*.mke) # -- Windows NT平台

bMake / bMakeWin的参数: -a 重编译所有文件

-dmacro=value 定义宏

-n 仅仅显示build命令

-Idir 设置 .mki文件路径

有两个常用的宏值得一提,它们是 -ddebug和-dproduction。设置宏-ddebug将打开编译器和链接器的调试信息生成开关,使得编译后的MDL应用中包含调试信息。相反,设置宏-dproduction将此开关关闭,运行时将不能进入MDL的调试器。

环境变量:

BMAKE_OPT可用于指定编译命令行参数。以下是DOS & Windows NT操作系统autoexec.bat文件中的环境变量设置示范。SET BMAKE_OPT=-I\WIN32APP\INGR\USTATION\MDL\INCLUDE

八、bMake涉及到的文件类型

在使用bMake进行编译时,除了源程序文件外,还涉及到两种类型的文件:工程文件和工程包含文件(或工程头文件)。工程文件以“.MKE”为扩展名;工程包含文件以“.MKI”为扩展名。一般而言,规则在工程文件中定义;从属在工程包含文件中定义。

在 $(MS)/mdl/inclde/目录中有一个标准的工程头文件:mdl.mki,其中包含了一些可以用于编译 MDL应用的默认设置。以下是MicroStation提供的示例程序Basic的工程文件和工程包含文件。

basic.mke文件

#----------------------------------------------------------------------

#

# MDL Make File

#

# $Workfile: basic.mke $

# $Revision: 5.3 $

# $Date: 01 Apr 1993 07:39:06 $

#

# Copyright (1993) Bentley S ystems, Inc.

#

# Limited permission is hereby granted to reproduce and modify this

# copyrighted material provided that the resulting code is used only in

# conjunction with Bentley Systems products under the terms of the

# license agreement provided therein, and that this notice is retained

# in its entirety in any such reproduction or modification.

#

#----------------------------------------------------------------------

#---------------------------------------------

# Define macros specific to this examp le

#---------------------------------------------

BaseDir = $(MS)/mdl/examples/basic/

privateInc = $(BaseDir)

#---------------------------------------------

# mdl.mki contains the default rules for creating .rsc, .mo, etc files

# mdlexmpl.mki contains the output directory overrides used by examples #---------------------------------------------

%include mdl.mki

%include mdlexmpl.mki

#----------------------------------------------------------------------

# Define macros for files included in our link and resource merge

#----------------------------------------------------------------------

basicObjs = \

$(o)basic.mo \

$(mdlLibs)ditemlib.ml

??

basicRscs = \

$(o)basic.mp \

$(o)basiccmd.rsc \

$(o)basictyp.rsc

??

#---------------------------------------------

# Generate command table include & resource file using rcomp

#---------------------------------------------

$(genSrc)basiccmd.h : $(BaseDir)basiccmd.r

$(o)basiccmd.rsc : $(BaseDir)basiccmd.r

#---------------------------------------------

# Create & compile the application's type resource file using rsctype

# and rcomp

#---------------------------------------------

$(o)basictyp.r : $(BaseDir)basictyp.mt $(BaseDir)basic.h

$(o)basictyp.rsc : $(o)basictyp.r $(BaseDir)basic.h

#---------------------------------------------

# Compile the MDL source file using mcomp

#---------------------------------------------

$(o)basic.mo : $(BaseDir)basic.mc $(BaseDir)basic.h

#---------------------------------------------

# Link MDL program file from basic.mo & ditemlib.ml using r link

#---------------------------------------------

$(o)basic.mp : $(basicObjs)

$(msg)

> $(o)make.opt

$(linkOpts)

-a$@

$(basicObjs)

<

$(linkCmd) @$(o)make.opt

~time

#---------------------------------------------

# Merge the dialog resources & MDL program file using rlib

#---------------------------------------------

$(reqdObjs)basic.mi : $(basicRscs)

$(msg)

> $(o)make.opt

-o$@

$(basicRscs)

<

$(rscLibCmd) @$(o)make.opt

~time

# complete construction of the .ma by getting the last resource.

%include $(BaseDir)

basicrsc.mki文件

#----------------------------------------------------------------------

#

# MDL Make File

#

# $Workfile: basicrsc.mki $

# $Revision: 5.0 $

# $Date: 01 Apr 1993 07:33:12 $

#

# Copyright (1993) Bentley Systems, Inc., All rights reserved

#

# Limited permission is hereby granted to reproduce and modify this

# copyrighted material provided that the resulting code is used only in

# conjunction with Bentley Systems products under the terms of the

# license agreement provided therein, and that this notice is retained

# in its entirety in any such reproduction or modification.

#

#----------------------------------------------------------------------

basicRscs = \

$(reqdObjs)basic.mi \

$(rscObjects)basic.rsc \

$(rscObjects)basicmsg.rsc

$(rscObjects)basic.rsc : $(BaseDir)basic.r $(langSpec)basictxt.h \

$(privateInc)basic.h

$(rscObjects)basicmsg.rsc : $(langSpec)basicmsg.r $(privateInc)basic.h

$(mdlapps)basic.ma : $(basicRscs)

$(msg)

> $(rscObjects)make.opt

-o$@

$(basicRscs)

<

$(rscLibCmd) @$(rscObjects)make.opt

~time

九、工程文件涉及到的MDL文件类型

图3-1工程文件涉及到的MDL文件类型

十、工程文件涉及到的MDL文件类型细节

图3-2工程文件涉及到的MDL文件类型细节

第四章创建对话框

许多MDL应用都使用对话框。对话框实际上就是作为用户和MDL应用之间交互界面的一种窗口。对话框元素是嵌入对话框中的一种资源,用户通过它可以方便直观地修改特定的数据以及执行特定的动作。

一、资源

最简单的定义就是:资源是在源文件中声明并初始化以备后用的变量,但与作为一块内存区域的在程序中用来存储数据的变量不同。

对话框以及对话框中的元素通常在源程序中定义成资源,常用的有:对话框(dialog boxs)、对话框元素(dialog items)、消息列表(message lists)、命令表(command tables)和同义列表(synonym lists)。

二、为什么MDL要使用资源?

1.资源管理器可以使用户快速存取资源文件而不必考虑其文件格式的细节;

2.把数据同程序分离开来有助于方便的修改诸如消息和提示信息之类的元素而不必重新编译源程序;

3.资源只是在需要的时候才调入内存,节省了内存空间;

4.在MDL应用中可以使用MicroStation预定义的资源类型,加快了定义资源要素的速度,同时也使得MDL应用有

统一的风格。

三、资源的结构

资源结构采用了类似C语言的结构定义。

表4-1资源结构的组成部分

组件描述

C类型定义或资源类型C类型定义(Typedef)用于定义特定类型的资源实例(比如对话框或按钮);资源类型

是与一个特定资源类型相关联的唯一识别码。C类型定义用于声明一个资源实例而不是

资源类型。

资源识别码资源识别码是一个32位无符号整数,用于唯一标志特定的资源。这个整数一般在程序文

件的头部定义。

属性指定资源属性的参数

数组通常情况下资源有一系列的成员。在初始化时,资源编译器会为数组中的每一个成员数

产生一个内部长整型值。

每个资源类型都有自己的定义,因此,不同资源类型中各组件的类型和值都不相同。下例是资源文件的一部分:

四、对话框的坐标单位

在对话框上放置对话框元素时自然会涉及到该元素在对话框中的位置和大小,那么度量这种位置和大小的单位是什么呢?MDL中的默认规定是把当前字体高度的1/12作为对话框的纵坐标单位,当前字体的1/6作为对话框的横坐标单位。在$(MS)/MDL/INCLUDE/DLOGBOX.H文件中存放了有关的声明。

五、对话框

所有的对话框都由对话框管理器控制,对话框管理器控制调入对话框资源、创建对话框、显示对话框以及维护对话框。六、对话框的类型

对话框有模态和非模态两种。模态对话框要求用户必须作出响应后才能执行其它的任务,而非模态对话框则不然。一般警告信息提示框使用模态对话框。

七、对话框的结构

对话框是在资源文件中定义的,其定义的基础是dlogbox.h中定义的对话框结构。

 

八、定义对话框

定义对话框实际上就是定义对话框结构的各项成员变量。下面的例子仅仅定义一个没有任何元素的空对话框,其标题(Title)为 “示范对话框”

十、打开对话框

定义了对话框,也包含了头文件,现在只差最后一步 —打开(显示)对话框了。打开对话框有两个函数可以使用:mdlResource_openFile 或

mdlDialog_open

以下是一个在main()函数中显示对话框的示例:

第五章对话框元素(Items)

上一章讨论了如何创建对话框,本章将集中讨论如何在对话框上放置对话框元素(Items)。

一、对话框元素

MicroStation中有几种类型的对话框元素,每一种实现特定的功能。

二、对话框元素的类型

1、标签(Label)

标签是一种静态文本,只显示一个文本字符串,并不接收用户输入。使用

标签不需引用资源,只需将对话框元素的type设置为Label即可。

2、组合框(Group Box)

组合框是一个带标题的矩形图形框,用于把相关联的一组元素框起来。

组合框不接收用户输入,使用时不需要引用资源,只需将对话框元素的type设置

为GroupBox即可。

3、分隔线(Separator)

分隔线是一个垂直或水平的线段,用于分隔对话框上的元素。分隔线不接收用户输

入,使用时不必引用资源,元素列表中的type字段等于Separator。

4、检查按钮(Check Button 或 Toggle Button)

命令按钮用于激活一个操作,用户选择此按钮后,与之相关联的代码就会被执行。元素列表中的type字段等于PushButton。

6、选项按钮(Option Button)

选项按钮允许用户在给出的多个选项中作出选择,选项菜单只显示当前的选择,占用较少的屏幕空

间。元素列表中的type字段等于OptionButton。。

7、滚动条(Scroll Bar)

滚动条用于显示有连续取值范围的值,如果滚动条代表某一值的话,必须有钩子

函数与之相连。元素列表中的type字段等于ScrollBar。

8、文本框(Text)

文本框允许用户键入并编辑文本,不过只允许一行,文本类型可以是字符串、整型值或者浮点数。元素列表中的type字段

等于Text

9、多行文本框(Multi-line Text)

功能与文本框相似,正如其名称所暗示的那样,多行文本

框允许编辑多行

文本。元素列表

中的type字段等于MLText或MultiLineText。

10、颜色拾取框(Clor Picker)

颜色拾取框用于在预定义的256种颜色中选取一种颜色。元素列表中的type 字段等于ColorPicker。

11、图层控制(Level Map)

图层控制用于设置各个图层的打开或者关闭,以及设置当前激活图层,结果存于一个变量

中。元素列表中的type字段等于LevelMap。

12、菜单条(menu Bar)

菜单条在对话框上创建一个基本的菜单。菜单上有3个下拉菜单:Text、Option和Color。元素列表中的type字段等于MenuBar,dlogbox.h中文件还新定义了另外一个菜单资源类型:Ditem_MenuItemXRsc。

13、Text下拉菜单

Text下拉菜单包含数个文本字符串,选择一个字符串将激活一个操作,或者弹出下一级菜单。所以下拉菜单既可以放在Menu Bar上,也可以放在另一个下拉菜单里。元素列表中的type字段等于PulldownMenu或PDTextMenu,dlogbox.h中文件还新定义了另外一个下拉菜单资源类型:PulldownMenuX或PDTextMenuX。

14、Option下拉菜单

Option下拉菜单包含数个选项,用户可以从这些选项列表中选择一个。Option下拉菜单可以隶属于一个菜单条。也可以是Text下拉菜单的子菜单。Option下拉菜单不可以有子菜单。元素列表中的type字段等于PulldownOptionMenu或PDOptionMenu。

15、颜色拾取下拉菜单(Color Picker Pull-down)

颜色拾取下拉菜单的功能同于颜色拾取按钮。元素列表中的type字段等于PulldownCPickerMenu或PDColorPickerMenu。

16、列表框(List Box)

列表框列出几个文本字符串以供用户选择,其功能同于选项按钮,不同点在于列表框可以同时显示多行字符串。元素列表中的type字段等于ListBox。

17、通用元素(Generic)

按钮组中可以放置一组图标在对话框中。元素列表中的type字段等于ButtonGroup。

19、活动分隔线(Sash)

活动分隔线用于分隔对话框,与分隔线不同的是,活动分隔线可以允许用户改变被活动分隔线分隔的对话框两块区域的大小比例。该元素需要钩子函数。元素列表中的type字段等于Sash。

20、Scale滚动条(Scale)

Scale滚动条类似于滚动条,不同的是Scale滚动条可以通过输入数值来改变滚动块的位置。元素列表中的type字段等于Scale。

21、弹出式菜单(Popup Menu)

弹出式菜单是一种活动菜单,弹出式菜单通常用一个热键激活。元素列表中的type字段等于PopupMenu。

22、无线按钮(Radio Button)

用于在一组选项中设置一个选项的对话框元素。元素列表中的type字段等于RadioButton。

三、定义对话框元素

定义对话框元素需要对话框元素的资源规格说明。这种资源可以在一个应用的资源文件中定义,也可以从其他任何已经打开的资源文件中引用。在对话框上放置一个元素需要在对话框的itemList数组中指定一个资源描述列表。

四、对话框元素的资源规格

要执行的命令、欲改变的变量以及标签等是对话框元素的资源规格中的典型信息。对大多数元素来说,资源规格代码存放于资源文件中。资源规格描述涉及到很多参数,详情请参考《MDL程序员手册》。以下是各种参数的列表和说明(表5-1)。

表5-1、对话框元素的资源规格参数

参数描述

commandNumber 与操作相关联的命令识别码(NOCMD表示没有命令)

commandSource 表明是MicroStation命令或是程序指定的命令(MCMD-MicroStation命令,LCMD-程序指定的命令)

unparsed命令参数(””表示无参数)

helpInfo 帮助的ID码(NOHELP-无有效帮助)

helpSource 定位帮助的资源(MHELP-用MicroStation的系统帮助或者没有帮助,LHELP—程序指定帮助)

itemHookID 元素的钩子函数(NOHOOK-无钩子函数)

itemHookArg 元素钩子函数的参数(NOARG-无参数)

label 元素的标签(标题)

accessStr指定与元素相关联的变量

synonymsID指定同义元素的同义列表(NOSYNONYM-无同义列表)

每一类元素在dlogbox.h中都有自己的定义。不同的对话框元素类型有区别于其他元素类型的数据结构,比如文本框需要有一个变量来描述允许的文本长度,而无线按钮就不需要。下表(表5-2)中左边是文本框的类型定义,右边是一个文本框的资源规格说明范例。

表5-2文本框的结构定义及资源规格说明范例

dlogbox.h中定义的结构范例代码

typedef struct ditem_textrsc{

ULong commandNumber; ULong commandSource;

long synonymsID;

ULong helpInfo;

ULong helpSOurce;

long i temHookID;

long i temHookArg;

byte maxSize;

char formatToDisplay[16];

char formatToInternal[16]; char mininum[16];

char maxinum[16];

ULong mask;

Ushort attributes;

#if defined (resource)

char label[];

char accessStr[];

#else

long l ab elLength;

char label[];

#endif

}Ditem_TextRsc;{

NOCMD,

MCMD, NOSYNONYM, NOHELP,

MHELP,

NOHOOK,

NOARG,

1,

“%-1d”,

“%1d”,

“1”,

“3”,

NOMASK, NOCONCAT,

TXT_Parametertxt,“samplesGlobals.number”}

上面出现的TXT_Parametertxt是一个在包含文件中定义的字符串宏。

文本框有一些其他元素都有的公共属性参数,但也有一些特有的参数。比如maxSize,formatToDisplay,formatToInternal,mininum,maxinum,mask,attributes等。

五、对话框元素列表规格

对话框元素列表的规格描述了该元素的大小和位置等信息。它可以没有标签、访问字符串,也可以使元素有效或者无效。对话框元素列表规格的格式如表5-3所示。

dlogbox.h中定义的结构范例代码

typedef struct dialogitemrsc{ Sextent extent;

long type; /* item type */ long i d;

byte attributes;

long i temArg;

#if defined (resource)

char label[];

char auxInfo[];

#else

long l abelLength;

char label[1];

#endif

} DialogItemRsc;{

{XC*12,GENY(1),XC*10,0},Text, TEXTID_Samples, ON, 0, “”, “”,}

上例中的type字段的取值可以是下面列出各项中的任何一个:

Label, GroupBox, Seperator, ToggleButton or CheckButton, PushButton, OptionButton, ScrolBar, Text, MLText or MultiLineText, ColorPicker, LevelMap, MenuBar or MenuBarX, ListBox, Generic, ButtonGroup, Sash, Scale, PopupMenu, or RadioButton.

下面的例子显示了一个加入对话框定义中的元素列表规则。示例中创建的对话框有5个元素:一个文本框、选项按钮、颜色拾取按钮、检查按钮以及一个命令按钮。

#define DIALOG_WIDTH XC *28

#define DIALOG_HEIGHT GENY(7)

DialogBoxRsc DIALOGID_Samples=

{

DIALOGATTR_DEFAULT | DIALOGATTR_SINKABLE,

DIALOG_WIDTH,DIALOG_HEIGHT,

NOHLEP,MHELP,NOHOOK,NOPARENTID,

“示范对话框”,

{

{{XC*12,GENY(1),XC*10,0},

Text,TEXTID_Samples,ON,0,””,””},

{{XC*12,GENY(2),XC(10),0},

OptionButton,OPTIONBUTTONID_Samples,ON,0,””,””},

{{XC*12,GENY(3),0,0},

ColorPicker,COLORPICKERID_Samples,ON,0,””,””},

{{X C*12,GENY(4),0,0},

ToggleButton,TOGGLEID_Samples,ON,0,””,””},

{{XC*12,GENY(5),PUSHBUTTONID_Samples,ON,0,””,””},

}

}

相关主题
相关文档
最新文档