OpenDCL停靠窗口设计的演示-晓东工具箱快捷命令、常用命令
在这个帖子里面以晓东工具箱-快捷命令和常用命令为例,讲下OpenDCL停靠窗口的设计。
不多说,上演示。
http://bbsfile.xdcad.net/dev/opendcl/xd_tools_file/ODCL-XDTOOL-Cmd.swf
1、Control Bar 设计的时候注意一个就是停靠的位置选择好,这里选的是Left+Right
2、事件里面勾选了"DocActivated" "EnteringNoDocState" "Initialize"
2.1) 事件"DocActivated" 处理代码:
(defun c:FastMenu2_OnDocActivated (/);;ACAD在多窗口运行下,新图形打开后回调此事件。
(c:FastMenu2_OnInitialize) ;新窗口打开后执行初始化,否则命令不能用。
(princ)
)
2.2) 事件"EnteringNoDocState" 处理代码:
(defun c:FastMenu2_OnEnteringNoDocState (/) ;;ACAD在多窗口运行下,所有图形窗口关闭时回调此事件。
(dcl_Form_Close FastMenu2) ;;销毁停靠窗口对话框
)
2.3) 事件"Initialize" 处理代码:
几乎所有的对话框设计都要响应Initialize事件,在对话框加载成功后初始化数据。
(defun c:FastMenu2_OnInitialize (/)
(setq $XD_CCommandList ($XDLSP_CCOMMANDSLIST_DATA))
(setq i 1
h1 22
h2 2
)
(foreach n $XD_CCommandList
(setq cmdname (car n)
func (strcase (cadr n))
)
(setq cname1 (strcat "CMD-" (itoa i)))
(setq _FastMenu_Cname (eval (read cname1)));eval函数的用法
(dcl_Control_SetEnabled _FastMenu_Cname t);;按钮设置可用
(dcl_Control_SetVisible _FastMenu_Cname t);;按钮设置可见
(dcl_Control_SetCaption _FastMenu_Cname cmdname) ;;给按钮设置Caption
(dcl_Control_SetPos _FastMenu_Cname 24 (+ 24 (* (1- i) (+ h2 h1))) 80 h1)
(dcl_Control_SetEventInvoke _FastMenu_Cname 1)
(setq funcname (strcat "c:" cname1 "_OnClicked"));处理OnClicked事件的回调函数
(setq i (1+ i))
(dcl_Control_SetProperty _FastMenu_Cname "Clicked" funcname) ;设置点按钮执行命令时候,该按钮要执行的函数。
(if (xdrx_string_find func "XDTB_")
(setq func (strcase (substr func 6)))
(setq func (strcase func))
)
(setq name (strcat "XD:" func "\n"))
(setq name1 (strcat "(dcl_sendstring \"" name "\")\n"));;dcl_sendstring 是常用的一个函数,向命令行窗口发送字符串命令执行。
(setq func1 (strcat "(defun " funcname " () " name1 ")"))
(eval (read func1))
)
(setq l (- 11 i)) ;从执行过的命令堆栈中取最多最近的10个命令,不够的按钮位置设置不可见、不可用。
(repeat l
(setq cname1 (strcat "CMD-" (itoa i)))
(dcl_Control_SetEnabled (eval (read cname1)) nil)
(dcl_Control_SetVisible (eval (read cname1)) nil)
(setq i (1+ i))
) ;|
|;
(setq i 1
h1 22
h2 2
)
(setq len (length $XD:LastCommandListStack)) ;;命令堆栈长度
(setq _templ $XD:LastCommandListStack)
(if (> len 10);;取出堆栈最上面的10个命令。
(progn
(setq _templ (reverse (cdr (member (nth 10 $XD:LastCommandListStack)
(reverse $XD:LastCommandListStack)
)
)
)
)
)
)
(foreach n _templ
(setq _CMD1 n
V (assoc _CMD1 $XD:CCommandContrastList)
cmdname (cadr v)
func (strcase (caddr v))
)
(setq cname1 (strcat "LASTCMD-" (itoa i)))
(setq _FastMenu_Cname (eval (read cname1)))
(dcl_Control_SetEnabled _FastMenu_Cname t)
(dcl_Control_SetVisible _FastMenu_Cname t)
(dcl_Control_SetCaption _FastMenu_Cname cmdname)
(dcl_Control_SetPos _FastMenu_Cname 24 (+ 350 (* (1- i) (+ h2 h1))) 80 h1)
(dcl_Control_SetEventInvoke _FastMenu_Cname 1)
(setq funcname (strcat "c:" cname1 "_OnClicked"))
(dcl_Control_SetProperty _FastMenu_Cname "Clicked" funcname)
(setq name _CMD1)
(setq name1 (strcat "(dcl_sendstring \"" name "\n\")"))
(setq func1 (strcat "(defun " funcname " () " name1 ")"))
(eval (read func1))
(setq i (1+ i))
)
(setq l (- 11 i))
(repeat l
(setq cname1 (strcat "LASTCMD-" (itoa i)))
(dcl_Control_SetEnabled (eval (read cname1)) nil)
(dcl_Control_SetVisible (eval (read cname1)) nil)
(setq i (1+ i))
)
(princ)
)
3、预先分别设计好10个按钮,设置不可见状态。
主程序就下面几行,ODCL的程序非常结构化,主程序里面就是几个事件的处理,代码量都在事件处理的具体函数中。
(defun c:XDTB_FASTMENU ()
(defun c:FastMenu2_OnDocActivated (/)
(c:FastMenu2_OnInitialize)
(princ)
)
(defun c:FastMenu2_OnEnteringNoDocState (/)
(dcl_Form_Close FastMenu2)
)
(defun c:Update_OnClicked (/)
(c:FastMenu2_OnInitialize)
(princ)
)
(defun c:CCommandSetup_OnClicked (/) ;;这个就是那个“设置”按钮点下要执行的命令。
(dcl_sendstring "XD:CommandMenu\n")
)
(Xdrx_Begin)
(Command "_Opendcl");;保证ODCL核心加载。
($XDOB_DCL_KO_DockedBar "FastMenu2");; 这个函数是一个技巧,不能让停靠窗口无限多的都显示,该函数销毁其他所有当前激活的停靠窗口,在下面贴这个函数。
(Setq Lxd (Dcl_Project_Load (*Odcl:Samples:Findfile "Xdob_Layerassistant.Odcl")))
;|Dcl_Project_Load 函数有参数,加T强制重新加载对话框设计数据,否则只加载一次。在设计调试时候一般都带T参数,实时看到变化,很多初学者忘记这个参数,一直找不到为什么调整后对话框的不更新的原因。\;
(Dcl_Form_Show FastMenu2)
(Xdrx_End)
(Xdrx_Sysvar_Pop)
(Gc)
(Gc)
(Princ)
)
Dcl_Project_Load 函数用法(点图片放大):
KO不希望继续运行的停靠对话框。
(defun $XDOB_DCL_KO_DockedBar (str / n $XDTB_GLOBAL_DCL_DockedBarList ctrn)
(setq $XDTB_GLOBAL_DCL_DockedBarList '("LayerBar" "FastMenu2"
"SUNA1"
)
);;这个表里面是你想销毁的停靠对话框。
(foreach n $XDTB_GLOBAL_DCL_DockedBarList
(setq ctrn (eval (read n)))
(if (and
(/= (strcase n) (strcase str))
(dcl_Form_IsActive ctrn);;判断对话框当前是否激活。
)
(dcl_Form_Close ctrn);;KO它们。
)
)
(princ)
)
:o神马东西,赞,慢慢消化中 老大,这真实用LISP写的吗?{:soso_e179:}叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方,是程序执行完就自动加到菜单里面的吗?用的啥技术?
Lispboy 发表于 2013-4-19 11:00 static/image/common/back.gif
老大,这真实用LISP写的吗?叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方, ...
快捷命令可以存储在文件里,也可以储存在注册表里! 牢固 发表于 2013-4-19 11:49 static/image/common/back.gif
快捷命令可以存储在文件里,也可以储存在注册表里!
他问的应该是下面的“最近命令”, 这个不是, 最近命令 是根据 自己运行的命令,实时加入到菜单里面的。要不也不能符合每个人的需要了。
命令行上运行一个命令,自动加入一个命令。 Lispboy 发表于 2013-4-19 11:00 static/image/common/back.gif
老大,这真实用LISP写的吗?叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方, ...
嗯嗯,实时自动加入的,使用了反应器技术。 奇怪,怎么我看不到视频? arken 发表于 2013-4-21 01:09 static/image/common/back.gif
奇怪,怎么我看不到视频?
你用的IE高版本吧,看看安全设置。或者换个其他的浏览器试试,比如360,我用的。 很棒的资料,一下子还理解不了,先看能否模仿下:lol dear sir,
nice tool
how can i download? 很棒的资料,一下子还理解不了,先看能否模仿下 这是要我下定决心学习ODCL了
高山仰止,lisp很强大
页:
[1]
2