第16章 auto CAD.docx
- 文档编号:10198731
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:53
- 大小:57.58KB
第16章 auto CAD.docx
《第16章 auto CAD.docx》由会员分享,可在线阅读,更多相关《第16章 auto CAD.docx(53页珍藏版)》请在冰豆网上搜索。
第16章autoCAD
第16章
基于AutoCADPDB对话框设计
AutoCAD除了使用命令提示行与用户进行交互外,还可使用对话框。
AutoCADR2000支持两种格式的对话框,一种是PDB格式,即AutoCAD专用的可编程对话框,另一种是Windows机制的对话框。
本章主要介绍PDB对话框的设计和调用方法。
Windows对话框将在下一章中介绍。
16.1AutoCADPDB对话框概述
16.1.1AutoCADPDB对话框
PDB是可编程对话框(ProgrammableDialogBox)的缩写,是从AutoCADR12开始提供的一种用于与用户交互的可视化界面。
这种对话框的好处是对话框独立于AutoCAD的运行平台。
也就是说,不论是在Windows环境还是在UNIX环境,甚至在原来的DOS扩展模式下,对话框的源程序和对话框的外观均是不变的,这样,在移植AutoCAD的应用程序时,非常方便。
与Windows对话框相比,PDB对话框具有的优点是:
设计和使用均较容易,它不需要开发者懂得太多的知识,只需要简单学习一下对话框控制语言DCL即可,尤其不需要掌握Windows环境下的诸如MFC和类库等大量的C++知识。
PDB对话框也具有明显弱点,一是只能供AutoCAD应用程序所使用,二是功能和机制上远不如Windows对话框,随着AutoCAD定位于单一的Windows操作系统,因此,使用PDB对话框的弱点也越来越明显,它已不能满足Windows操作系统下对应用程序界面一致性的要求。
因此,AutoCAD本身也不再使用PDB格式的对话框(尽管过去在DOS和UNIX下曾广泛使用),而转向利用Windows对话框来编写用户界面。
但由于PDB对话框的简单和易用性,时至今日,仍有许多开发者使用这种对话框,且据Autodesk网络上的最新资料,Autodesk为了保护用户过去的投资利益,打算长期支持这种格式的对话框,因此,本书还是用一定篇幅来介绍这方面的内容,尤其是对C++知识不是很丰富的初学者来说,通过简单的学习,便可快速生成对话框界面。
PDB对话框由对话框定义文件和驱动程序两部分组成。
对话框定义文件用于定义对话框的外观,包括对话框的风格、位置、尺寸、内部控件及控件初值等。
对话框驱动程序用于管理对话框的显示、与用户的交互、关闭以及获取对话框中控件值。
16.1.2对话框定义文件
对话框定义文件是一种文本文件,其后缀为.dcl。
它是借助对话框控制语言(DialogControlLanguage,简称DCL)来实现的。
DCL是Autodesk公司创建的专门用于生成对话框的命令语言。
下面给出图16-1所示对话框的DCL文件Demo_dia.dcl:
/*********************************************************************
程序名称:
DEMO_DIA.DCL
*********************************************************************/
demo:
dialog{
label="对话框示例";
:
edit_box{
label="输入你的姓名:
";
key="your_name";
}
:
button{
label="输出";
key="print";
fixed_width=true;图16-1示例对话框
alignment=centered;
}
ok_only;
}
/*......................DEMO_DIA.DCL文件结束.....................*/
其中:
demo对话框名,如同C语言的函数名;
dialog对话框名指明符,它与对话框名之间用“:
”隔开;
label标题,label对应的字符串直接显示在对话框中;
edit_box定义一个编辑框;
button定义一个按钮;
key控件的关键字,由驱动程序使用;
ok_only定义OK按钮,这是从AutoCAD的BASE.DCL
中自动引用来的按钮。
16.1.3驱动程序
对话框必须利用驱动程序才能发挥作用,驱动程序一般由主调用函数和回调函数组成。
主调用函数用于装入、显示、交互以及清除对话框,回调函数一般用于对对话框中各控件的值进行提取等操作。
主调用函数一般与ObjectARX应用程序中的普通的C函数融为一体,回调函数一般单独给出,专用于操作对话框中的各控件,一般一个对话框有多个回调函数。
例如,可写出图16-1所示对话框的驱动程序demo_dia.cpp如下:
intdrive_main()
{ads_hdlghdlg;
intdcl_id;
intdlg_status;
ads_load_dialog("demo_dia.dcl",&dcl_id);
ads_new_dialog("demo",dcl_id,(CLIENTFUNC)0,&hdlg);
ads_action_tile(hdlg,"print",(CLIENTFUNC)print_cb);
ads_action_tile(hdlg,"accept",(CLIENTFUNC)ok_cb);
ads_start_dialog(hdlg,&dlg_status);
ads_unload_dialog(dcl_id);
return1;}
voidstaticprint_cb(ads_callback_packet*cpkt)//回调函数
{chartbuf[80];
ads_get_tile(cpkt->dialog,"your_name",tbuf,MAX_TILE_STR);
acutPrintf("\n刚才输入的姓名为:
%s",tbuf);}
voidstaticok_cb(ads_callback_packet*cpkt)
{ads_done_dialog(cpkt->dialog,1);}
上述函数中,drive_main()是主调用函数,printf_cb()和ok_cb()是回调函数。
下面对程序中的主要语句作一简要说明。
对话框的主调用函数中一定要有#include“adsdlg.h”语句,对应的头文件adsdlg.h及相关的另外几个头文件存于ObjectARX目录中。
ads_hdlg是一种专用于定义对话框句柄的数据类型,这里用它定义了一个变量hdlg,这样就可用hdlg来代表demo对话框。
dcl_id是对话框文件(.dcl)的标识字,dcl_id就代表demo_dia.dcl。
dlg_status表示对话框的状态。
每个对话框一般有多种关闭的方法,这样就有不同的状态值。
如通过“OK”按钮正常关闭,此值为1;通过CTRL+C关闭,此值为0,等等。
ads_load_dialog(“demo_dia.dcl”,&dcl_id)的作用是将磁盘上名为demo_dia.dcl的文件调入内存,并用dcl_id表示这一文件。
ads_new_dialog(“demo”,dcl_id,(CLIENTFUNC)0,&hdlg)的作用是从dcl_id所代表的文件(demo_dia.dcl)中,取出名为demo的对话框,在屏幕上显示出来,并用hdlg表示这一对话框。
ads_action_tile(hdlg,“print”,(CLIENTFUNC)print_cb),是将对话框文件demo_dia.dcl中关键字为“print”的按钮(即标签为“打印”的按钮)与回调函数print_cb()关联在一起。
关联的目的是,只要用户点选了该按钮,则print_cb()函数就启动运行。
同样,用ads_action_tile(hdlg,“accept”,(CLIENTFUNC)ok_cb)将“OK”按钮与回调函数ok_cb()相关联。
ads_start_dialog(hdlg,&dlg_status)是启动对话框,让用户与对话框进行交互。
此时,可在“输入你的姓名:
”栏中输入任意字符,若输入数据有错可随时修改,点选“打印”按钮,则会在命令行上显示:
刚才输入的姓名为:
XXXXXX
上述操作可循环进行多次,如果想退出对话框,则可点选“OK”按钮,调用回调函数ok_cb()将对话框关闭。
接着,主调用函数开始执行ads_unload_dialog(dcl_id),将dcl_id所代表的对话框文件demo_dia.dcl从内存中清除。
在print_cb()回调函数中,有一个参数ads_callback_packet*cpkt,由它将主调用函数drive_main()中关于对话框的某些信息传入回调函数。
ads_get_tile(cpkt->dialog,“your_name”,tbuf,MAX_TILE_STR)的作用是从对话框的“your_name”控件中取得其值,送入tbuf字符串变量。
用ads_printf()将tbuf中的内容输出完成后,重又回到主调用函数的ads_start_dialog()之中,继续交互状态。
在ok_cb()回调函数中,ads_done_dialog(cpkt->dialog,1)的作用是关闭对话框,返回状态1,即dlg_status=1。
对话框关闭以后,自动从交互状态退出,转到主调用函数的ads_unload_dialog(dcl_id)
语句。
16.2对话框控件及控件属性
16.2.1控件和控件组的含义
在用DCL定义对话框时,对话框中的单一部件被称为“控件”。
一个对话框是由边框及框内的各种控件两大部分组成的。
将多个控件组合成行或列,然后将这些控件可按一个控件来对待,这就是控件组。
AutoCADPDB模块预定义了一些基本类型的控件,如按钮、编辑框、列表框、图像等。
对话框内部是以“层次”或“树形结构”方式进行组织的,树的顶端(根节点)就是对话框本身,在DCL中称为dialog,树的叶节点可由各种控件和控件组构成。
控件的布局、外观和行为则是借助于控件的属性(attributes)而规定的。
例如,利用label属性可为某一控件指定相关的文本,如button控件的label属性就是该按钮的名称。
根据需要,DCL允许改变预定义的控件和属性,或者定义新的控件和控件组,也可以引用原型控件和改变其属性。
在DCL描述中,一般不需要明确地包含对话框布局的细节,对话框的大小及其各个成分的安排一般都可按AutoCAD缺省方式处理。
16.2.2控件属性的概念
控件的属性用于定义该控件的布局和功能,类似于编程语言中的变量,属性是由属性名和属性值所组成的,属性名一般简称为属性。
在用于定义对话框的DCL文件中,属性定义具有下列形式:
name:
item1[:
item2:
item3...]{
attribute=value;
...
}
其中,每个item是一先前定义的控件。
新的控件(name)继承指定项(item1,item2,item3,…)的属性,并且在大括弧({})内的属性定义要么补充所继承的属性,要么替代所继承的属性(如果属性名相同的话)。
例如,下面是一个按钮的属性定义:
button:
tile{
fixed_height=true;
is_tab_stop=true;}
16.2.3属性值的类型
属性值必须为以下几种特定的类型之一:
(1)整数
整数表示距离的数值(如控件的宽度和高度)是用字符高度和字符宽度单位表示的。
(2)实数
带小数的实数必须要有一个前导位,例如0.1不能写成.1。
(3)字符串
字符串是用双引号(“”)括起来的文本。
若字符串中要包含一个双引号,那么在该双引号之前应加上反斜杠(\”)。
字符串中不能包含表16-1所列出的控制字符之外的特殊字符。
表16-1在DCL字符串中允许使用的控制字符
转义序列
字符
\”
引号
\\
反斜杠
\n
换行符
\t
水平制表符
(4)保留字
保留字是由字母、数字和字符组成的标识符,它们必须以字母开头。
例如,许多属性都需要布尔值true或false,这里的true和false就是保留字。
保留字是区分大小写的,如True不等于true。
与保留字一样,属性名也区分大小写。
如width和Width并不是等同的。
应注意的是,应用程序总是以字符串的形式获取属性值,如果程序需要使用数值,那么必须对所获得的字符串进行类型转换。
另外从应用的角度来看,字符串与保留字的唯一区别是:
保留字必须以字母开头,而字符串能够以数字、字符或特殊字符开头,并可以包括空格。
某些属性(如width和height)对于所有控件都是相同的,属性说明是任选的,如果没有规定属性,大多数属性都使用缺省值。
还有一些属性是为某些类型的控件所专用的,如图像背景颜色color。
若试图把这种属性赋给其中一种类型的控件,AutoCAD会报告出错信息;不过多数情况下,只是忽略有错误的属性。
16.2.4用户定义的属性
AutoCAD定义了一些预定义属性,用户除可使用预定义属性外,还可自己定义属性。
属性名可以是任何不与标准的预定义属性名冲突的有效名字。
自定义的属性名能够包含字母、数字和下划线(__),且必须以字母开头。
应注意的是,如果用户自定义属性名与预定义属性名发生冲突,AutoCADPDB模块会拒绝这个新属性而仍然使用标准的预定义属性,这可能导致意想不到的结果。
赋给属性的值及其含义是在应用程序中定义的,用户自定义属性的值必须与刚才讲述的类型相一致,自定义属性的值由ads_get_attr()和ads_get_attr_string()函数接收。
用户自定义属性的含义与用法将依赖于用户应用程序,定义你自己的属性好比定义应用程序专用的“客户数据”,这两项技术都能使PDB模块管理你所提供的数据。
用户自定义属性是只读的,在对话框激活期间这种数据是静态的。
假若需要在运行时动态地改变它们,那么必须使用客户数据。
两者的另一区别是:
最终用户能在应用程序的DCL文件中观看用户自定义属性的值,而客户数据对最终用户是看不见的。
16.2.5预定义属性
预定义属性是由AutoCADPDB模块定义的,在表16-2中依字母顺序列出了所有的预定义属性。
表16-2预定义属性
属性名
适用的控件
含义(如果被指定为真)
action
所有活动控件
AutoLISP动作表达式
alignment
所有控件
在控件组中的水平或垂直位置
allow_accept
编辑框、图像按钮、列表框
当此控件被选中时,激活is_default按钮
aspect_ratio
图像、图像按钮
图像长宽比
big_increment
滑动条
要移动的增量距离
children_alignment
行、列、互锁行、互锁列、加框行、加框列、加框互锁行、加框互锁列
控件组的子控件对齐
children_fixed_height
行、列、互锁行、互锁列、加框行、加框列、加框互锁行、加框互锁列
在布局改变时,控件组的子控件的高度不变
children_fixed_width
行、列、互锁行、互锁列、加框行、加框列、加框互锁行、加框互锁列
在布局改变时,控件组的子控件的宽度不变
color
图像、图像按钮
一个图像的背景(填充)色
续表
属性名
适用的控件
含义(如果被指定为真)
edit_limit
编辑框
用户可输入的最大字符数
edit_width
编辑框、弹出列表框
此控件可供编辑输入的宽度
fixed_height
所有控件
布局改变时高度不变
fixed_width
所有控件
布局改变时宽度不变
fixed_width_font
列表框、弹出列表框
以固定字符间距的字体显示文本
height
所有控件
控件的高度
initial_focus
对话框
带有初始聚集的关键字
is_bold
文本
以粗体字显示
is_cancel
按钮
当取消键(即ESC键)按下时,按钮被激活
is_default
按钮
当接受键(即回车键)按下时,按钮被激活
is_enabled
所有活动控件
控件一开始是有效的
is_tab_stop
所有活动控件
该控件可由Tab键点亮
key
所有活动控件
由应用程序使用的控件名称
label
加框行、加框列、加框互锁行、加框互锁列、按钮、对话框、编辑框、列表框、弹出列表框、互锁按钮、文本、切换键
该控件显示的标签(或标题)
layout
滑动条
指定滑动条是水平还是垂直布置
list
列表框、弹出列表框
在列表中要显示的初值
max_value
滑动条
滑动条的最大值
min_value
滑动条
滑动条的最小值
mnemonic
所有活动控件
控件的助记符
multiple_select
列表框
列表框允许多项选择
password_char
编辑框
在编辑框中输入的掩码字符
small_increment
滑动条
要移动的增量距离
tabs
列表框、弹出列表框
显示列表时,Tab键的键位
tab_truncate
列表框、弹出列表框
截断比相关的制表位还长的文本
value
文本、活动控件(按钮和图像按钮除外)
控件的初值
width
所有控件
控件的宽度
为了方便读者编程,下面对上述属性做进一步说明。
action=“(function)”;
该属性指定一个AutoLISP表达式,以便当这个控件被选中时来完成一个动作。
这就是经常提到的“回调”。
对于某些类型的控件,当用户把焦点切换到其他的控件上时,也可能发生动作。
其可能取值是用双引号括起来的字符串,字符串构成一有效的AutoLISP表达式,你不能在ObjectARX应用程序中指定action属性。
一个控件只能有一种动作,如果应用程序借助action_tile赋予它一种动作,那么将取代控件的action属性。
alignment=position;
该属性指定控件组中的控件在水平或垂直方向上位置对齐。
对于一个列控件组中的子控件,可能的值是left,right或centered(缺省为left)。
对于一个行控件组中的子控件,可能的值是top,bottom或centered(缺省为centered)。
你不能让子控件沿着控件组的长轴来对齐。
在控件组中的第一个和最后一个控件都是以列或行的端部对齐的,在此控件组中的其他控件均匀分布,除非使用“spacer_0”控件来增加间距。
allow_accept=true-false;
该属性用于指定当用户按下回车键时此控件是否被激活,其可能取值为true或false(缺省值为false)。
若为true,在用户按下回车键时,缺省按钮将被“按下”,这里的缺省按钮就是其is_default属性为true的button控件。
aspect_ratio=real;
该属性指定图像的长宽比(实际为宽度与长度之比)。
若它为0.0,则控件将按照图像的尺寸显示。
big_increment=integer;
该属性指定由滑动条增量控制所使用的值,其缺省值是总范围的十分之一。
此值必须在由min_value和max_value所确定的范围之内。
children_alignment=position;
该属性与alignmentr控件相类似,为控件组中的子控件指定缺省的对齐位置。
如果一个子控件的对齐属性被明确指定,则不会覆盖此子控件的对齐属性。
对于列控件组,可能的值是left,right或centered(缺省为left)。
对于行控件组,可能的值是top、bottom或centered(缺省为centered)。
children_fixed_height=true-false;
该属性为控件组中的所有子控件指定缺省高度。
如果一个子控件的高度被明确指定,则不会覆盖此子控件的高度属性。
其可能的取值为true或false(缺省为false)。
children_fixed_width=true-false;
该属性为控件组中的所有子控件指定缺省宽度。
如果一个子控件的宽度被明确指定,则不会覆盖此子控件的宽度属性。
其可能的取值为true或false(缺省为false)。
color=colorname;
该属性指定图像的背景色,即填充色。
可能的取值是整数或保留字(缺省值为7),也就是说是AutoCAD的颜色号或表16-3中的一个符号名称。
edit_limit=integer;
该属性指定用户可在一个编辑框内输入的最多字符数。
可能的取值为整数(缺省为132),最大不能超过256。
edit_width=number;
该属性为edit_box控件指定编辑框的宽度(以字符为单位),可能的取值是整数。
如果没有给定edit_width值或将它置为0,那么控件的宽度是不确定的,编辑框将扩展到占满可用空间为止;如果给定edit_width非零值,则编辑框在该控件所占据的空间内是右对齐的。
表16-3符号名
符号名
含义
dialog_line
当前对话框中的直线颜色
dialog_foreground
当前对话框前景色(用于文本)
dialog_background
当前对话框背景色
graphics_background
AutoCAD图形屏幕的背景色(通常等效于0)
black
AutoCAD颜色号=0(BLACK)
red
AutoCAD颜色号=1(RED)
yellow
AutoCAD颜色号=2(YELLOW)
green
AutoCAD颜色号=3(GREEN)
cyan
AutoCAD颜色号=4(CYAN)
blue
AutoCAD颜色号=5(BLUE)
magenta
AutoCAD颜色号=6(MAGENTE)
whitegraphics_foreground
AutoCAD颜色号=7(WHITE)
fixed_height=true-false;
该属性用以说明一个控件的高度是否被允许充满可用的空间。
如果此属性为true,则此控件的高度不变。
其可能的取值为true或false(缺省为false)。
fixed_width=true-false;
该属性用以说明一个控件的宽度是否被允许充满可用的空间。
如果此属性为true,则此控件的宽度不变。
其可能的取值为true或false(缺省为false)。
fixed_width_font=true-false;
该属性指定一个列表框或弹出式列表框是否以固定间距的字体来显示文本。
其可能的取值为true或false(缺省为false)。
height=number;
该属性指定一个控件的高度。
这个值可以取整数或实数,是以字符高为单位所表示的距离来度量的。
对于多数控件,一般不需要指定这个值,除非缺省值产生不令人满意的外观。
但是,对图像控件和图像按钮,则必须明确地指定这个值。
控件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第16章 auto CAD 16