当前位置: 首页 > news >正文

制作可点击的异形窗口(1)

设计丢来一个系统升级界面UI图,是个异形窗口,即有窗体圆角又有个火箭头凸出来,挺带感的。旧貌换新颜,这事值一做。

一. 预处理

首先想到的实现方式是填个底色,然后设置窗体的TransparentColor为该底色即可,毕竟软件启动时的splash屏就是这么实现的。
在PhotoShop里填充上黄色底色:


导出为WEB格式时,选择PNG8格式,并仔细裁剪掉边缘杂色。最后存储为png图像文件。

二. 通过TransparentColor属性实现异形窗体

设置窗体TransparentColor=true、TransparentColorValue=黄色底色,补上点击和窗体移动代码,运行测试效果。


显示效果倒是实现了,但有一个问题:点击窗体上半部分会穿透到下层窗口,下半部分却能正常响应。反复测试发现该现象与图片的宽高比例关系不大。

三. 通过RGN实现异形窗体

既然点击不正常,而delphi窗体自带的的实现方法不便修改,那就换种实现方式:直接读取像素信息,把底色对应的区域从窗体 RGN 中剔除。
快速撸了一段实现代码:

procedure TfrmUpdate.FormCreate(Sender: TObject); var bmp: TBitmap; FullRgn, LineRgn: HRGN; x, y, StartX: Integer; Row: PRGBTriple; //从ScanLine读取像素 IsTransparent: Boolean; TargetB, TargetG, TargetR: Byte; begin ClientWidth := Image1.Width; ClientHeight := Image1.Height; //底色的RGB分量 TargetB := $00; TargetG := $D8; TargetR := $FF; bmp := TBitmap.Create; try bmp.Assign(Image1.Picture.Graphic); //24位色深度,让PRGBTriple准确对位 bmp.PixelFormat := pf24bit; //初始化一个空RGN FullRgn := CreateRectRgn(0, 0, 0, 0); //水平扫描线像素 for y := 0 to bmp.Height - 1 do begin //依当前图片特性优化计算,跳过没有透明色的区域。其他图片注释掉这两行 if (y > 55) and (y < bmp.Height - 8) then Continue; Row := bmp.ScanLine[y]; //获取当前行的内存指针 x := 0; while x < bmp.Width do begin //判断是否为底色(透明色) IsTransparent := (Row.rgbtBlue = TargetB) and (Row.rgbtGreen = TargetG) and (Row.rgbtRed = TargetR); //如果是透明色,一直往右找直到找到不透明的像素 while (x < bmp.Width) and IsTransparent do begin Inc(x); Inc(Row); if x < bmp.Width then IsTransparent := (Row.rgbtBlue = TargetB) and (Row.rgbtGreen = TargetG) and (Row.rgbtRed = TargetR); end; //记录这段不透明区域的起点X坐标 StartX := x; //从不透明像素起往右找,直到再次遇到透明色或到达边界 while (x < bmp.Width) and (not IsTransparent) do begin Inc(x); Inc(Row); if x < bmp.Width then IsTransparent := (Row.rgbtBlue = TargetB) and (Row.rgbtGreen = TargetG) and (Row.rgbtRed = TargetR); end; //将这段不透明的水平线段(StartX 到 x)加到RGN if StartX < x then begin //创建一个1像素高的矩形区域 (左闭右开:y到y+1) LineRgn := CreateRectRgn(StartX, y, x, y + 1); //将这个细长条合并到总区域中 (RGN_OR并集) CombineRgn(FullRgn, FullRgn, LineRgn, RGN_OR); DeleteObject(LineRgn); end; end; end; //依当前图片特性优化计算,将没有透明色的区域加入RGN LineRgn := CreateRectRgn(0, 55, bmp.Width, bmp.Height - 8); CombineRgn(FullRgn, FullRgn, LineRgn, RGN_OR); DeleteObject(LineRgn); //计算完毕将RGN应用到窗体 SetWindowRgn(Handle, FullRgn, True); DeleteObject(FullRgn); finally bmp.Free; end; end;

运行后功能正常,达到要求的效果。

四. 针对PNG8位色优化

既然用的PNG图片,没必须再转一次24位色的bmp来计算,直接基于8位索引色的PNG图片来运算性能更佳。
首先,要处理下图片,将底色转为透明。

http://www.jsqmd.com/news/1136398/

相关文章:

  • Protocol Buffers医疗数据交换架构:如何用二进制序列化技术重构HL7/FHIR标准
  • 如何快速部署视频流转发工具:5步掌握go2rtc完整配置指南
  • 如何快速构建高质量多模态训练数据:MiniCPM-V数据标注实战指南
  • CosyVoice_For_Windows社区贡献指南:如何参与项目开发和改进
  • 从炼丹到实验管理:用软件工程方法论管理 AI 实验
  • 告别传统监控延迟:用go2rtc构建实时WebRTC视频流系统
  • 当网络不再是黑盒:一本开源教材如何重新定义计算机网络的系统思维
  • docker-http-https-echo高级技巧:自定义端口、证书与CORS设置全攻略
  • Fabric Loader国际化:多语言支持与本地化实现完整指南
  • 分支与合并完全指南:git_training教你如何优雅管理代码分支
  • Cloudflare NoIP Alternative 企业级应用:在中小型企业中的部署方案
  • 网页监控终极指南:3分钟掌握changedetection.io完整配置教程
  • Boss Show Time终极指南:如何用时间可视化插件提升求职成功率5倍
  • 高级故障排除指南:CC Switch跨平台AI服务代理技术深度解析
  • Baserow CI/CD流水线终极指南:企业级自动化测试与部署完整方案
  • VLC媒体播放器完整指南:如何免费播放任何视频格式
  • 3个秘诀:如何用Notepad--打造你的专属中文编辑神器
  • 深度解析Agent Zero模型配置:从架构原理到性能调优的完整指南
  • 让AI成为你的Obsidian知识管家:obsidian-skills完全指南
  • Mono.Cecil:深入.NET程序集操作的5个关键技术解析
  • Goldleaf 终极指南:如何用这款Switch自制工具彻底解放你的游戏主机
  • 突破浏览器限制:text-encoding如何实现GBK/Shift_JIS等传统编码支持
  • 3个关键步骤彻底解决Handy语音转文字应用安装问题
  • docopt.rs源码解析:Rust命令行参数解析器的核心组件与设计模式深度剖析
  • 3分钟上手:用ComfyUI-WanVideoWrapper开启你的AI视频创作之旅
  • 5分钟快速上手Boss Show Time:求职者的招聘时间可视化助手
  • 实景三维动态预警研判——城市安防视频孪生一体化指挥调度底层技术
  • 高效B站视频下载利器:bilidown完整使用指南
  • LLMLingua提示压缩终极指南:3大版本如何帮你节省90%的AI成本
  • 端侧AI部署优化:MiniCPM-V在移动设备上的高性能推理与量化压缩技术指南