开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 429|回复: 6
收起左侧

[分享] 发现一个不使用 DLL 和易模块即可实现无边框窗口阴影的方法

[复制链接]
结帖率:100% (16/16)
发表于 2025-1-4 15:32:51 | 显示全部楼层 |阅读模式   辽宁省*
本帖最后由 gytxtx 于 2025-1-4 15:34 编辑

我发现,将窗口的类名设置为 #32768 之后运行程序即可实现无边框窗口阴影效果

1111.png

1111.png

无需使用任何代码、DLL、易模块,仅修改窗口类名即可应用此效果

但是在我的测试中,修改了类名后,载入窗口后在窗口上的鼠标指针会显示为 “忙”  (就是易语言的沙漏型),但在交互(比如鼠标移入移出、被单击时)窗口内任意一个控件后,鼠标指针又恢复正常了


解决办法:将鼠标指针设置为 1. 标准箭头型 ( { 1 } ) 即可解决此问题

原理

抓取了 Windows 资源管理器 的文件右键菜单的类名,并将它应用在自己的无边框窗口中

1111.png

需要注意的

如果窗口边框非无边框窗口,则在窗口阴影的渲染上会出现问题:

1111.png

1111.png



参考 (来源于 ChatGPT)

你发现的这个方法利用了 Windows 系统对特定窗口类名的默认行为,非常有趣!尤其是直接通过将窗口类名改为 #32768(即系统菜单类名)来实现无边框窗口阴影的效果,确实是一种巧妙且无需额外代码的实现方式。不过也有一些需要注意的事项,我会针对你的问题和分享的内容做一些总结和补充:


方法总结

  1. 窗口阴影的实现原理

    • Windows 系统默认对某些类名的窗口启用阴影效果,比如 #32768
    • #32768 类名通常用于弹出菜单或对话框等系统窗口,Windows 自动为这些窗口应用阴影。
    • 将自己的窗口类名设置为 #32768 后,系统会认为该窗口是一个弹出菜单或类似的窗口,并为其应用阴影效果。
  2. 鼠标指针显示为“忙”问题

    • 这是因为窗口的默认类行为与普通窗口不同,系统可能认为该窗口在加载或等待操作。
    • 解决方法:如你所说,手动将鼠标指针设置为标准箭头型即可恢复正常。
      ```易语言
      调用 API 函数 取系统指针 (#IDC_ARROW, 真)
  3. 边框窗口的渲染问题

    • 由于阴影的渲染方式是针对无边框窗口设计的,当窗口有边框时,系统可能会错误地渲染阴影或显示重叠效果。
    • 解决方法:确保窗口是无边框样式,或根据需要调整窗口样式。

优点

  • 简单高效:仅需修改类名即可实现,而不需要额外的代码或依赖。
  • 无外部依赖:不需要加载 DLL、模块或其他第三方工具。
  • 兼容性好:这种方法利用了系统本身的功能,在不同版本的 Windows 系统中应该具有较好的兼容性。

局限性

  1. 类名修改的副作用

    • 修改类名为 #32768 会让系统认为该窗口是菜单或类似窗口,这可能会导致一些默认行为改变,如鼠标指针变为“忙”状态,或其他潜在的不一致行为。
  2. 样式限制

    • 仅适用于无边框窗口。如果窗口带有边框,阴影效果可能会失真或显示异常。
  3. 可维护性

    • 对于复杂项目,这种方法可能会影响窗口的其他交互逻辑,因此需要谨慎使用。

原理分析

Windows 系统为特定的窗口类(如 #32768)定义了默认的样式和行为。这些类通常用于弹出菜单、工具提示或对话框等短暂窗口。将你的窗口类名改为 #32768,本质上是欺骗系统,让系统认为你的窗口是特定类型的菜单窗口,从而自动为其启用阴影效果。


优化建议

如果需要更灵活地实现阴影效果,同时避免修改类名的副作用,可以考虑以下方法:

  1. 使用 Windows API 手动启用阴影

    • 调用 DwmExtendFrameIntoClientArea 来扩展窗口的阴影区域。
    • 示例代码:
      MARGINS margins = {1, 1, 1, 1};  // 阴影边距
      DwmExtendFrameIntoClientArea(hwnd, &margins);
  2. 通过第三方框架实现阴影

    • 使用一些专门的库或工具,可以更灵活地为窗口添加阴影。
  3. 使用窗口样式

    • 确保窗口样式为无边框(WS_POPUP),并尝试调整窗口的其他属性以达到类似效果。

总结

你的方法简单有效,对于需要快速实现无边框窗口阴影的情况是一个好选择。但如果涉及更复杂的交互逻辑或项目需求,建议结合其他方式来避免可能的副作用。

另外,鼠标指针变成“忙”的问题,通过手动设置鼠标指针的确可以解决,这也算是一种小小的工作量换取简单实现的方法!



点评

ggnb!!!   河北省邯郸市  发表于 2025-1-4 18:35

评分

参与人数 2好评 +2 精币 +4 收起 理由
maozaiba + 1 + 3 奇淫技巧
圆圈 + 1 + 1 新技能已get√

查看全部评分

本帖被以下淘专辑推荐:

  • · 收藏|主题: 240, 订阅: 6
结帖率:99% (146/147)

签到天数: 8 天

发表于 23 分钟前 | 显示全部楼层   山东省烟台市
win7系统无效果
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 12 天

发表于 2025-1-5 08:54:24 | 显示全部楼层   山东省*
gytxtx 发表于 2025-1-4 17:23
这是窗口属性页面

谢谢了,可以了
回复 支持 反对

使用道具 举报

结帖率:100% (16/16)

签到天数: 18 天

 楼主| 发表于 2025-1-4 17:23:05 | 显示全部楼层   辽宁省*
Daen 发表于 2025-1-4 17:02
为啥我测试没有效果啊,能截图一下窗口属性页面吗,我是Windows11

这是窗口属性页面
sc.png

还有一个很神奇的点:把窗口设置为这个类名后,使用 Spy++ 就不能查看窗口信息了
what.png
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 12 天

发表于 2025-1-4 17:02:30 | 显示全部楼层   山东省*
为啥我测试没有效果啊,能截图一下窗口属性页面吗,我是Windows11
回复 支持 反对

使用道具 举报

结帖率:99% (88/89)

签到天数: 18 天

发表于 2025-1-4 16:25:15 | 显示全部楼层   安徽省宿州市
VX截图_20250104162202.png
亲测有效,但是这种阴影效果不太好,不是发散型的

回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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