明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4408|回复: 15

[经验] DCL对话框透明效果——API应用1

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

LISP+DWX 可调用 Windows API   几乎无所不能,以下代码实现窗口透明。

dwx 插件请搜索本论坛下载。



  1. ;;DCL 窗口透明化示例
  2. ;; by. yxp_xa   2018年6月22日
  3. (defun c:sss( / k)
  4. (setq dcl_id (load_dialog "sss.dcl"))
  5. (if (not (new_dialog "sss" dcl_id))(exit))
  6. (setq k "S01" px (dimx_tile k) py (dimy_tile k))
  7. (start_image k)
  8. (fill_image 0 0 px py 181)
  9. (end_image)
  10. (action_tile "S02" "(fun_s_02)")
  11. (setq next (start_dialog))
  12. (unload_dialog dcl_id)
  13. (princ)
  14. )


  15. ;;透明
  16. (defun fun_s_02()
  17. (setq DWX (vlax-create-object "DynamicWrapperX"))
  18. (vlax-invoke DWX 'Register "user32" "FindWindowExW" "i=hhhw" "r=m")
  19. (vlax-invoke DWX 'Register "user32" "GetWindowLongW" "i=hl" "r=l")
  20. (vlax-invoke DWX 'Register "user32" "SetWindowLongW" "i=hll" "r=l")
  21. (vlax-invoke DWX 'Register "user32" "SetLayeredWindowAttributes" "i=hlbl" "r=b")
  22. (setq dcl (vlax-invoke DWX 'FindWindowExW 0 0 0 "DCL窗口透明示例"))
  23. (setq Ele (vlax-invoke DWX 'GetWindowLongW dcl -20))
  24. (vlax-invoke DWX 'SetWindowLongW dcl -20 (Boole 6 Ele 524288))
  25. (vlax-invoke DWX 'SetLayeredWindowAttributes dcl 16744351 10 1)
  26. )

  27. (princ)


源码下载:

dwx自动注册工具下载:

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2018-6-24 10:45 来自手机 | 显示全部楼层
本帖最后由 yxp 于 2018-6-24 12:14 编辑

原理很简单,天气预报背景地图和卫星云图就是后期做的,记得有一次女主持人穿了和背景幕布相近颜色的裙子,结果裙子也被半透明了,会声会影软件就有这个功能。

具体到数字算法就是颜色数的异或运算,(boole 6 x hex80000),本例中背景索引颜色是181,转换为真彩色是16744351,可以用函数 dcl-GetOLEColorValue (OpenDCL 函数)或自定义函数进行转换。16进制80000(API 常数)转换为十进制524288。异或运算时,相近的颜色数 x 也会被计算到透明色(或阿尔法通道)附近,这就是透明度的概念。0是全透明,300(好像)是不透明,代码中颜色数后面的参数10就是透明度,所以裙子颜色如果和背景颜色相近,颜色数相差小于300,就会被透明化。理解了这个, PS 软件的颜色通道和蒙版也就是这个原理。

本例子用了四个 API 函数:
FindWindowExW 函数可以获取 DCL 对话框的句柄;表示查找名字叫 “xxx” 的窗口,中文编码的 API 窗口函数后面都有个 W,英文编码后缀是 A,所以本例子不能在英文版系统下运行,如果需要可以,用 API 判断窗口是 ANSI 还是 Unicode 编码,再调用对应的 API 函数。
GetWindowLongW 函数获取对话框属性的指针;
SetWindowLongW 函数设置窗口透明的扩展属性;窗口透明通道属性是 Win2000 才开始引入的,因此标准对话框没有这个属性,需要时可以特别添加,对应 API 参数为 -20 固定值,这些参数都可以百度到;
SetLayeredWindowAttributes 函数设置经过窗口透明通道的颜色数、透明度,第三个参数 1 表示用透明色,如果是 2 表示使用 阿尔法 通道来透明化。

发表于 2018-6-23 22:11 | 显示全部楼层
仰慕版主啊 感谢分享源码!保存备用中,因为现还是小白,领悟不到其中奥妙
发表于 2018-6-23 10:09 | 显示全部楼层
令:  SSS ; 错误: 参数类型错误: VLA-OBJECT nil
发表于 2018-6-23 06:13 | 显示全部楼层
大神最近高产!
发表于 2018-6-23 08:23 | 显示全部楼层
调用 winapi 这个就强大太多了
发表于 2018-6-23 08:50 | 显示全部楼层
版主强大  还能做到这样 就是看不懂
发表于 2018-6-23 23:36 | 显示全部楼层
DynamicWrapperX 控件能否实现多选文件
发表于 2018-6-24 08:27 | 显示全部楼层

版主强大  还能做到这样 就是看不懂
发表于 2018-6-26 09:31 | 显示全部楼层
仰慕版主啊 感谢分享源码!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 21:46 , Processed in 0.566669 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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