XDSoft 发表于 2013-4-19 00:13:01

OpenDCL停靠窗口设计的演示-晓东工具箱快捷命令、常用命令



在这个帖子里面以晓东工具箱-快捷命令和常用命令为例,讲下OpenDCL停靠窗口的设计。

不多说,上演示。


http://bbsfile.xdcad.net/dev/opendcl/xd_tools_file/ODCL-XDTOOL-Cmd.swf




XDSoft 发表于 2013-4-19 00:32:25

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个按钮,设置不可见状态。



XDSoft 发表于 2013-4-19 01:23:42

主程序就下面几行,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)
)




炫翔 发表于 2013-4-19 10:47:31

:o神马东西,赞,慢慢消化中

Lispboy 发表于 2013-4-19 11:00:48

老大,这真实用LISP写的吗?{:soso_e179:}叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方,是程序执行完就自动加到菜单里面的吗?用的啥技术?

牢固 发表于 2013-4-19 11:49:46

Lispboy 发表于 2013-4-19 11:00 static/image/common/back.gif
老大,这真实用LISP写的吗?叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方, ...

快捷命令可以存储在文件里,也可以储存在注册表里!

XDSoft 发表于 2013-4-19 12:12:04

牢固 发表于 2013-4-19 11:49 static/image/common/back.gif
快捷命令可以存储在文件里,也可以储存在注册表里!
他问的应该是下面的“最近命令”, 这个不是, 最近命令 是根据 自己运行的命令,实时加入到菜单里面的。要不也不能符合每个人的需要了。

命令行上运行一个命令,自动加入一个命令。

XDSoft 发表于 2013-4-19 12:13:09

Lispboy 发表于 2013-4-19 11:00 static/image/common/back.gif
老大,这真实用LISP写的吗?叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方, ...

嗯嗯,实时自动加入的,使用了反应器技术。

arken 发表于 2013-4-21 01:09:34

奇怪,怎么我看不到视频?

XDSoft 发表于 2013-4-21 01:15:49

arken 发表于 2013-4-21 01:09 static/image/common/back.gif
奇怪,怎么我看不到视频?

你用的IE高版本吧,看看安全设置。或者换个其他的浏览器试试,比如360,我用的。

zyhandw 发表于 2013-4-22 17:34:42

很棒的资料,一下子还理解不了,先看能否模仿下:lol

sachindkini 发表于 2013-5-7 20:32:49

dear sir,

nice tool
how can i download?

605052747 发表于 2013-5-13 17:16:45

很棒的资料,一下子还理解不了,先看能否模仿下

黑洞—杜明智 发表于 2013-5-16 21:34:02

这是要我下定决心学习ODCL了

zsw23 发表于 2013-5-18 17:30:00

高山仰止,lisp很强大
页: [1] 2
查看完整版本: OpenDCL停靠窗口设计的演示-晓东工具箱快捷命令、常用命令