当对话框被激活时,用户不能进行交互式选择。如果想让用户在图形屏幕上选择,则必须先隐藏对话框,然后再将其恢复。隐藏对话框与用 done_dialog 来关闭对话框是相同的,但回调函数必须调用 done_dialog 的 status 参数指示该对话框是被隐藏而不是结束或取消。应将 status 参数设置为应用程序定义的值。
当对话框消失时,start_dialog 函数返回应用程序定义的 status。然后,程序必须检查 start_dialog 返回的状态以决定下一步动作。关于 status 的标准值和程序定义值的信息,请参见 AutoLISP 参考中的 done_dialog!AL(`XREF_18063_vlref',1)。
例如,有一个简单的对话框,需要用户在 AutoCAD 图形窗口中拾取一点:
该对话框用下列 DCL 定义:
hidedcl : dialog
{ label="Hide Example";
: column
{ : text
{ key="message";
label="Click PickMe to pick a point";
fixed_width=true;
fixed_height=true;
alignment=centered;
}
:row
{ ok_only;
:retirement_button
{ label = "PickMe";
key = "hide";
mnemonic = "H";
}}}}
控制对话框的函数显示窗口,直到用户选择了“OK”或关闭窗口为止。如果用户选择“PickMe”,代码将隐藏对话框并提示用户选择一点。下列 AutoLISP 代码控制该对话框:
(defun c:hidedcl (/ dcl_id what_next cnt)
(setq dcl_id (load_dialog "hidedcl.dcl")) ;加载对话框
(setq what_next 2)
(setq cnt 1)
(while (>= what_next 2) ;开始显示循环
(if (null (new_dialog "hidedcl" dcl_id)) ;初始化对话框
(exit) ;如果返回 nil 则退出
); endif
; 设置按钮被按下后执行的动作。每个按钮都调用 done_dialog
; 关闭对话框
; 每个按钮都将一个特定的状态代码与 done_dialog 相关联,
; 并且该状态代码由 start_dialog 返回。
(action_tile "accept" "(done_dialog 1)") ;设置 OK 的动作
(action_tile "hide" "(done_dialog 4)") ;设置 PickMe的动作
(setq what_next (start_dialog)) ;显示对话框
;
(cond
((= what_next 4) ;提示用户
(getpoint "\npick a point") ;拾取 pt
)
((= what_next 0)
(prompt "\nuser cancelled dialog")
)
)
)
(unload_dialog dcl_id)
(princ)
)
注意 term_dialog 函数立即关闭对话框,但不返回状态码,因此应用程序不能区分嵌套对话框的隐藏和因为错误而导致的对话框被取消。 |