明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3900|回复: 11

[资源] DCL对话框添加菜单——API应用2

[复制链接]
发表于 2018-6-23 23:35 | 显示全部楼层 |阅读模式
本帖最后由 yxp 于 2018-6-24 03:12 编辑

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

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

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


源码下载:

dwx自动注册工具下载:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 收起 理由
hhh454 + 1 很给力!
自贡黄明儒 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2018-6-24 12:38 | 显示全部楼层
本帖最后由 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 函数设置回调函数
发表于 2018-9-23 21:42 | 显示全部楼层
http://bbs.mjtd.com/thread-113505-1-1.html




避开API,兼容性会不会更强点
发表于 2018-6-24 07:31 来自手机 | 显示全部楼层
谢谢分享,给论坛注入了新能量,长知识了,这个也能实现DCL非模态对话框吧?
发表于 2018-6-24 07:48 来自手机 | 显示全部楼层
模块转非模块哪有那么容易。另外菜单命令的实现呢?
发表于 2018-6-26 09:30 | 显示全部楼层
膜拜大神!!!!!!!!6666
发表于 2018-6-26 15:25 | 显示全部楼层
还没学到DCL 对话框 但是 第一个调用DCL 就是我的开门砖
发表于 2018-8-7 12:49 | 显示全部楼层
看到版主的教程,慢慢研究,谢谢谢谢
发表于 2020-7-18 09:53 | 显示全部楼层
学习了,很不错的功能。dwx给lisp加上了翅膀
发表于 2020-7-24 15:23 | 显示全部楼层

纯lisp+外部exe实现,无视cad版本限制。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 04:00 , Processed in 0.294835 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表