yxp 发表于 2018-6-23 23:35:43

DCL对话框添加菜单——API应用2

本帖最后由 yxp 于 2018-6-24 03:12 编辑

DCL 默认对话框是没有菜单的,既然可以调用 windows api 就可以随心所欲了
下面是一个给 DCL 添加菜单的示例,同样的方法可以给 DCL 添加一个右键菜单

;;本例将调用 windows api 给 DCL 添加一个完整菜单
;; by. yxp_xa   2018年6月23日
(defun c:sss()
(setq dcl_id (load_dialog "sss.dcl"))
(if (not (new_dialog "sss" dcl_id))(exit))
(add_menu_pop)
(start_dialog)
(unload_dialog dcl_id)
(princ)
)

;;DCL窗口菜单
(defun add_menu_pop()
(setq DWX (vlax-create-object "DynamicWrapperX"))
(vlax-invoke DWX 'Register "user32" "FindWindowExW" "i=hhhw" "r=m")
(vlax-invoke DWX 'Register "user32" "SetMenu" "i=hh" "r=l")
(vlax-invoke DWX 'Register "user32" "CreateMenu" "r=l")
(vlax-invoke DWX 'Register "user32" "CreatePopupMenu" "r=l")
(vlax-invoke DWX 'Register "user32" "AppendMenuW" "i=plpw" "r=l")
(setq dcl (vlax-invoke DWX 'FindWindowExW 0 0 0 "DCL窗口菜单示例"))
(setq hMenu (vlax-invoke DWX 'CreateMenu)) ;;顶级菜单句柄
(setq menu (mapcar '(lambda(x);;创建顶级菜单
    (list (vlax-invoke DWX 'CreatePopupMenu) x))
    (list "文件(&F)" "编辑(&E)" "帮助(&H)"))
)
(foreach x menu (vlax-invoke DWX 'AppendMenuW hMenu 16 (car x)(cadr x)))
(setq pop (list;;创建子菜单
    '((101 "文件 (&F)")(102 "打开 (&O)...")(103 "保存 (&S)")(104 "关闭 (&C)"))
    '((201 "复制 (&C)")(202 "粘贴 (&P)")(203 "剪切 (&X)"))
    '((301 "帮助 (&H)")(302 "注册 (&R)")(303 "关于 (&A)...")))
)
(mapcar '(lambda(x y)(foreach z y
    (vlax-invoke DWX 'AppendMenuW (car x) 0 (car z)(cadr z)))) menu pop)
(vlax-invoke DWX 'SetMenu dcl hMenu)
)
(princ)

源码下载:

dwx自动注册工具下载:

yxp 发表于 2018-6-24 12:38:32

本帖最后由 yxp 于 2018-6-24 15:01 编辑

xinxirong 发表于 2018-6-24 07:48
模块转非模块哪有那么容易。另外菜单命令的实现呢?
模块转换确实不能,这是完全两种数据类型,就像把 int 转换为 string,但是可以创建两套一模一样的窗口,点击切换时终止一个再调用另一个。
菜单命令的响应需要回调 lisp 函数,以函数的指针为参数,lisp 又不支持指针,还没想出来怎么操作,需要大神的参与或大家一起研究怎么处理。
我能想到的办法有以下几个:
1找到 lisp 的函数指针。例如,在命令行里用 !setq ,可以查到 setq 的函数的一个编号,但不知道和指针的关系
2通过 C# 或 C++ 设置一个外部函数,这个函数指针可以得到,再通过这个函数向命令行发送字符串来回调 lisp
3通过 API 或 dwx 函数设置回调函数

zark 发表于 2018-9-23 21:42:22

http://bbs.mjtd.com/thread-113505-1-1.html

http://bbs.mjtd.com/forum.php?mod=attachment&aid=ODc5MDV8MzRjYzViZjd8MTUzNzcwOTk0NXwyNzEwMTl8MTEzNTA1&noupdate=yes


避开API,兼容性会不会更强点;P

Kye 发表于 2018-6-24 07:31:18

谢谢分享,给论坛注入了新能量,长知识了,这个也能实现DCL非模态对话框吧?

xinxirong 发表于 2018-6-24 07:48:45

模块转非模块哪有那么容易。另外菜单命令的实现呢?

土木燃 发表于 2018-6-26 09:30:22

膜拜大神!!!!!!!!6666

张大锤 发表于 2018-6-26 15:25:20

还没学到DCL 对话框 但是 第一个调用DCL 就是我的开门砖

oistre 发表于 2018-8-7 12:49:56

看到版主的教程,慢慢研究,谢谢谢谢

baitang36 发表于 2020-7-18 09:53:30

学习了,很不错的功能。dwx给lisp加上了翅膀

陨落 发表于 2020-7-24 15:23:07


纯lisp+外部exe实现,无视cad版本限制。
页: [1] 2
查看完整版本: DCL对话框添加菜单——API应用2