不朽的微光Light 发表于 2015-6-11 08:40:38

dcl对话框自学教程

1/58
DCL 对话框自学教程
课程简介
课程主要介绍AutoLISP 程式的编写,配合使用DCL(Dialog Control Language)
语言,作对话方框的开发及应用.本课程只适合对AutoLISP 程式设计有相当认识
之人仕.全课共分为12 篇,每篇一个主题;而每篇再分为若干小节,每天顺序显示.
内文若有错漏,敬祁见谅,欢迎来函赐教,多谢!!
课程大纲
第一篇 (0 - 4 课) AutoLISP 及Dialog 程式设计基本知识
第二篇 (5 - 8 课) 开启对话方框
第三篇 (9 - 13 课) 设定及取得对话框内元件的值
第四篇 (14 - 19 课) 按钮(button)及核取框(切换钮,toggle)
第五篇 (20 - 25 课) 横列(row),直行(column),空白(spacer)及文字元件
(text)
第六篇 (26 - 30 课) 滑杆(滚动条)元件(slider)
第七篇 (31 - 36 课) 其它按钮及影像按钮元件(image_button)
第八篇 (37 - 43 课) 清单选框元件(list_box)
第九篇 (44 - 48 课) 下拉式(弹出式)清单选框元件(popup_list)
第十篇 (49 - 52 课) 选台钮(radio_button)
第十一篇 (53 - 57 课) 影像元件(image)
第十二篇 (58 - 60 课) 其它元件
注意事项
在各篇课程所介绍的语法结构中,包含在方括号 []中的资料,表示为选择性
项目;可因应情况,自行决定是否须要加上.
字型为紫色的项目,表示可自行设定其名称或内容
定义档为设定对话框元件的纯文字档(副档名为DCL),程式档则是编写
AuotLISP 程式的纯文字档(副档名LSP)
在定义档中,注解以双除号//开始,注解符号及其右边的文字可以不输入;但
在程式档中,注解以分号;开始,注解符号及其右边的文字可以不输入.
警告
本教程来源自互联网,由河西の破衣整理制作,版权归原作者所有。
本教程仅供个人学习交流之用,严禁任何商业用途,否则由此引发的后果将
由您自己承担!
2/58
第 0 课 <第一篇 基本知识> (第1 节)
基本知识
对话方块是现今最流行的人机互动面介面;在早期的AutoCAD 版本中巳经使用,
但只有在R12 版本开始,才提供给使用者自行编程的对话方块开发功能.
对话方块的描述定义在一纯文字档(副档名为DCL)内,无须特别的开发环境
定义档中的对话方块描述,均以对话控制语言(Dialog Control Language,简
称DCL 语言)所建立
在AutoLISP 程式中,配合可编程对话方块(Porgrammable Dialog Box,简称
PDB)函数,启动及操控对话方块
可以在一个定义档(副档名DCL)中定义多个对话方块
对话方块由方块本身,及包含于其内的元件(或称为控件,构件)所组成
每个元件的属性定义均包含在一对大括号{ }中
在定义档中,各元件及其属性均为小写;只有在赋值给属性,或设定对话框名
称时才可使用大写字母
属性以等号=赋值,并以分号;结束(注意 : 在AutoLISP 程式中,分号是作为
注解)
一般要在元件名称前加上一个冒号:,但若元件并不设定属性,则不需要在元
件名称前加冒号,但却要以分号结束
空行会被忽
若定义档发生严重的错误,会在当前的目录下,产生ACAD.DCE 文件,以指明所
发生的错误.
第 1 课 <第一篇 基本知识> (第2 节)
定义档
BASE.DCL 预设在SUPPORT 的目录中,它包含了各元件的原型定义,及各类型巳
定义的其它基本元件;而所有自行开发的对话方块定义档,都可以
使用在BASE.DCL 定义档中的各个元件
ACAD.DCL
预设在SUPPORT 的目录中,它包含了AutoCAD 中所有标准对话方块
的定义
参考定义档
可在自行开发的对话方块定义档中,经由include 指令,取得指定DCL 档中所定义
的元件;其语法如下:
3/58
@include "对话框定义档"
e.g. @include "david.dcl"
定义档名称要包含在双引号"中,可以在档名前加上定的目录路径
会先在当前的目录中搜寻该定义档,然后是定义档所在的目录;若有指定档
案的路径,则只会在指定的目录内寻找
不可以参考ACAD.DCL 所定义的对话方块,即不可以使用@include
"acad.dcl"
预视对话方块
若在Visual LISP 中开启一对话方块定义档,即可使用 :
工具 -- 介面工具 -- 预览编辑器DCL
在下拉式列示框中,选取该定义档中所设定的对话方块名称,即可预视对话
方块
亦可直接输入该对话方块的名称(要注意大小写)
第 2 课 <第一篇 基本知识> (第3 节)
注解
// 表示其右边(至该行末端)的文字视为注释
/* */ 包括在两个注解符号中间的所有文字(可跨越多行)均视为注释
语义检核
提供4 个等级的检核,该些检核会在对话框载入时完成;可以将下列语句放在定
义档中的任何位置,但不能在任何对话方块的定义内.
dcl_settings : default_dcl_settings {audit_level = 3;}
等级0 不检查 : 只有在该定义档巳被检核且不会再作修改时使用
等级1 错误 : 找出可能造成AutoCAD 终止的错误,此等级也是预设值
等级2 警告 : 找出配置或行为模式的错误,所有定义在修改后,最少应执行此
等级的检查一次
等级3 提示 : 找出多余的属性定义
对话框的设计
4/58
美观性 颜色配比,元件整齐排列等
方便性 相同功能的项目要编排在一起,或使用线框包围
使用频繁的项目应设置在最显眼及方便的位置
适当设置快速键及预设值(默认值,省缺值)
除非对话框中的项目过多,否则应避免使用巢状(嵌套)式对话
方框
互锁或互换 项目选取(或不选取)时,会否引致其它项目功能的改变
(enable 或disable...等)
第 3 课 <第一篇 基本知识> (第4 节)
对话框定义档内容模式
对话框名称:dialog
{ label="对话框标题" ;
:元件名称
{ 属性名称=属性值;
} //元件定义结束
} //对话框结束
定义说明
1 对话框名称就是由AutoLISP 程式,启动对话框时所呼叫的名称;可以自行设
定,要区分大小写字母
dialog 为对话框中,最外层的元件(即整个对话框),其它的元件均包含在其

一般元件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;
结束
2 开大括号{紧随元件名称之后,以包含该元件的属性或其它元件
label 为属性名称,并以等号=赋以其右边的属性值,最后以分号;结束该行叙

3 包含在对话框中的其它元件
元件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;结束
4 开大括号{紧随元件名称之后,以包含元件的属性或其它元件
包含在元件中的属性,要以等号=赋以其右边的属性值;最后以分号;结束该
行叙述
5 以关大括号}与第4 行的开大括号}对应,以结束该元件(第3 行)之定义
双除号//右边的文字即为注解
6 以关大括号}与第2 行的开大括号}对应,以结束该元件之定义(在本例中为整
个对话框的定义,即第1 行的dialog 元件
5/58
注意:
上例中缩排只为方便观察及维护,不作缩排亦可
包含在对话框中的元件及元件中的属性可以不只一个
第 4 课 <第一篇 基本知识> (第5 节)
练习 (Exercises)
请输入以下的对话框定义,并命名为RECT.DCL(纯文字格式),存在C 盘的根目
录中
RECT:dialog
{ label="Rectangle" ;
:text //文字元件
{ label="Rectangle width :" ; //元件的属性
}
ok_only;
}
定义说明:
1 设定对话框的名称为RECT,紧接一个以冒号开始的元件dialog
2 最左边为dialog 元件的开大括号,右边是其属性label,并以等号设定其属性
值为"Rectangle",以分号结束此行叙述
3 text 为"字串"元件,其作用是在对话框中显示文字,元件名称前要加冒号
4 最左边为text 元件的开大括号,右边是其属性label,并以等号设定其属性值
为"Rectangle width",最后以分号结束此行叙述
5 关大括号是对应第4 行的开大括号,这对大括号同属于第3 行的text 元件
6 ok_only 为一"按钮元件",它的作用是在对话框中显示一个"确定(OK)"按钮;
在一个对话框中,必需提供最少一个"确定"按钮,或一个"取消"按钮(元件名
称为cancel_button),以作为结束对话框之用;本例中不设定按钮之属性,固
不需以冒号放在元件名称的前面,但却需要以分号结束
7 关大括号是对应第2 行的开大括号,这对大括号同属于第1 行的dialog 元件
注意:
虽然定义档巳经完作,但仍要待学习完第2 篇的课程后,才能开启及显示该对话

6/58
第 5 课 <第二篇 开启对话框> (第1 节)
AutoLISP 函数
载入DCL 定义档函数
(LOAD_DIALOG "对话框定义档名称")
e.g. (LOAD_DIALOG "C:/RECT.DCL")
引数是要载入的对话框定义档名称字串(所以要在前后加双引号);若不设定
副档名则预设为.DCL
函数会依资源搜寻路径找寻该定义档;不在搜寻路径中的档案,要在档案名
称前加上指定的路径
函数若成功载入该定义档,会传回一正整数值的档案处理码,供其它函数呼
叫使用;无法载入时则传回负整数值
一般会将传回的档案处理码以SETQ 函数存入变数中
e.g. (SETQ DCL_ID (LOAD_DIALOG "C:/RECT.DCL"))
开启并显示对话框
(NEW_DIALOG "对话框名称" 档案处理码 ["预设动作" [对话框位置]])
e.g. (NEW_DIALOG "RECT" DCL_ID)
对话框名称为字串,要在前后加双引号;要注意一个定义档中,可包含多个对
话框名称及其定义
档案处理码是经由LOAD_DIALOG 函数取得
预设动作为字串表示式;函数可以不加预设动作,或以空字串""表示
如果要设定对话框显示时的位置,则必须同时设定预设动作
对话框位置为2D 的点串列,指定对话框左上角的X,Y 座标
如果以 '(-1 -1)为对话框位置,则会在绘图萤幕的中心点开启对话框
如果成功开启对话框,函数会传回T,否则传回NIL
开始接受使用者输入
(START_DIALOG)
函数不须提供任何引数
使前一个用NEW_DIALOG 函数开启的对话框开始作用,直至动作表示式或回复
函数呼叫DONE_DIALOG 函数为止
一般DONE_DIALOG 与关键字accept(一般是按下确定按钮)或关键字
cancel(一般是按下取消按钮)相关
若传回值为1,表示使用者按下确定钮结束对话框;0 表示按下取消钮;-1 表示
全部对话框都以TERM_DIALOG 函数终止;大于1 的整数,其意义由应用程式决
7/58

释放(卸载)对话框
(UNLOAD_DIALOG "档案处理码")
e.g. (UNLOAD_DIALOG DCL_ID)
从记忆体释放档案处理码(经由LOAD_DIALOG 函数取得)指定的对话框定义档
函数传回值一定是NIL
第 6 课 <第二篇 开启对话框> (第2 节)
对话框开启方式
(DEFUN C:函数名称( ) (SETQ 变数 (LOAD_DIALOG "对话框定义档"))
(NEW_DIALOG "对话框名称" 变数)
(START_DIALOG) (UNLOAD_DIALOG 变数)
)
程式说明:
1 以DEFUN 函数定义程式的名称,使用LOAD_DIALOG 函数载入指定的对话框定
义档
使用SETQ 函数,将LOAD_DIALOG 传回的档案处理码存入变数中,以方便其它
函数使用
2 使用NEW_DIALOG,开启及显示定义档中(档案处理码),指定的对话框
3 使用START_DIALOG 函数,使对话框开始作用并接受使用者输入
使用UNLOAD_DIALOG 函数以结束对话框
4 关括号是对应第1 行DEFUN 函数左边的开括号,结束整个程式
练习 (Exercises)
编写一AutoLISP 程式,以开启上一课所定义的对话框;并将该程式命名为
RECT.LSP,存在C 盘的根目录中,程式码如下 :
(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT.DCL"))
(NEW_DIALOG "RECT" DCL_ID)
(START_DIALOG) (UNLOAD_DIALOG DCL_ID)
)
程式说明:
8/58
1 以DEFUN 函数定义程式的名称为RECT,使用LOAD_DIALOG 函数将对话框定义
档RECT.DCL 载入;使用SETQ 函数,将LOAD_DIALOG 传回的档案处理码存入变
数DCL_ID 中,以方便其它函数使用
2 使用NEW_DIALOG,开启及显示定义档中(档案处理码)名称为RECT 的对话框
3 使用START_DIALOG 函数,使对话框开始作用并接受使用者输入(在本例中只
有确定钮可按);使用UNLOAD_DIALOG 函数以结束对话框
4 关括号是对应第1 行DEFUN 函数左边的开括号,结束整个程式
第 7 课 <第二篇 开启对话框> (第3 节)
编辑框元件(edit_box)
可供使用者直接输入字串的矩形方框;注意在编辑框中所显示及输入的资料均为
字串型态,而数字则要在取得编辑框的字串内容后(在下一篇中介绍),使用
AutoLISP 函数将其转为数值型态的资料
:edit_box //元件名称
{ 属性="属性值" ;
}
属性
label 显示在编辑框前面(左边)的提示文字
key 其属性值即为使用该元件的关键字,使在AutoLISP 程式中操控
此元件;在同一个对话框定义中,不能有相同名称的关键字定义
edit_limit 指定在编辑框中,可输入字串的最大字元长度
edit_width 指定编辑框显示时的阔度(通常与fixed_width 属性一拼使用)
value 指定编辑框显示时,当中的预设值(注意显示数值资料时,要先用
AutoLISP 函数将资料(或变数)转为字串型态)
fixed_width 通常与width 属性一拼使用,以固定编辑框显示时的阔度(其属
性值可设定为true 或false)
is_enable 可设定编辑框是否可以使用(其属性值可设定为true 或false,
预设值为true)
alignment 如果元件成水平方向排列,属性值可设定为left,right 或
centered
9/58
如果元件成垂直方向排列,属性值可设定为top,bottom 或
centered
(水平方向的预设值为left,垂直方向则为centered)
其它属性
action allow_accept fixed_height height
is_tab_stop mnemonic width
第 8 课 <第二篇 开启对话框> (第4 节)
练习(Exercises)
将上一课的RECT.DCL 对话框定义档复制至RECT1.DCL,开启新的定义档并作
如下的修改,使其可以输入四边形的阔度及高度;将AutoLISP 程式档RECT.LSP
复制至RECT1.LSP,开启新的程式档,并将要载入的对话框定义档改为RECT1(程
式第1 行);完成后即可载入及执行新的程式档
RECT:dialog
{ label="Rectangle" ;
:edit_box //编辑框元件
{ label="Rectangle width : " ;
key="RECT_W" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
}
:edit_box //编辑框元件
{ label="Rectangle heigth :" ;
key="RECT_H" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
}
ok_only;
}
定义说明:
1 设定对话框的名称为RECT,紧接一个以冒号开始的元件dialog
2 最左边为dialog 元件的开大括号,右边是其属性label,并以等号设定其属性
值为 "Rectangle",以分号结束此行叙述
3 edit_box 为"编辑框"元件,元件名称前要加冒号
4 最左边为edit_box 元件的开大括号,右边是其属性label,并以等号设定其属
性值为 "Rectangle width : ",最后以分号结束此行叙述
10/58
5 设定属性key 的属性值为RECT_W(即设定此编辑框的名称)
6 设定属性edit_limit 的属性值为16(即最多可以在编辑框中输入16 个数字)
7 设定属性edit_width 的属性值为10(编辑框只会显示10 个字的长度)
8 设定属性fixed_width 的属性值为true,表示表将编辑框以固定的阔度显示
9 关大括号是对应第4 行的开大括号,这一对大括号同属于第3 行的edit_box
元件
10 至16 与3 至9 行相似,设定另一个编辑框以输入高度的资料;只有属性label
及key 的属性值不同
17 以ok_only 元件,在对话框中显示一个确定(OK)按钮,作为结束对话框之用
18 关大括号是对应第2 行的开大括号,这一对大括号同属于第1 行的dialog 元

注意
1 在第一个编辑框(输入四边形的阔度)的label 属性值中,在字串最后的冒号
后面,加多了一个空格,目的是方更与下一个编辑框对齐
第 9 课 <第三篇 设定及取得对话框元件内的值> (第1 节)
AutoLISP 函数
设定元件的值
(SET_TILE "元件关键字" 设定值)
e.g. (SET_TILE "RECT_W" "50.0")
元件的初始值可在定义档中以属性value 设定,但在程式档中则以此函数设

元件关键字即是在对话框定义档中,以元件属性key 所定义的属性值,以赋予
该元件一个操作名称
元件关键字是有区分大小写的
此函数要在START_DIALOG 函数之后才能使用
取得元件的值
11/58
(GET_TILE "元件关键字")
e.g. (GET_TILE "RECT_W")
作用是在AutoLISP 程式档中取得元件(以关键字指定)的设定值
元件关键字的说明与SET_TILE 函数相同
此函数要在DONE_DIALOG 函数之前使用(即要在对话框结束前使用)
设定元件的状态
(MODE_TILE "元件关键字" 状态模式)
e.g. (MODE_TILE "RECT_W" 0)
作用是在AutoLISP 程式档中设定元件(以关键字指定)的使用状态,其状态模
式可以设定为下列任一整数值 :
0 使指定的元件成为使用状态
1 使指定的元件成为禁用状态(元件以灰色显示)
2 使指定的元件成为焦点
3 选取指定编辑框元件的内容
4 图像高亮度显示的开关
元件关键字的说明与SET_TILE 函数相同
第 10 课 <第三篇 设定及取得对话框元件内的值> (第2 节)
练习 (Exercises)
以修改对话框定义档的方式,设定输入阔度的编辑框其初始值为50,输入高
度的编辑框其初始值为25
定义档 将RECT1.DCL 复制至RECT2.DCL,在关键字为RECT_W 的元件中,加入
value 属性并设定其初始值为50;在关键字为RECT_H 的元件中,加入
value 属性并设定其初始值为25
程式档 将RECT1.LSP 复制至RECT2.LSP,只须修改其载入的定义档名称为
RECT2.DCL 即可;完成后存档,进入AutoCAD 并载入RECT2.LSP 程式
档,执行RECT2 程式
RECT:dialog
{ label="Rectangle" ;
:edit_box
12/58
{ "Rectangle width : " ;
key="RECT_W" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="50.0" //注意设定值为字串型态,要在前后
加双引号
}
:edit_box
{ "Rectangle height :" ;
key="RECT_H" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="25.0" //注意设定值为字串型态,要在前后
加双引号
}
}
第 11 课 <第三篇 设定及取得对话框元件内的值> (第3 节)
练习 (Exercises)
以修改AutoLISP 程式档的方式,使输入阔度的编辑框其初始值为50,输入高
度的编辑框其初始值为25
定义档 将RECT1.DCL(不是RECT2.DCL)复制至RECT3.DCL,不作任何修改
程式档 将RECT1.LSP 复制至RECT3.LSP,程式码如下:
(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT3.DCL"))
(NEW_DIALOG "RECT" DCL_ID)
(SET_TILE "RECT_W" "50.0")
(SET_TILE "RECT_H" "25.0")
(START_DIALOG)(UNLOAD_DIALOG DCL_ID)
)
程式说明:
1 以DEFUN 函数定义程式的名称RECT,使用LOAD_DIALOG 函数将对话框定义档
RECT3.DCL 载入;使用SETQ 函数,将LOAD_DIALOG 传回的档案处理码存入变数
DCL_ID 中,以方便其它函数使用
2 使用NEW_DIALOG,开启及显示定义档中(档案处理码)名称为RECT 的对话框
13/58
3,4 使用SET_TILE 函数,设定输入阔度的编辑框元件RECT_W(元件关键字,在定义
档中key 设定的属性值)为50,设定输入高度的编辑框元件RECT_H 为25
5 使用START_DIALOG 函数,使对话框开始作用并接受使用者输入(在本例中只
有确定钮可按);使用UNLOAD_DIALOG 函数以结束对话框
6 关括号是对应第1 行DEFUN 函数左边的开括号,结束整个程式
第 12 课 <第三篇 设定及取得对话框元件内的值> (第4 节)
AutoLISP 函数
元件指定动作
(ACTION_TILE "元件关键字" "指定动作")
e.g. (ACTION_TILE "RECT_W" "(SETQ TEMP 1)")
当焦点在指定的元件(关键字)上并按下接受键时,即会执行函数所指定的动

指定动作会取代定义档中,该元件的action 属性之预设动作
元件关键字"accept"在预设情况下是与确定按钮元件关连(即是确定按钮的
预设关键字),"cancel"则与取消按钮元件关连(即是取消按钮的预设关键
字)
终止对话框
(DONE_DIALOG [指定传回值])
e.g. (DONE_DIALOG)
此函数的传回值为一个2D 点串列座标,为结束对话框时,对话框的所在位置;
可作为下次启动同一个对话框的位置引数,使对话框在之前结束时的位置再
次显现
练习 (Exercises)
将定义档RECT3.DCL 复制至RECT4.DCL,但不作任何修改.将程式档
14/58
RECT3.LSP 复制至RECT4.LSP,并修改为 : 使用ACTION_TILE 函数,指定在按
下确定钮时,执行一辅助程式;在该辅助程式中,使用GET_TILE 函数最得对话
框中四边形的阔度及高度,并在使用者选取的位置上绘画出四边形.
(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT4.DCL"))
(NEW_DIALOG "RECT" DCL_ID)
(SET_TILE "RECT_W" "50.0")
(SET_TILE "RECT_H" "25.0")
(ACTION_TILE "accept" "(S_RECT)(DONE_DIALOG)")
(START_DIALOG)(UNLOAD_DIALOG)
(SETQ PT_0 (GETPOINT "\nSelect rectangle lower left
point : "))
(SETQ PT_1 (POLAR PT_0 0 TMP_W)
PT_2 (POLAR PT_1 (/ PI 2) TMP_H)
PT_3 (POLAR PT_2 PI TMP_W))
(COMMAND "PLINE" PT_0 PT_1 PT_2 PT_3 "C")
(PRINC))
(DEFUN S_RECT() (SETQ TMP_W (ABS (ATOF (GET_TILE "RECT_W")))
TMP_H (ABS (ATOF (GET_TILE "RECT_H"))))
)
续下一课 ....
第 13 课 <第三篇 设定及取得对话框元件内的值> (第5 节)
续上一课 ....
主程式(RECT)说明:
1 注意将LOAD_DIALOG 函数所载入的对话框定义档改为RECT4.DCL
2-
4
参阅RECT3 程式的说明
5 使用ACTION_TILE 函数设定关键字为accept 的元件(预设为确定按钮)的指
定动作 : 先执行辅助程式S_RECT,取得输入的资料,再使用DONE_DIALOG 函
数结束对话框
6 参阅RECT3 程式,第5 行的说明
7 使用GETPOINT 函数让使用者选取四边形的左下角位置座标,存入变数PT_0
8 使用POLAR 函数取得新座标点 : 从选取点PT_0 开始,向右(角度为0),距离
为四边形的阔度(变数TMP_W,在辅助程式中取得),存入变数PT_1
9 使用POLAR 函数取得新座标点 : 从上一点PT_1 开始,向上(角度90,等于PI
除2),距离为四边形的高度(变数TMP_H,在辅助程式中取得),存入变数PT_2
15/58
10 使用POLAR 函数取得新座标点 : 从上一点PT_2 开始,向左(角度1800,等于
PI),距离为四边形的阔度(变数TMP_W,在辅助程式中取得),存入变数PT_3;
注意最右边的关括号,是对应第8 行SETQ 函数左边的开括号
11 使用COMMAND 函数执行PLINE 指令,并分别设定四个座标变数,最后以"C"选
项封闭聚合线
12 以一个不带参数的PRINC 函数,抑制多余的显示及传回值;最右边的关括号是
对应第1 行DEFUN 函数左边的开括号
辅助程式(S_RECT)说明:
1 设定函数名称;使用GET_TILE 函数取得指定关键字(RECT_W,代表输入阔度的
编辑框元件)的值,并将该值使用ATOF 函数由字串型态转为实数型态(有小
数);再使用ABS 函数取得实数的绝对值,以防止使用者输入负数;最后将资料
存入变数TMP_W
2 使用GET_TILE 函数取得指定关键字(RECT_H,代表输入高度的编辑框元件)的
值,转型及取得绝对值后,存入变数TMP_H
3 用一个关括号,对应第1 行DEFUN 函数左的开括号
第 14 课 <第四篇 按钮及核取框(切换钮)> (第1 节)
按钮元件(button)
一个矩形的按钮,可显示指定的讯息在按钮上
:button //元件名称
{ 属性="属性值" ;
}
属性
label 显示在按钮中的提示文字
key 其属性值即为使用该按钮元件的关键字
width 指定按钮的显示阔度
height 指定按钮的显示高度
fixed_width 通常与width 属性一并使用,以固定按钮的显示阔度
fixed_height 通常与height 属性一并使用,以固定按钮的显示高度
16/58
is_enable 可设定按钮是否可以使用,其属性值可设定为true(可使用)或
false(禁用,按钮中的讯息文字变为灰色显示),预设值为true
is_default 属性值可设定为true 或false;当使用者按下接受键(大部份的
情况,ENTER 被用作接受键)时,本属性设定为true 的元件会自动
被选取.当使用者在allow_accept 属性设为true 的编辑框,列表
框或图像按钮中.按下接受键或双击滑鼠键(只对列表框及图像
按钮有效)时,本属性设定为true 的元件亦会自动被选取
alignment 如果元件成水平方向排列,属性值可设定为left,right 或
centered(若不设定则预设为left);如果元件成垂直方向排列,
属性值可设定为top,bottom 或centered(若不设定则预设为
centered)
其它属性
action is_cancel is_tab_top mnemonic
第 15 课 <第四篇 按钮及核取框(切换钮)> (第2 节)
核取框(切换钮)元件(toggle)
是一个启用或关闭的切换方框,当方框中没有剔勾符号时,表示该功能为关闭状
态,其元件的值为0;当方框中有剔勾符号时,表示该功能为启用状态,其元件的
值为1
:toggle //元件名称
{ 属性="属性值" ;
}
属性
label 显示在切换钮后面(右边)的提示文字
key 其属性值即为使用该按钮元件的关键字
is_enable 可设定切换钮是否可以使用,其属性值可设定为true(可使用)或
false(禁用),预设值为true
value 方框中没有剔勾符号时,表示该功能为关闭状态,其元件的值为
0(亦是预设值);相反则为启用状态,元件的值为1
alignment 如果元件成水平方向排列,属性值可设定为left,right 或
centered(若不设定则预设为left);如果元件成垂直方向排列,
属性值可设定为top,bottom 或centered(若不设定则预设为
centered)
其它属性
action is_tab_stop width heigth
17/58
fixed_width fixed_heigth
第 16 课 <第四篇 按钮及核取框(切换钮)> (第3 节)
练习 (Exercises)
在四边形的对话框中,增加一核取框,以确定是否在四边形中加上交叉的对
角线;另在对话框的底部增加两个按钮,按下时可使核取框作用或禁用
定义档 将RECT4.DCL 复制至RECT5.DCL,在新的定义档中增加核取框及按钮
定义
RECT:dialog
{ label="Rectangle" ;
:edit_box
{ "Rectangle width : " ;
key="RECT_W" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="50.0"
}
:edit_box
{ "Rectangle height :" ;
key="RECT_H" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="25.0"
}
:toggle //新增的核取框(切换钮)元件
{ label="X line in rectangle" ;
key="RECT_X" ;
}
:button //新增的按钮元件
{ label="&Enable" ;
key="RECT_E" ;
width=10;
fixed_width=true;
}
:button //新增的按钮元件
18/58
{ label="&Disable" ;
key="RECT_D" ;
width=10;
fixed_width=true;
}
ok_only;
}
续下一课 ....
第 17 课 <第四篇 按钮及核取框(切换钮)> (第4 节)
续上一课 ....
定义说明:
第1 至第18 行的定义,与上一课练习RECT4.DCL 定义相同,不再叙述
19 以冒号开始,定义一个切换钮元件
20 切换钮的开大括号,以label 属性定义切换钮右边的讯息文字
21 以key 属性设定切换钮的操作关键字
22 关大括号是对应第20 行的开大括号,此对大括号同属于第19 行的切换钮元

23 以冒号开始,定义一个按钮元件
24 按钮的开大括号,以label 属性定义按钮上显示的讯息文字.注意 : 字串的&
符号,表示设定在该符号右边的一个字母为快捷键;在显示时,&符号不会出
现,但&符号右边的一个字元会以加底线显示
25 以key 属性设定按钮的操作关键字
26 以width 属性设定按钮的阔度,否则按钮会自动加长并占用整列的长度
27 fixed_width 属性设定为true,使按钮以固定的阔度显示
28 关大括号是对应第24 行的开大括号,此对大括号同属于第23 行的按钮元件
29 至34
与上个按钮的定义类似(23 至28 行),但其label 及key 的属性值不

35 定义一个确定按钮,以结束对话框
36 关大括号是对应第2 行的开大括号,此对大括号同属于第1 行的dialog 元件
续下一课 ....
第 18 课 <第四篇 按钮及核取框(切换钮)> (第5 节)
续上一课 ....
19/58
程式档 将RECT4.LSP 复制至RECT5.LSP,其程式码如下:
(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT5.DCL"))
(NEW_DIALOG "RECT" DCL_ID)
(SET_TILE "RECT_W" "50.0")
(SET_TILE "RECT_H" "25.0")
(ACTION_TILE "accept" "(S_RECT)(DONE_DIALOG)")
(ACTION_TILE "RECT_E" "(MODE_TILE \"RECT_X\" 0)") ;设定使
用按钮的动作
(ACTION_TILE "RECT_D" "(MODE_TILE \"RECT_X\" 0)") ;设定禁
用按钮的动作
(START_DIALOG)(UNLOAD_DIALOG)
(SETQ PT_0 (GETPOINT "\nSelect rectangle lower left point : "))
(SETQ PT_1 (POLAR PT_0 0 TMP_W)
PT_2 (POLAR PT_1 (/ PI 2) TMP_H)
PT_3 (POLAR PT_2 PI TMP_W))
(COMMAND "PLINE" PT_0 PT_1 PT_2 PT_3 "C")
(IF (= TMP_X 1) (COMMAND"LINE" PT_0 PT_2 "" "LINE" PT_1 PT_3 ""))
(PRINC))
(DEFUN S_RECT() (SETQ TMP_W (ABS (ATOF (GET_TILE "RECT_W")))
TMP_H (ABS (ATOF (GET_TILE "RECT_H")))
TMP_X (ATOI (GET_TILE "RECT_X"))) ;取得切换钮的状态
)
续下一课 ....
第 19 课 <第四篇 按钮及核取框(切换钮)> (第6 节)
续上一课 ....
主程式(RECT)说明:
1 至5 与程式RECT4.LSP 相同,主要是载入及显示对话框,并设定其中的元件
6 使用ACTION_TILE 函数,设定当按下ENABLE 按钮(关键字为RECT_E)时,所执
行的动作 : 使用MODE_TILE 函数,设定切换钮(关键字为RECT_X)的状态为
0,使其处于作用状态.注意指定的动作为字串型态,前后要加上双引号";而
包含在字串中的双引号,则必须以反斜线加双引号\"表示
7 与第6 行相似,设定按下DISABLE 按钮(关键字为RECT_D)时,将切换钮的状态
设为1,使其处于禁用状态
8 至13 与程式RECT4.LSP 相同,主要是用作绘画出四边形
14 使用IF 函数检查变数TMP_X(在辅助程式中取得,表示切换钮的状态)是否为
20/58
1;若是则以COMMAND 函数,执行两个LINE 指令,绘画出四边形的对角线
15 以一个不带参数的PRINC 函数,抑制多余的显示及传回值;最右边的关括号是
对应第1 行DEFUN 函数左边的开括号
辅助程式(S_RECT)说明:
1,2 大致与RECT4.LSP 的辅助程式相同,都是用以取得编辑框内的资料并存入变
数中
3 使用GET_TILE 函数取得切换钮(关键字为RECT_X)的状态(传回值是字串,"0"
是使用,"1"是禁用),再用ATOI 函数将传回的字串变为整数,存入变数TMP_X,
供主程式第14 行的IF 函数,判断是否需要加上对角线.注意 : 传回值转型
后,结果只会是1 或0,固不须使用ABS 函数取其绝对值
4 关括号与1 行DEFUN 函数左边的开括号对应
第 20 课 <第五篇 横列,直行,空白及文字元件> (第1 节)
横列(row)及直行(column)元件
其实这两个都不算是实体的元件,只是用作指定后续的其它元件的排列格式
指定为横列时,则包含在此元件一对大括号中的所有元件,均作水平左至右
排列;直行时则呈垂直上至下排列
若不指定元件的排列格式时,则预设为直行格式
若有指定其label 属性,则会在外围加上一矩形线框(包含在大括号中间的其
它元件则显示在线框中);其属性值则为该线框左上角的标题文字;若不设定
则没有线框及标题
:row :column
{ 其它元件或属性 { 其它元件或属性
} }
21/58
属性
alignment fixed_height fixed_width height
width label
框列(boxed_row)及框行(boxed_column)元件
不论是否设定其label 属性,均有矩形的线框包含中间的各个元件;若不设定此
属性,则没有标题显示在线框的左上角
:boxed_row :boxed_column
{ 其它元件或属性 { 其它元件或属性
} }
属性 与横列及直行相同
第 21 课 <第五篇 横列,直行,空白及文字元件> (第2 节)
空白(spacer)元件
可在对话框中加入空白元件,使其它元件移位,增加空间,美化对话框等作
用;空白元件有下列3 种
若不设定属性时,则不需在元件名称前加冒号,亦不需一对大括号,但需要在
元件的名称后面加上分号
元件spacer 在不设定其属性时,在垂直方向(直行)为半个字元高度;元件
spacer_1 则一个字元高度
元件spacer_0 在不设定其属性时,其高度为0,但夹在其它横向排列的元件中
时,会自动扩大并与相邻的元件同高同阔
:spacer :spacer_0 :spacer_1
{ 属性=属性值; { 属性=属性值; { 属性=属性值;
} } }
属性
alignment fixed_heigh fixed_width height
width
练习 (Exercises)
在RECT 对话框内,使两个按钮(Enable 及Disable)水平排列在同一横列上,并增
加空间使两按钮置中如下图:
22/58
续下一课 ....
第 22 课 <第五篇 横列,直行,空白及文字元件> (第3 节)
续上一课 ....
定义档 将RECT5.DCL 复制至RECT6.DCL,修改的定义如下:
程式档 将RECT5.LSP 复制至RECT6.LSP,程式中只须修改载入的定义档名称
RECT:dialog
{ label="Rectangle" ;
:edit_box
{ label="Rectangle width : " ;
key="RECT_W" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="50.0"
}
:edit_box
{ label="Rectangle height :" ;
key="RECT_H" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="25.0"
}
:toggle
{ label="X line in rectangle" ;
key="RECT_X" ;
}
:row //新增的横列元件
23/58
{ spacer_0; //开大括号及空间元件
:button
{ label="&Enable" ;
key="RECT_E" ;
width=10;
fixed_width=true;
}
spacer_0; //开大括号及空间元件
:button
{ label="&Disable" ;
key="RECT_D" ;
width=10;
fixed_width=true;
}
spacer_0; //开大括号及空间元件
} //横列的关括号
ok_only;
}
续下一课 ....
第 23 课 <第五篇 横列,直行,空白及文字元件> (第4 节)
续上一课 ....
定义说明:
1 至2 定义对话框名称;定义dialog 元件及其属性
3 至10 定义输入阔度的编辑框(关键字RECT_W)及其属性
11 至18定义输入高度的编辑框(关键字RECT_H)及其属性
19 至22定义切换钮(关键字RECT_X)及其属性
23 定义一个不设属性的横列row 元件
24 横列元件的开大括号,以包含其它的元件;设定空间元件spacer_0,使第一个
按钮左边的空间自动扩阔
25 至30设定按钮(关键字RECT_E)元件及其属性
31 设定空间元件spacer_0,使两个按钮中间的空间自动扩阔
32 至37设定按钮(关键字RECT_D)元件及其属性
38 设定空间元件spacer_0,使第二个按钮右边的空间自动扩阔
39 关大括号是对应第24 行的开大括号,该对大括号同属于第23 行的横列元件;
使包含在中间的两个按钮元件会水平排列显示
40 显示一个确定按钮
41 关大括号是对应第2 行的开大括号,该对大括号同属于第1 行的dialog 元件
24/58
第 24 课 <第五篇 横列,直行,空白及文字元件> (第5 节)
字串元件(text)
在对话框中显示一列文字;在label 属性值的字串中,可以使用以下之特殊符号:
\" 显示双引号
\t 使文字跳至下一个定位点
\n 使文字串换行
\\ 注意这个不是注解符号,它可以在字串中加上反斜线
:text
{ 属性="属性值" ;
}
属性
is_bold 若设定其属性值为true,则文字以粗体显示;若为false 则正常显示
其它属性
alignment fixed_width fixed_height width
height key label value
字串组件(text_part)
其组件的字串形式不同于字串元件text,在组件中的宇串,其边距(margin)为0;
当要将多个组件并合成新字串时,中间不会有多余的空间;组件亦是组成文字段
落元件paragraph 及单列字串组元件concatenation 的元素
:text_part
{ 属性="属性值" ;
}
属性
alignment fixed_width fixed_height width
height label
第 25 课 <第五篇 横列,直行,空白及文字元件> (第6 节)
25/58
文字段落元件(paragraph)
可由上一课的字串元件text 及字串组件text_part 组合而成;一般用于组合静态
(不会动态更改)的文字串
:paragraph
{ 属性="属性值" ; //文字段落元件的属性
:字串元件或字串组件
{ 属性="属性值" ; //字串元件或字串组件的属性
}
}
属性
action alignment fixed_width fixed_height
height width is_cancel is_default
is_enabled is_tab_stop key cabel
mnemonic
拼接文字元件(concatenation)
可由上一课的字串元件text 及字串组件text_part 组合而成;一般用于组合随时
更新的文字串
:concatenation
{ 属性="属性值" ; //拼接文字元件的属性
:字串元件或字串组件
{ 属性="属性值" ; //字串元件或字串组件的属性
}
}
属性
action alignment fixed_width fixed_height
height width is_cancel is_default
is_enabled is_tab_stop key cabel
mnemonic
注意
在上述"文字段落"元件及"拼接文字"元件中,若设定其label 属性,则会以线框
包围其中所组成的文字,而label 属性的设定值会成为线框标题文字
第 26 课 <第六篇 滑杆(滚动条)元件> (第1 节)
26/58
滑杆(滚动条)元件(slider)
使用者可使用滑鼠拖曳滑杆中的方块,或点选滑杆左右两边的箭头,选取在
指定范围内的值
滑杆水平放置时,数值自左向右增加;垂直放置时,数值由底向顶增加
:slider
{ 属性="属性值" ;
}
属性
value 设定滑杆元件的初始值
big_increment 控制滑杆移动时的增量,预设值为整个范围值(min_value 至
max_value)的10 份1
small_increment 控制滑杆移动时的增量,预设值为整个范围值(min_value 至
max_value)的100 份1
max_value 设定滑杆元件范围值的最大值
min_value 设定滑杆元件范围值的最小值
layout
设定滑杆元件是水平放置(horizontal)还是垂直放置
(vertical),预设为水平放置
其它属性
action alignment key mnemonic
fixed_width fixed_height width heigth
label
第 27 课 <第六篇 滑杆(滚动条)元件> (第2 节)
练习 (Exercises)
建立新的对话框定义档PGON.DCL,存在C 盘的根目录中,在对话框顶部有一编辑
框,初始值为10;中间为一滑杆,范围值从1 至20,下边有一讯息文字显示滑杆的
选取值.当移动滑杆时,上边编辑框的内容,及下边的讯息会跟随改变;在更改编
辑框的内容后(按ENTER),滑杆及讯息亦会随之改变
PGON:dialog
{ label="Polygon" ;
:edit_box //编辑框元件
{ label="Polygon edge :" ;
key="PGON_E" ;
edit_limit=2;
27/58
edit_width=2;
fixed_width=true;
value=10;
}
spacer; //空间元件
:slider //滑杆元件
{ key="PGON_S" ;
min_value=1;
max_value=20;
big_increment=2;
small_increment=1;
value=10;
width=25;
fixed_width=true
}
:concatenation //拼接元件
{ :text_part //文字组件
{ label="Drawn a" ;
}
:text_part //文字组件
{ label="10" ;
key="PGON_T" ;
}
:text_part //文字组件
{ label="edge polygon" ;
}
}
ok_only;
}
续下一课 ....
第 28 课 <第六篇 滑杆(滚动条)元件> (第3 节)
续上一课 ....
定义说明:
1 定义对话框名称为PGON,以冒号开始dialog 元件
2 dialog 元件的开大括号;设定其label 属性(对话框标题列)为"Polygon"
3 至10 设定一编辑框,其关键字为PGON_E,并以value 属性设定其初始值为10
11 设定一空间元件spacer,以增加编辑框与下面的滑杆之垂直距离
28/58
12 以冒号开始,设定一滑杆元件slider
13 滑杆元件的开大括号,设定滑杆属性key 的操作关键字为PGON_S
14,15 设定滑杆范围的最小值(属性min_value)为1,最大值(属性max_value)
为20
16,17 设定滑杆的增量,大幅移动(属性big_increment)时为2,小量移动(属性
small_increment)时为1,
18 用属性value 设定滑杆显示的初始值为10
19,20 设定滑杆的阔度(属性width),并以固定的阔度(属性fixed_width)显示
21 关大括号是对应第13 行的开大括号,这对大括号同属于第12 行的滑杆元

22 以冒号开始,设定一拼接文字concatenation 元件
23 属于拼接元件的开大括号;以冒号开始,设定第一个文字组件text_part
24 属于第一个文字组件的开大括号;并以label 属性设定组件所显示的文
字讯息
25 关大括号是对应上一行的开大括号,这对大括号同属于第23 行的文字组

26 以冒号开始,设定第二个文字组件text_part
27 属于第二个文字组件的开大括号;并以label 属性设定组件所显示的初
始文字讯息
28 用key 属性设定此文字组件的操作关键字为PGON_T.注意 : 上一个及下
一个文字组件,因为不需在程式中动态修改其内容,固不需设定其关键字
29 关大括号是对应第27 行的开大括号,这对大括号同属于第26 行的文字组

30 以冒号开始,设定第三个文字组件text_part
31 属于第三个文字组件的开大括号;并以label 属性设定组件所显示的文
字讯息
32 关大括号是对应上一行的开大括号,这对大括号同属于第30 行的文字组

33 关大括号是对应第23 行的开大括号,这对大括号同属于第22 行的拼接文
字concatenation 元件
34 定义一个确定钮
35 最后一行的关大括号是对应第2 行的开大括号,这对大括号同属于第1 行
的dialog 元件
续下一课 ....
第 29 课 <第六篇 滑杆(滚动条)元件> (第4 节)
29/58
续上一课 ....
建立新的程式档PGON.LSP,存在C 盘的根目录;程式码如下:
(DEFUN C:PGON() (SETQ DCL_ID (LOAD_DIALOG "C:/PGON.DCL"))
(NEW_DIALOG "PGON" DCL_ID)
(ACTION_TILE "PGON_E" "(SETQ TMP1 (GET_TILE \"PGON_E\"))
(SET_TILE \"PGON_S\" TMP1)(SET_TILE \"PGON_T\" TMP1)")
(ACTION_TILE "PGON_S" "(SETQ TMP1 (GET_TILE \"PGON_S\"))
(SET_TILE \"PGON_E\" TMP1)(SET_TILE \"PGON_T\" TMP1)")
(ACTION_TILE "accept" "(SETQ TMP (ATOI (GET_TILE
\"PGON_S\")))(DONE_DIALOG)")
(START_DIALOG)(UNLOAD_DIALOG)
(COMMAND "POYLGON" TMP)
(PRINC))
续下一课 ....
第 30 课 <第六篇 滑杆(滚动条)元件> (第5 节)
续上一课 ....
程式说明
1 用DEFUN 函数设定程式名称;用LOAD_DIALOG 函数载入对话框定义档,并将传
回的档案处理码存入变数DCL_ID
2 用NEW_DIALOG 函数将定义档(变数DCL_ID 储存定义档的处理码)中,指定的
对话框(名称为PGON)显示
3 用ACTION_TILE 函数,设定编辑框(关键字PGON_E)的动作(为字串型态) :先
以GET_TILE 函数取得编辑框的输入值,再用SETQ 函数将输入值存入变数
TMP1 里
4 为第3 行ACTION_TILE 中,指定动作的延续,因字串过长而要分行(亦可将此
30/58
行连接于第3 行的末端),使用SET_TILE 函数,将变数TMP1(储存了编辑框的
输入值),设定给滑杆(关键字PGON_S)及文字讯息(关键字PGON_T),以更新元
件的当前值
5 用ACTION_TILE 函数,设定滑杆(关键字PGON_S)的动作(为字串型态) :先以
GET_TILE 函数取得滑杆的设定值,再用SETQ 函数将设定值存入变数TMP1 里
6 为第5 行ACTION_TILE 中,指定动作的延续,因字串过长而要分行(亦可将此
行连接于第5 行的末端),使用SET_TILE 函数,将变数TMP1(储存了滑杆的设
定值),设定给编辑框(关键字PGON_E)及文字讯息(关键字PGON_T),以更新元
件的当前值
7 使用ACTION_TILE 函数设定关键字为accept 的元件(预设为确定钮)的指定
动作 :先以GET_TILE 函数取得滑杆(关键字PGON_S)的设定值,因为传回值为
字串型态,所以要用ATOI 函数转为整数,再用SETQ 函数将该数值存入变数
TMP
8 用START_DIALOG 函数启动对话框并接受使用者输入;以UNLOAD_DIALOG 函数
结束对话框并释放记忆体
9 用COMMAND 函数,执行POLYGON 指令并以变数(滑杆的设定值,在第7 行中取
得)作为封闭多边形的边数
10 以一个不带参数的PRINC 函数,抑制多余的传回值及显示;最右边的关括号,
是对应第1 行DEFUN 函数左边的开括号
注意
程式中并没有对编辑框的输入值进行检查,固可能会发生输入值超出滑杆的范围
值(小于1 或大于20,或有小数位等问题),而产生错误
第 31 课 <第七篇 按钮及影像按钮元件> (第1 节)
自订按钮巳在第4 篇课程中介绍过,在这一篇课程将介绍对话框中,其它有特定
功能的按钮元件如下,其属性亦与自订按钮类似
确定钮(ok_button)(on_only)
在一个对话框中,应最少提供一个确定钮或取消钮,以结束对话框
如果在对话框中,没有规划预设按钮元件,则确定钮会自动成为对话框的预
设按钮
取消钮(cancel_button)
在一个对话框中,应最少提供一个确定钮或取消钮,以结束对话框
此按钮亦可按ESCAPE 键启动
说明钮(help_button)
是一种可按F1 键启动的按钮,用以启动辅助说明
在执行指定动作后,对话框亦不会关闭
31/58
资讯钮(info_button)
一般用以启动版本及版权的说明,或作者资料等
在执行指定动作后,对话框亦不会关闭
预设按钮(default_button)
一般在预设的情况下,确定按钮即为对话框的预设按钮(在预设按钮上,会以
虚线包围按钮的提示文字
要更改其它按钮为预设按钮,可以在定义档中,设定该元件的属性
is_default 为true,要注意在一个对话框中,只能有一个元件为预设按钮
确定钮 + 取消钮(ok_cancel)
确定钮 + 取消钮 + 说明钮(ok_cancel_help)
确定钮 + 取消钮 + 说明钮 + 资讯(ok_cancel_help_info)
第 32 课 <第七篇 按钮及影像按钮元件> (第2 节)
练习 (Exercises)
使用第1 篇课程的RECT.DCL 定义档,并使用第2 篇课程的RECT.LSP 程式档启动
在定义档中,以上一课不同的按钮元件代替定义档中的确定钮元件,即可显示不
同形式按钮的对话框,如下各图:
确定钮(ok_button) 取消钮(cancel_button) 确定钮 + 取消钮(ok_cancel)
确定 + 取消 + 说明 + 资讯
(ok_cancel_help_info>
第 33 课 <第七篇 按钮及影像按钮元件> (第3 节)
影像按钮元件(image_button)
特点是以影像代替按钮中的文字
32/58
:image_button //元件名称
{ 属性="属性值" ;
}
属性
allow_accept 属性值可设定为true 或false;若设定为true,当使用者按下接
受键时,将自动选择预设按钮
aspect_ratio 固定图像的长阔比,其设定值为实数,没有预设值;若设定为0,则
元件将依图像的尺寸显示
color 属性值为整数或保留字,预设值为white(颜色编号7);颜色的设
定值如下:
dialog_line 目前对话框的线条颜色
dialog_foreground 目前对话框的前景颜色(文字)
dialog_background 目前对话框的背景颜色
graphics_backgroundAutoCAD 绘图萤幕目前颜色
black 黑色(颜色编号0)
red 红色(颜色编号1)
yellow 黄色(颜色编号2)
green 绿色(颜色编号3)
cyan 浅蓝色(颜色编号4)
blue 蓝色(颜色编号5)
magenta 紫色(颜色编号6)
white 白色(颜色编号7)
其它属性
action alignment is_enable label
mnemonic fixed_width fixed_height width
height is_tab_stop key
第 34 课 <第七篇 按钮及影像按钮元件> (第4 节)
练习 (Exercises)
建立新的对话框定义档,命名为IMG.DCL,存在C 盘的根目录中;在里面定义两个
不同颜色的影像按钮,及一个确定按钮.
IMG:dialog
{ label="Image" ;
:row //横列元件
{ :image_button //影像按钮元件
{ key="IMG1" ;
33/58
width=6;
height=3;
fixed_width=true;
fixed_height=true;
color=2;
allow_accept=true;
}
:image_button //影像按钮元件
{ key="IMG2" ;
width=6;
height=3;
fixed_width=true;
fixed_height=true;
color=2;
allow_accept=true;
}
}
ok_only
}
续下一课 ....
第 35 课 <第七篇 按钮及影像按钮元件> (第5 节)
续上一课 ....
定义说明:
1 定义对话框名称为IMG,以冒号开始设定dialog 元件
2 开大括号属于第1 行的dialog 元件;设定对话框的属性label(对话框的标
题)
3 以冒号开始,建立一横列row 元件,使当中包含的两个影像按钮呈水平排列
4 开大括号属于上一行的横列元件;以冒号开始,建立一影像按钮
image_button
5 开大括号属于上一行的影像按钮元件;并设定其属性key(操作关键字)为
IMG1
6,7 设定影像按钮的高度(属性height)及阔度(属性width)
8,9 设定影像按钮以固定的高度(属性fixed_height)及固定的阔度(属性
fixed_width)显示
10 设定影像按钮显示黄色(颜色编号2,属性color)
11 设定属性allow_accept 为true,当使用者按下接受键时,等于选择了预设按

34/58
12 关大括号是对应第5 行的开大括号,此对大括号同属于第4 行的影像按钮元

13 至21与第一个影像按钮类似(9 至12 行),都是定义一个影像按钮;但其操作关
键字(key 属性)为IMG2,显示颜色为绿色(color 属性,颜色编号3)
22 关大括号是对应第4 行的开大括号,此对大括号同属于第3 行的横列row 元

23 设定一个确定按钮以结束对话框
24 关大括号是对应第2 行的开大括号,此对大括号同属于第1 行的dialog 元件
续下一课 ....
第 36 课 <第七篇 按钮及影像按钮元件> (第6 节)
续上一课 ....
建立新的程式档IMG.LSP,存在C 盘的根目录中;当使用者选取了对话框中的颜色
按钮后,使用COLOR 指令设定为使用者所选择的颜色.程式码如下:
(DEFUN
C:IMG( )
(SETQ DCL_ID (LOAD_DIALOG "C:/IMG.DCL") TMP 1)
(NEW_DIALOG "IMG" DCL_ID)
(ACTION_TILE "IMG1" "(SETQ TMP 1)")
(ACTION_TILE "IMG2" "(SETQ TMP 0)")
(START_DIALOG)(UNLOAD_DIALOG DCL_ID)
(IF (= TMP 1)(COMMAND "COLOR" "YELLOW")
(COMMAND "COLOR" "GREEN"))
(PRINC))
程式说明:
1 以DEFUN 函数定义程式的名称为IMG,使用LOAD_DIALOG 函数将对话框定义档
IMG.DCL 载入;并将传回的档案处理码,用SETQ 函数存入变数DCL_ID 中;并设
定变数TMP 的初值为1
2 使用NEW_DIALOG 函数显示定义档中(变数DCL_ID 储存了档案处理码),指定
的对话框IMG
3 使用ACTION_TILE 函数,设定第一个影像按钮元件(关键字IMG1)的执行动
作 : 将变数TMP 设定为1
4 使用ACTION_TILE 函数,设定第二个影像按钮元件(关键字IMG2)的执行动
作 : 将变数TMP 设定为0
5 使用START_DIALOG 函数,使对话框开始作用并接受使用者输入;
使用UNLOAD_DIALOG 函数以结束对话框并释放记忆体
6,7 使用IF 函数判断变数TMP 是否等于1;若是则以COMMAND 函数,执行COLOR 指
令,设定目前使用的颜色为黄色,否则设定为绿色
35/58
8 用一个不带参数的PRINC 函数,抑制多余的传回值及显示;最右边的关括号是
对应第1 行DEFUN 函数左边的开括号
第 37 课 <第八篇 清单选框> (第1 节)
清单选框元件(list_box)
因为对话框内的空间有限,当有很多同类的项目可供选取时,即可使用此元件;若
选框内的项目多于选框的高度时,选框的右边会出现卷轴,使选框内的选项可以
上下卷动.
:list_box //元件名称
{ 属性="属性值" ;
}
属性
label 其设定值为字串,会显示在选框的左上角
list 其设定值为字串,其内容即为选框中的项目;字串中每个项
目需以\n 换行符号分隔,例如 : "幕墙\n 梗窗\n 趟窗\n 趟
门\n 百页窗"
选框中的项目,亦可使用AutoLISP 程式动态设定,见本篇的
范例
multiples_select 可设定为true 或false;若设定为true,则使用者可以同时
在选框中选取多个项目
value 设定选框显示时,预设选取项目的索引值(为字串型态);选
框中第一个选项,其索引值为0,其它依次递增
其它属性
action alignment allow_accept key
mnemonic width height fixed_width
fixed_heigth tabs is_enable is_tab_stop
36/58
第 38 课 <第八篇 清单选框> (第2 节)
AutoLISP 函数
开始处理清单选框或弹出式选框
(START_LIST "元件关键字" [选项 [索引值]] )
e.g. (START_LIST "LBOX_L" 3 0)
元件关键字是在元件定义中,以属性key 设定的属性值
选项为一运作模式整数,其设定值如下:
1 变更指定索引值的项目
2 附加新的项目
3 删除旧的项目并建立新的项目(预设值)
指定后续ADD_LIST 函数所变更的项目之索引值;索引值为整数,并从0(表示
选框中第一个项目)开始
若不指定索引值,函数会拒绝处理变更项目的操作
结束选框的处理
(END_LIST)
不须提供任何参数;与上述的START_LIST 函数一并使用
加入或修改选框中的项目
(ADD_LIST "字串")
e.g. (ADD_LIST "幕墙")
使用此函数之前,必须先以START_LIST 函数开启所要操作的元件(关键字)
函数会将字串加入至指定的选框元件中
第 39 课 <第八篇 清单选框> (第3 节)
练习 (Exercises)
这是一个较为复杂的对话框设计,但亦是一个非常实用的程式;在对话框定义档
中,有一个清单选框,会显示出指定档案的内容(全是中文字);当使用者选取清单
中的项目时,该项目的中文字便会显示在下面的编辑框里(加在原有字串的后面);
当按下确定钮时,对话框结束,并使用TEXT 指令将编辑框内的文字插入至绘图萤
幕上.
37/58
注意 : 程式另须建立一纯文字档(名称为TEXT1.TXT,存在C 盘根目录),其内容
可自订一些常用的中文字,每行文字不宜过长;而每行文字即成为选框中的一个
项目;在插入中文字之前,必须先行设定中文字的样式.
建立新的对话框定义档LBOX.DCL,存在C 盘的根目录中,其定义如下:
LBOX:dialog
{ label="Create chinese" ;
:list_box //清单选框元件
{ label="中文字" ;
key="LBOX_L" ;
width=25;
height=8;
fixed_width=true;
fixed_height=true;
}
:edit_box //编辑框元件
{ label="中文字" ;
key="LOBX_E" ;
width=25;
fixed_width=true;
}
ok_cancel
}
续下一课 ....
第 40 课 <第八篇 清单选框> (第4 节)
续上一课 ....
定义说明:
1 定义对话框名称为LBOX,以冒号开始设定dialog 元件
2 开大括号属于上一行的dialog 元件,属性label 的设定值会显示在对话框的
标题列
3 以冒号开始,设定一个清单选框list_box 元件
4 开大括号属于上一行的清单选框元件,其属性label 的设定值会显示在选框
的左上角
5 以key 属性设定清单选框元件的操作关键字为LBOX_L
6,7 设定清单选框元件的阔度(属性width)及高度(属性height)
8,9 设定清单选框元件以固定的阔度(属性fixed_width)及固定的高度(属性
38/58
fixed_height)显示
10 关大括号是对应第4 行的开大括号,此对大括号同属于第3 行的清单选框元

11 以冒号开始,设定一个编辑框元件
12 开大括号属于上一行的编辑框元件,属性label 的设定值会显示在编辑框的
左边
13 以key 属性设定编辑框元件的操作关键字为LBOX_E
14 以width 属性设定编辑框元件的阔度
15 将fixed_width 属性设定为true,使编辑框以固定的阔度显示
16 关大括号是对应第12 行的开大括号,此对大括号同属于第11 行的编辑框元

17 在对话框的底部设定一确定钮及取消钮,以结束对话框
18 关大括号是对应第2 行的开大括号,此对大括号同属于第1 行的dialog 元件
续下一课 ....
第 41 课 <第八篇 清单选框> (第5 节)
续上一课 ....
建立新的程式档LBOX.LSP,存在C 盘的根目录中,其中包含一个主程式和两个辅
助程式.主程式的程式码如下:
(DEFUN C:LBOX () (SETQ DCL_ID (LOAD_DIALOG "C:/LBOX.DCL") CHK 0)
(NEW_DIALOG "LBOX" DCL_ID)
(ADDL)
(ACTION_TILE "LBOX_L" "(SETQ TMP_R (ATOI (GET_TILE \"LBOX_L\")))(SETC)")
(ACTION_TILE "accept" "(SETQ CHK 1
TMP_S (GET_TILE \"LBOX_E\"))(DONE_DIALOG)")
(START_DIALOG) (UNLOAD_DIALOG DCL_ID)
(IF (= CHK 1)
(COMMAND "TEXT" (GETPOINT \"Select text insert point :")
"0" TMP_S)
)
(PRINC))
主程式(LBOX)说明:
1 用DEFUN 函数设定程式名称为LOBX;用LOAD_DIALOG 函数载入指定的对话框
定义档,并将传回的档案处理码存入变数DCL_ID;设定另一变数CHK 为0,此
变数用于决定使用者是否按下确定钮
2 用NEW_DIALOG 函数,显示指定档案(变数DCL_ID 储存定义档的处理码)里的
39/58
LBOX 对话框
3 执行ADDL 辅助程式(作用是开启并读取档案中的各行字串,并加进清单选框
中)
4 用ACTION_TILE 函数,设定选取清单选框元件(关键字LBOX_L)中项目的指定
动作 :先以GET_TILE 函数取得清单中的选项之索引号(字串型态),用ATOI
函数转为整数型态,再用SETQ 函数存入变数TMP_R;最后执行SETC 辅助程式
(取得档案中对应行号的字串,并显示在编辑框中)
5 用ACTION_TILE 函数,设定关键字"accept"的元件(预设为确定钮)的动作 :
先用SETQ 函数,设定变数CHK 为1(在结束对话框后建立文字)
6 为第5 行ACTION_TILE 函数的延续 : 用GET_TILE 函数取得编辑框(关键字
LBOX_E)的内容,存入变数TMP_S;再以DONE_DIALOG 函数结束对话框
7 用START_DIALOG 函数启动对话框并开始接受使用者输入;以UNLOAD_DIALOG
函数结束对话框并释放记忆体
8 用IF 函数检查变数CHK 是否等于1(使用者按下确定钮,在第5 行设定);若变
数等于1,执行下一行的指令
9 用COMMAND 函数,执行TEXT 指令其插入点以GETPOINT 函数取得;文字的角度
为0,字串为变数TMP_S(在第6 行的确定按钮动作中取得)
10 关括号是关闭第8 行的IF 函数
11 以一个不带参数的PRINC 函数,抑制多余的传回值及显示;最右边的关括号,
是对应第1 行DEFUN 函数左边的开括号
续下一课 ....
第 42 课 <第八篇 清单选框> (第6 节)
续上一课 ....
辅助程式ADDL 的程式码如下:
(DEFUN ADDL() (SETQ F_ID (OPEN "C:/TEXT1.TXT" "r"))
(SETQ TMP_T (READ-LINE F_ID) TMP_L (LIST ""))
(WHILE (/= TMP_T NIL)
(SETQ TMP_L (APPEND TMP_L (LIST TMP_T)))
(SETQ TMP_L (READ-LINE F_ID))
)
(CLOSE F_ID)
(SETQ TMP_L (LIST (CDR TMP_L)))
(START_LIST "LBOX_L" 3 0)
(MAPCAR 'ADD_LIST (CAR TMP_L))
(END_LIST))
辅助程式(ADDL)说明:
40/58
1 用DEFUN 函数设定程式名称为ADDL;用OPEN 函数开启指定的纯文字档,开启
模式为"r"(读取),将传回的档案处理码,用SETQ 函数存入变数F_ID
2 用READ-LINE 函数读取档案(变数F_ID 储存的档案处理码)里,第1 行的字串,
存入变数TMP_T;再将一空的串列,存入变数TMP_L
3 以WHILE 函数设定回圈的开始;进入回圈的条件为变数TMP_T(从档案中读取
的字串)不等于NIL(空值)
4 将变数TMP_T(字串),用APPEND 函数,加在第2 行所建立的空串列之后;将新
串列存回变数TMP_L 中,即以新串列(巳增加新的字串元素)覆盖原有串列
5 使用READ-LINE 函数,从档案中(变数F_ID)读取下一行的字串,存入变数
TMP_T 中并覆盖原值
6 关括号是对应第3 行WHILE 函数左边的开括号,以封闭回圈;回圈会不断执
行,直至读取档案中所有字串;并将巳读取的字串不断加进变数TMP_L 的串列

7 用CLOSE 函数,将指定档案处理码(变数F_ID)的档案关闭
8 用CDR 函数,删去串列(变数TMP_L)中第一个元素(空字串);并将余下的元素
存回变数TMP_L 覆盖原值
9 用START_LIST 函数开始处理指定选框元件(关键字LBOX_L);选项参数3 表示
删除旧选框中的项目并建立新的选框项目;最后的项目索引值为0,表示选框
中第一个项目
10 使用MAPCAR 函数,使串列(变数TMP_L)中逐个元素,代入ADD_LIST 函数中,
作为项目加入选框中
11 以END_LIST 函数结束清单选框元件的处理;最右边的关括号是对应第1 行
DEFUN 函数左边的开括号
续下一课 ....
第 43 课 <第八篇 清单选框> (第7 节)
续上一课 ....
辅助程式SETC 的程式码如下:
(DEFUN SETC() (SETQ F_ID (OPEN "C:/TEXT1.TXT" "r"))
(IF (> TMP_R 0)
(REPEAT TMP_R (READ-LINE F_ID)))
(SETQ TMP_S (GET_TILE "LBOX_E"))
(SETQ TMP_S (STRCAT TMP_S (READ-LINE F_ID)))
(CLOSE F_ID)
(SET_TILE "LBOX_E" TMP_S))
辅助程式(SETC)说明:
1 用DEFUN 函数设定程式名称为SETC;用OPEN 函数开启指定的纯文字档,开启
模式为"r"(读取),将传回的档案处理码,用SETQ 函数存入变数F_ID
41/58
2 用IF 函数检查变数TMP_R 是否大于0;若是(表示不是选取了第一个项目)则
执行第3 行的叙述.注意 : 变数TMP_R 是在主程式第4 行中取得的选框索引
值,该值表示选取了选框中第几个项目,项目索引号0 表示第一个项目,其它
依次递增
3 用REPEAT 函数,使其后的READ-LINE 函数重复执行TMP_R 次,直至读取字串
至所选项目的对上一行 (因为项目索引号从0 开始;例如选取第5 个项
目,REPEAT 函数便会重复5 次,读取档案中0 至4 行的字串)
4 使用GET_TILE 函数,取得编辑框元件(关键字LBOX_E)目前的内容,存入变数
TMP_S
5 使用READ-LINE 函数,读取档案中的字串(在第3 行中,巳使用REPEAT 函数,
读取至所选项目的对上一行,再使用此函数读取下一行时,即为所选的项
目),并用STRCAT 函数与变数TMP_S(在上一行中取得的编辑框内容)合拼为新
字串,存回变数TMP_S 中并覆盖原字串
5 使用CLOSE 函数,将指定的档案(变数F_ID 为该档案的处理码)关闭
5 使用SET_TILE 函数,更新编辑框(关键字LBOX_E)的内容为新合拼的字串(在
第5 行中取得).最右边的关括号,是对应第1 行DEFUN 函数左的开括号
提示 :
如要在显示选框时,设定其中一个项目为预选项目
(该项目会反白显示),即可在主程式第3 及第4 行中
间,加入一行如下的叙述:
(SET_TILE "LBOX_L" "索引号")
此叙述使用SET_TILE 函数,并设定元件(关键字)的
索引号.注意索引号为字串型态,要在前后加上双引
号;选框中第1 个项目其索引号为0,其它依次递增
第 44 课 <第九篇 下拉(弹出)式清单选框> (第1 节)
下拉式(弹出式)清单选框元件(popup_list)
与上一篇课程的清单选框类似,但在一般情况下,只会显示选框中一个选项;若要
显示巳隐藏的整个选框,只要将滑鼠移至元件右边的"向下"箭头,并按滑鼠左键,
即会出现整个选框
:popup_list //元件名称
{ 属性="属性值" ;
}
42/58
属性
label 其设定值为字串,会显示在选框的左上角
list 其设定值为字串,其内容即为选框中的项目;字串中每个项
目需以\n 换行符号分隔,例如 : "幕墙\n 梗窗\n 趟窗\n 趟
门\n 百页窗"
选框中的项目,亦可使用AutoLISP 程式动态设定,见上一篇
课程的函数介绍及练习
value 设定选框显示时,预设选取项目的索引值(为字串型态);选
框中第一个选项,其索引值为0,其它依次递增
其它属性
action alignment key mnemonic
is_tab_stop width height fixed_width
fixed_heigth tabs is_enable edit_width
第 44 课 <第九篇 下拉(弹出)式清单选框> (第1 节)
下拉式(弹出式)清单选框元件(popup_list)
与上一篇课程的清单选框类似,但在一般情况下,只会显示选框中一个选项;若要
显示巳隐藏的整个选框,只要将滑鼠移至元件右边的"向下"箭头,并按滑鼠左键,
即会出现整个选框
:popup_list //元件名称
{ 属性="属性值" ;
}
属性
label 其设定值为字串,会显示在选框的左上角
list 其设定值为字串,其内容即为选框中的项目;字串中每个项
目需以\n 换行符号分隔,例如 : "幕墙\n 梗窗\n 趟窗\n 趟
门\n 百页窗"
选框中的项目,亦可使用AutoLISP 程式动态设定,见上一篇
课程的函数介绍及练习
value 设定选框显示时,预设选取项目的索引值(为字串型态);选
框中第一个选项,其索引值为0,其它依次递增
其它属性
action alignment key mnemonic
is_tab_stop width height fixed_width
43/58
fixed_heigth tabs is_enable edit_width
第 45 课 <第九篇 下拉(弹出)式清单选框> (第2 节)
练习 (Exercises)
首先在C 盘的根目录中,再增加一个纯文字档TEXT2.TXT,并自订其内容.
在上一篇课程练习的对话框顶部,增加一个下拉式清单选框;其中的选项为两个
文字档的主题,当使用者在选取了项目(档案的主题)后,下面原有的清单选框,即
会显示该主题(档案)的选项
复制对话框定义档LBOX.DCL 至LBOX1.DCL,在里面增加下拉式清单选框元件如
下 :
LBOX:dialog
{ label="Create chinese" ;
:popup_list //下拉式清单选框元件
{ label="中文主题" ;
key="LBOX_T" ;
width=25;
fixed_width=true;
list="玻璃门窗\n 五金配件" ;
}
:list_box //清单选框元件
{ label="中文字" ;
key="LBOX_L" ;
width=25;
height=8;
fixed_width=true;
fixed_height=true;
}
:edit_box //编辑框元件
{ label="中文字" ;
key="LOBX_E" ;
width=25;
fixed_width=true;
}
ok_cancel
}
定义说明:
44/58
1 定义对话框名称为LBOX,以冒号开始设定dialog 元件
2 开大括号属于上一行的dialog 元件,属性label 的设定值会显示在对话框的
标题列
3 以冒号开始,设定一个下拉式清单选框popup_list 元件
4 开大括号属于上一行的下拉式清单选框元件,其属性label 的设定值会显示
在选框的左边
5 以key 属性设定下拉式清单选框元件的操作关键字为LBOX_T
6,7 设定下拉式清单选框元件的阔度(属性width)并以固定的阔度显示(属性
fixed_width)
8 以list 属性设定元件中的各个选项;设定值为字串型态,每个选项间要以换
行符号\n 分隔
9 关大括号是对应第4 行的开大括号,此对大括号同属于第3 行的下拉式清单
选框元件
其余各行为设定清单选框元件,编辑框元件及确定取消钮,与原有的定义相同,不
再叙述.
续下一课 ....
第 46 课 <第九篇 下拉(弹出)式清单选框> (第3 节)
续上一课 ....
将程式档LBOX.LSP 复制至LBOX1.LSP,其主程式码如下:
(DEFUN C:LBOX () (SETQ DCL_ID (LOAD_DIALOG "C:/LBOX.DCL") CHK 0)
(NEW_DIALOG "LBOX" DCL_ID)
(ADDL)
(ACTION_TILE "LBOX_T" "(ADDL)") //新增的下拉式选框元件
动作
(ACTION_TILE "LBOX_L" "(SETQ TMP_R (ATOI (GET_TILE \"LBOX_L\")))(SETC)")
(ACTION_TILE "accept" "(SETQ CHK 1
TMP_S (GET_TILE \"LBOX_E\"))(DONE_DIALOG)")
(START_DIALOG) (UNLOAD_DIALOG DCL_ID)
(IF (= CHK 1)
(COMMAND "TEXT" (GETPOINT \"Select text insert point :")
"0" TMP_S)
)
(PRINC))
主程式(LBOX)说明:
45/58
1 至3 设定程式名称,载入及显示对话框定义档,执行辅助程式ADDL,以设定选
框内的选项;因为变数CHK 的初始值为0,所以会显示TEXT1.TXT 档案的
内容
4 在原程式第3 第4 行中间插入,以ACTION_TILE 函数,设定下拉式选框元
件(关键字LBOX_T)的动作 : 执行辅助程式ADDL,重新设定选框中的选

5 至7 设定选框元件(关键字LBOX_L)及确定钮的动作
8 用START_DIALOG 函数启动对话框并开始接受使用者输入;以
UNLOAD_DIALOG 函数结束对话框并释放记忆体
9 至12 当使用者按下确定钮时,便在绘图萤幕上插入巳选取的文字,结束程式
续下一课 ....
第 47 课 <第九篇 下拉(弹出)式清单选框> (第4 节)
续上一课 ....
辅助程式ADDL 的程式码如下:
(DEFUN ADDL()
(IF (= (GET_TILE "LBOX_T") "0") ;检查
选择了的主题
(SETQ F_ID (OPEN "C:/TEXT1.TXT" "r")) ;
开启档案
(SETQ F_ID (OPEN "C:/TEXT2.TXT" "r"))) ;
开启档案
(SETQ TMP_T (READ-LINE F_ID) TMP_L (LIST ""))
(WHILE (/= TMP_T NIL)
(SETQ TMP_L (APPEND TMP_L (LIST TMP_T)))
(SETQ TMP_L (READ-LINE F_ID))
)
(CLOSE F_ID)
(SETQ TMP_L (LIST (CDR TMP_L)))
(START_LIST "LBOX_L" 3 0)
(MAPCAR 'ADD_LIST (CAR TMP_L))
(END_LIST))
辅助程式(ADDL)说明:
1 用DEFUN 函数设定程式名称;使用GET_TILE 函数取得下拉式选框的选取值
(传回值为字串型态),再用IF 函数检查是否等于"0"(选择了第一个项目),若
是则会执行第2 行的叙述,否则执行第3 行叙述,以开启不同的文字档读取资

2 用OPEN 函数开启指定的纯文字档,开启模式为"r"(读取),将传回的档案处理
码,用SETQ 函数存入变数F_ID 中
46/58
3 若选取了第二个项目,则以OPEN 函数开启另一档案,并将传回的档案处理码
存入变数F_ID 中
4 至13 与旧程式相同,主要是重复读取档案中的资料,合拼成一串列,再将串列
逐个加入选框内成为选项
续下一课 ....
第 48 课 <第九篇 下拉(弹出)式清单选框> (第5 节)
续上一课 ....
辅助程式SETC 的程式码如下:
(DEFUN SETC()
(IF (= (GET_TILE "LBOX_T") "0") ;检查
选择了的主题
(SETQ F_ID (OPEN "C:/TEXT1.TXT"
"r")) ;开启档案
(SETQ F_ID (OPEN "C:/TEXT2.TXT"
"r"))) ;开启档案
(IF (> TMP_R 0)
(REPEAT TMP_R (READ-LINE F_ID)))
(SETQ TMP_S (GET_TILE "LBOX_E"))
(SETQ TMP_S (STRCAT TMP_S (READ-LINE F_ID)))
(CLOSE F_ID)
(SET_TILE "LBOX_E" TMP_S))
辅助程式(SETC)说明:
1 至3 设定程式名称,取得下拉式选框的资料,因应使用者的选择而开启不同的
档案(与ADDL 辅助程式第1 至3 第行相同)
4 至9 重复读取档案的资料,直至使用者选取的选项为止,并将取得的资料加在
编辑框原有字串的后面
注意 :
1 在两个辅助程式中,取得下拉式选框的传回值,只有两个可能性,固以IF 函数
判断即可;但若有很多个可能的传回值(即要开启多个档案)时,应以COND 函
数作多重判断
2 因为范例中只开启2 个纯文字档,所以在下拉式选框元件的定义中,直接以属
性设定其选项,比较直接及快捷;但若有很多的纯文字档,或会动态增减档案
的数量时,则应以清单选框元件同样的方式,以AutoLISP 函数动态将选项加
入选框
3 亦可以在主程式(LBOX)的开头,即先行读取两个档案中的资料,形成串列并
47/58
存入不同的变数中,供辅助程式(ADDL)使用;这样就不须在辅助程式中,每次
都开启档案,又重新再次读取资料形成串列
第 49 课 <第十篇 选台钮元件> (第1 节)
选台钮元件(radio_button)
此元件的特点是"多选一",即在同一组的选台钮中,使用者只能选取其中一个选

:radio_button //元件名称
{ 属性="属性值" ;
}
属性
label 显示在选台钮右边的提示文字
value 设定选台钮是否被选取(被选取设定值为1,否则为0);要注意在同一
组的选台钮中,只可有一个选台钮被设为选取(设定为1)
其它属性
action alignment is_enable is_tab_stop
mnemonic width height fixed_width
fixed_heigth key
选台钮列(radio_row)选台钮行(radio_column)
选台钮列会使包含在其中的一组选台钮呈水平排列,选台钮行中的选台钮则
48/58
为垂直排列
其实这两个元件与横列元件(row,水平排列)及直行元件(column,垂直排列)
相似,其属亦相同;请参阅第5 篇课程的介绍
若有设定其label 属性,则该组选台钮会以线框包围,而属性值则会显示在线
框的左上角
框选台钮列(boxed_radio_row)框选台钮行(boxed_radio_column)
与选台钮行及选台钮列相似,但不论是否有设定其label 属性,均以线框包围当
中的一组选台钮;若有设定label 属性,其设定值会显示在线框的左上角
第 50 课 <第十篇 选台钮元件> (第2 节)
练习 (Exercises)
建立新的对话框,当中有三个选台钮及一个确定取消钮;当使用者选取不同的选
取钮,便可以选择以不同的边数绘画封闭多边形
建立新的对话框定义档,命名为PGON1.DCL,存在C 盘的根目录中,其定义如下:
PGON:dialog
{ label="Polygon" ;
:radio_row //建立选台钮列元件
{ label="Polygon edge" ;
:radio_button //第一个选台钮
{ label="Tiangle" ;
key="PGON_1" ;
value=1;
}
:radio_button //第二个选台钮
{ label="Square" ;
key="PGON_2" ;
value=0;
}
:radio_button //第三个选台钮
{ label="Hexagonal" ;
key="PGON_3" ;
value=0;
}
} //结束选台钮列
spacer; //空间元件
ok_cancel; //确定取消钮
49/58
}
续下一课 ....
第 51 课 <第十篇 选台钮元件> (第3 节)
续上一课 ....
定义说明:
1 定义对话框名称为PGON,以冒号开始设定一个dialog 元件
2 开大括号属于上一行的dialog 元件,属性label 的设定值会显示在对话框的
标题列
3 以冒号开始,建立一个选台钮列元件radio_row,使包含其中的选台钮以水平
方向排列
4 开大括号属于上一行的选台钮列元件,属性label 的设定值会显示在线框的
左上角
5 以冒号开始,建立第一个选台钮元件radio_button
6 开大括号属于上一行的选台钮元件,属性label 的设定值会显示在选台钮的
右边
7 用key 属性,设定此选台钮的操作关键字为PGON_1
8 设定此选台钮的value 属性为1;表示当对话框显示时,自动选取(预设)此选
台钮
9 关大括号是对应第6 行的开大括号,此对大括号同属于第5 行的选台钮元件
10 至14
设定第二个选台钮,其操作关键字(属性key)为PGON_2,属性value 为
0(不选取)
15 至19
设定第三个选台钮,其操作关键字(属性key)为PGON_3,属性value 为
0(不选取)
20 关大括号是对应第4 行的开大括号,此对大括号同属于第3 行的选台钮列元

21 用一个空间元件spacer,使选台钮列与下面的按钮,增加垂直距离
22 建立一个确定及取消钮,以结束对话框
23 关大括号是对应第2 行的开大括号,此对大括号同属于第1 行的dialog 元件
续下一课 ....
第 52 课 <第十篇 选台钮元件> (第4 节)
续上一课 ....
50/58
建立新的程式档,名称为PGON1.LSP,存在C 盘的根目录中,其程式码如下:
(DEFUN C:PGON() (SETQ DCL_ID (LOAD_DIALOG "C:/PGON1.DCL") CHK 0)
(NEW_DIALOG "PGON" DCL_ID)
(ACTION_TILE "accept" "(SETQ CHK 1)(S_PGON)(DONE_DIALOG)")
(START_DIALOG)(UNLOAD_DIALOG)
(IF (= CHK 1) (COMMAND "POLYGON" TMP))
(PRINC))
(DEFUN S_PGON () (COND ((= (GET_TILE "PGON_1") "1") (SETQ TMP 3))
((= (GET_TILE "PGON_2") "1") (SETQ TMP 4))
((= (GET_TILE "PGON_3") "1") (SETQ TMP 6)))
)
主程式(PGON)说明:
1 DEFUN 函数设定程式名称;用LOAD_DIALOG 函数将对话框定义档载入,并将传
回的档案处理码,以SETQ 函数存入变数DCL_ID;设定另一变数CHK 为0,当使
用者按下确定钮时(第3 行)即更改为1
2 用NEW_DIALOG 函数,将指定档案中(变数DCL_ID)的PGON 对话框显示
3 用ACTION_TILE 函数,设定当使用者按下确定钮(关键字accept)的动作 :以
SETQ 函数将数数CHK 设定为1,再执行S_PGON 辅助程式,最后以DONE_DIALOG
函数结束对话框
4 用START_DIALOG 函数启动对话框并开始接受使用者输入;以UNLOAD_DIALOG
函数结束对话框并释放记忆体
5 用IF 函数检查变数CHK 是否等于1(按下确定钮);若是则以COMMAND 函数执
行POLYGON 指令,绘画多边形,其边数以变数TMP(在辅助程式中取得)设定
6 以一个不带参数的PRINC 函数,抑制多余的传回值及显示;最右边的关括号,
是对应第1 行DEFUN 函数左边的开括号
辅助程式(S_PGON)说明:
1 以DEFUN 函数设定程式名称;用GET_TILE 函数取得第一个选台钮(关键字
PGON_1)的设定值,并以多重检查COND 函数,检查其传回值是否等于"1"(使用
者选取了该钮),若是则以SETQ 函数,设定变数TMP 为多边形的边数
2,3 检查其余两个选台钮的设定值,若其值为"1",则以SETQ 函数,设定变数TMP
为多边形的边数
4 关括号是对应第1 行DEFUN 函数左边的开括号
51/58
第 53 课 <第十一篇 影像及影像框(影像区块)元件> (第1 节)
影像(image)及影像框(影像区块,image_block)元件
可以显示AutoCAD 的幻灯片(副档名为SLD),影像元件只为显示图形之用,使用者
不能使用滑鼠选取
:image //元件名称
{ 属性="属性值" ;
}
属性
aspect_ratio 固定图像的长阔比,其设定值为实数,没有预设值;若设定为
0,则元件将依图像的实际尺寸显示
color 属性为整数或保留字,预设值为while(颜色编号7);其它颜
色的设定值请参阅第5 篇课程
其它属性
action alignment label key
value width height fixed_width
fixed_heigth mnemonic is_enable is_tab_stop
第 54 课 <第十一篇 影像及影像框(影像区块)元件> (第2 节)
AutoLISP 函数
在对话框中取得影像框的阔度
(DIMX_TILE "元件关键字")
e.g. (DIMX_TILE "IMG_L")
元件关键字是在元件定义中,以属性key 设定
函数的传回值可作为FILL_IMAGE 及SLIDE_IMAGE 函数的参数
在对话框中取得影像框的高度
(DIMY_TILE "元件关键字")
e.g. (DIMY_TILE "IMG_L")
52/58
请参阅DIMX_TILE 函数的说明
开始在元件中建立影像
(START_IMAGE "元件关键字")
e.g. (START_IMAGE "IMG_L")
在使用FILL_IMAGE,SLIDE_IMAGE 及END_IMAGE 等函数前,必须先执行此函数
如果函数成功的话,会传回指定的关键字,否则传回NIL
不要在SET_TILE 函数中使用START_IMAGE 及END_IMAGE 函数
结束元的影像建立
(END_IMAGE)
不须提供任何参数,必须与SLIDE_IMAGE 函数配合使用
传回值永远是NIL
在影像框中绘制一个填满的矩形
(FILL_IMAGEX 座标 Y 座标 阔度 高度 颜色)
e.g. (FILL_IMAGE 0 0 阔度变数 高度变数 -2)
X 及Y 座标为矩形框的左上角位置,必须为正值
如果函数成功的话,会传回指定的关键字,否则传回NIL
填满区域的阔度及高度,以像素为单位,并相对于X 及Y 座标;阔度一般以
DIMX_TILE 函数取得,而高度则以DIMY_TILE 函数取得
传回值为填满区域的颜色整数值
颜色可以是AutoCAD 的颜色号码,或下列其中一种 :
-2 BGLCOLOR 目前AutoCAD 绘图萤幕的背景色
-15 DBGLCOLOR 目前对话框的背景色
-16 DBGLCOLOR 目前对话框的前景色(文字)
-18 DBGLCOLOR 目前对话框中线条的颜色
在元件中显示幻灯片
(SLIDE_IMAGEX 座标 Y 座标 阔度 高度 幻灯片档案名称)
e.g. (SLIDE_IMAGE 0 0 阔度变数 高度变数 "C:/IMG1.SLD")
X 及Y 座标,高度及阔度,请参阅上一个函数FILL_IMAGE 的说明
传回值为指定的幻灯片档案名称
53/58
第 55 课 <第十一篇 影像及影像框(影像区块)元件> (第3 节)
练习 (Exercises)
建立新的对话框IMG1.DCL,存在于C 盘的根目录中;在对话框中只会显示两个影
像及一个确定钮,其定义如下:
IMG:dialog
{ label="Image" ;
:row //建立横列元件
{ :image //建立影像元件
{ key="IMG_L" ;
width=15;
height=6;
color=-2;
}
:image //建立影像元件
{ key="IMG_R" ;
width=15;
height=6;
color=-2;
}
} //关闭横列元件
ok_only;
}
续下一课 ....
第 56 课 <第十一篇 影像及影像框(影像区块)元件> (第4 节)
续上一课 ....
定义说明:
1 设定对话框名称为IMG,以冒号开始设定dialog 元件
2 开大括号属于上一行的dialog 元件,属性label 的设定值会显示在对话框的
标题列
3 以冒号开始,设定一个横列元件row,使包含其中的其它元件呈水平排列
4 开大括号属于上一行的横列元件,以冒号开始,设定第一个影像元件image
5 开大括号属于上一行的影像元件,以key 属性,设定影像元件的操作关键字
(IMG_L)
6,7 设定影像元件的阔度(属性width)及高度(属性height)
8 设定影像元件的颜色属性color 为-2,表示以绘图萤幕的背景色显示
54/58
9 关大括号是对应第5 行的开大括号,此对大括号同属于第4 行的影像元件
10 至15用第4 至第9 行类似的设定,定义第二个影像元件,其key 属性设定为
IMG_R(关键字)
16 关大括号是对应第4 行的开大括号,此对大括号同属于第3 行的横列元件
17 定义一个确定钮,以结束对话方块
18 关大括号是对应第2 行的开大括号,此对大括号同属于第1 行的dialog 元件
续下一课 ....
第 57 课 <第十一篇 影像及影像框(影像区块)元件> (第5 节)
续上一课 ....
建立新的程式档IMG1.LSP,主程式用作启动对话框,辅助程式则处理影像;其程
式码如下:
(DEFUN C:IMG() (SETQ DCL_ID (LOAD_DIALOG "C:/IMG1.DCL"))
(NEW_DIALOG &uqotIMG" DCL_ID)
(S_IMG "IMG_L")
(S_IMG "IMG_R")
(START_DIALOG)(UNLOAD_DIALOG DCL_ID)
(PRINC))
(DEFUN S_IMG(KEY) (COND ((= KEY "IMG_L") (SETQ SLD "C:/IMG1.SLD"))
((= KEY "IMG_R") (SETQ SLD "C:/IMG2.SLD")))
(SETQ TMP_X (DIMX_TILE KEY) TMP_Y (DIMY_TILE KEY))
(START_IMAGE KEY)
(FILL_IMAGE 0 0 TMP_X TMP_Y -2)
(SLIDE_IMAGE 0 0 TMP_X TMP_Y SLD)
(END_IMAGE))
主程式IMG 说明
1 用DEFUN 函数设定程式名称为IMG;用LOAD_DIALOG 函数载入指定的对话框定
55/58
义档,并将传回的档案处理码存入变数DCL_ID,供其它函数使用
2 用NEW_DIALOG 函数,显示定义档(变数DCL_ID)中,指定的对话框
3 呼叫辅助程式S_IMG;并将左边的影像元件之操作关键字(IMG_L)作为参数,
传递给辅助程式
4 再次呼叫辅助程式S_IMG;并将右边的影像元件之操作关键字(IMG_R)作为参
数,传递给辅助程式
5 使用START_DIALOG 函数启动对话框并开始接受使用者输入;以
UNLOAD_DIALOG 函数结束对话框并释放记忆体
6 以一个不带参数的PRINC 函数,抑制多余的传回值及显示;最右边的关括号,
是对应第1 行DEFUN 函数左边的开括号
辅助程式S_IMG 说明
1 用DEFUN 函数设定程式名称;并接受传递过来的资料(元件关键字);用多重检
查COND 函数,检查变数KEY(传过来的关键字),以将对应的幻灯片档名称存入
变数SLD
2 属于多重检查的一部份,检查变数KEY,以将对应的幻灯片档名称存入变数
SLD
3 用DIMX_TILE 函数,取得影像元件(变数KEY 储存了元件的关键字)的阔度,存
入变数TMP_X;用DIMY_TILE 函数,取得影像元件(变数KEY 储存了元件的关键
字)的高度,存入变数TMP_Y
4 使用START_IMAGE 函数,开始对指定的影像元件进行处理(以变数KEY 指定)
5 使用FILL_IMAGE 函数,从影像元件的左上角(X=0,Y=0)开始,阔度为变数
TMP_X,高度为变数TMP_Y(在第3 行中取得),颜色号码为-2,填满整个影像元

6 使用SLIDE_IMAGE 函数,从影像元件的左上角(X=0,Y=0)开始,阔度为变数
TMP_X,高度为变数TMP_Y(在第3 行中取得),显示指定的幻灯片档案(以变数
SLD 指定)
7 使用END_IMAGE 函数,结束影像元件的处理;最右边的关括号,是对应第1 行
DEFUN 函数左边的开括号
注意
1 在主程式中会呼叫辅助程式2 次,分别设定两个影像元件的内容,避免在主程
式中出现太多相似的程式码
2 使用本程式之先,须先自行建立两个影像元件所显示的幻灯片档(IMG1.SLD
及IMG2.SLD,存在C 盘的根目录中)
第 58 课 <第十二篇 其它元件> (第1 节)
阔度25 字元(text_25)元件
其label 属性与文字元件text 无异,但以value 属性设定文字串时,则会限
制为25 个字元长度
56/58
错误讯息框(errtile)元件
其实此元件与一般文字元件无异,只是为了与文字元件有所区别,固特设此
元件以专门放置提示或错误讯息
确定钮+取消钮+说明钮+资讯钮+错误讯息框(ok_cancel_help_info_errtiel)元

确定钮+取消钮+错误讯息框(ok_cancel_errtiel)元件
阔度12 字元编辑框(edit12_box)元件
预设阔度属性edit_width 为12 个字元;而最大字元长度(属性edit_limit)
为148 个字元
阔度32 字元编辑框(edit32_box)元件
预设阔度属性edit_width 为32 个字元;而最大字元长度(属性edit_limit)
为2048 个字元
色彩显示框(swatch)元件
其实是由影像钮image_button 字元组成,以展示可选取的颜色
色彩选择框(std_rq_color)元件
提供与在指令行执行color 指令相似的对话框;萤幕会出现色盘,以供选择颜
色之用
色号1 至7 选择框(color_palette_1_7)元件
与色彩展示框元件swatch 类似,但仅提供1 至7 号的颜色供选择
各色号对应的关键字 : 1 号色=001,2 号色=002 . . . . 7 号色=007
色号1 至9 选择框(color_palette_1_9)元件
与色彩展示框元件swatch 类似,但仅提供1 至9 号的颜色供选择
各色号对应的关键字 : 1 号色=001,2 号色=002 . . . . 9 号色=009
续下一课 ....
第 59 课 <第十二篇 其它元件> (第2 节)
续上一课 ....
色号0 至9 选择框(color_palette_0_9)元件
与色彩展示框元件swatch 类似,但仅提供0 至9 号的颜色供选择
57/58
各色号对应的关键字 : 0 号色=000,1 号色=001 . . . . 9 号色=009
色号250 至255 选择框(color_palette_250_255)元件
与色彩展示框元件swatch 类似,但仅提供250 至255 号的灰阶颜色供选择
各色号对应的关键字 : 250 号色=250,251 号色=251 . . . . 255 号色=255
档案名称框(file_bottomdf)元件
其实与编辑框edit_box 没有太大分别,此元件的编辑框关键字为fedit;元件
中巳包含了确定钮取消钮ok_cancel 的元件,及错误讯息框errtile 元件,所
以使用此元件时,不需在对话框中加入确定取消钮
练习 (Exercises)
设立一对话框,在其中定义1 至7 号色选择,及确定取消钮;当使用者选取了颜色
后,即将目前的绘图颜色设定为使用者选取的颜色
建立新的对话框定义档COLP.DCL,存在C 盘的根目录中,其定义如下:
COLP:dialog
//设定对话框名称,用dialog 元件定义一个对话

{ label="Color" ;
//对话框元件的label 属性值会显示在对话框的
标题列
spacer; //增加垂直空间
color_palette_1_7; //设定1 至7 号色的选择框
spacer; //增加垂直空间
ok_cancel; //建立确定及取消钮
} //第1 行dialog 元件的关大括号
续下一课 ....
第 60 课 <第十二篇 其它元件> (第3 节)
续上一课 ....
建立新的程式档COLP.LSP,存在C 盘的根目录中,其程式码如下:
(DEFUN C:COLP() (SETQ DCL_ID (LOAD_DIALOG "C:/CLOP.DCL") CHK 0)
(NEW_DIALOG "CLOP" DCL_ID)
(ACTION_TILE "001" "(SETQ C_NO 1)")
(ACTION_TILE "002" "(SETQ C_NO 2)")
(ACTION_TILE "003" "(SETQ C_NO 3)")
58/58
(ACTION_TILE "004" "(SETQ C_NO 4)")
(ACTION_TILE "005" "(SETQ C_NO 5)")
(ACTION_TILE "006" "(SETQ C_NO 6)")
(ACTION_TILE "007" "(SETQ C_NO 7)")
(ACTION_TILE "accept" "(SETQ CHK 1)(DONE_DIALOG)")
(START_DIALOG)(UNLOAD_DIALOG)
(IF (= CHK 1) (COMMAND "COLOR" C_NO))
(PRINC))
程式说明:
1 用DEFUN 函数设定程式名称;用LOAD_DIALOG 函数载入指定的对话框定义档,
并将传回的档案处理码用SETQ 函数存入变数DCL_ID;设定另一变数CHK 初始
值为0,(在第10 行中,当按下确定钮时,此变数改为1
2 用NEW_DIALOG 函数,显示指定档案(变数DCL_ID 储存定义档的处理码)中的
对话框
3 用ACTION_TILE 函数,设定当按下第一个影像按钮元件时的动作 :用SETQ 函
数将变数C_NO 设定为1
4 至9 用ACTION_TILE 函数,设定按下不同的影像按钮元件时,将指定的颜色号
码存入变数C_NO
10 用ACTION_TILE 函数,设定当按下确定钮(关键字accept)时的动作 :首先将
变数CHK 设为1,再使用DONE_DIALOG 函数结束对话框
11 用START_DIALOG 函数启动对话框并开始接受使用者输入;以UNLOAD_DIALOG
函数结束对话框并释放记忆体
12 用IF 函数检查变数CHK 是否等于1(即使用者按下确定钮,在第10 行设定);
若是等于1,用COMMAND 函数执行COLOR 指令,并设定为使用者选取的颜色(在
3 至9 行中设定的C_NO 变数)
13 以一个不带参数的PRINC 函数,抑制多余的传回值及显示;最右边的关括号,
是对应第1 行DEFUN 函数左边的开括号
色号1至7选框 档案名称框

aihuyujian 发表于 2015-6-11 16:41:44

支持支持 技术贴要支持

tender138 发表于 2024-7-24 18:55:30

难得好资料,只是复制代码老是提示语法错误:(
页: [1]
查看完整版本: dcl对话框自学教程