【杂项】Windows 异形窗体改造
一、需求背景
Windows 客户端需要支持非规则窗体的视觉效果。同时,需要保留窗口的缩放、鼠标穿透、跨屏拖放等交互效果。
二、技术点
技术点1:异形窗体
使用透明控件扩充主窗口四周,以达到不规则图形超出客户区而不被裁剪的目的。同时,能保证窗口不受因缩放造成的抖动或闪烁。
技术点2:鼠标穿透至桌面
鼠标穿透可借助透明区域裁剪操作。其中,区域计算涉及布尔运算,图片掩码等图形学操作。
技术点3: 窗体缩放
- 窗体样式: WS_OVERLAPPED | WS_MAXIMIZEBOX | WS_MINIMIZEBOX
- 鼠标输入通知: WM_NCHITTEST 是鼠标时间的入口。其返回值:HTCAPTION, HTTOP, HTTOPRIGHT…
- 窗体通知: WM_SIZING | WM_MOVING | WM_ENTERSIZEMVOE | WM_EXITSIZEMOVE | WM_GETMINMAXINFO | WM_NCLBUTTONDBLCLK | WM_NCCALCSIZE
注:本部分仅列出实现功能所涉及的 window style, window notifications 和 window messages.
三、 疑难点
疑难点1: 桌面顶部停靠
当窗口移动时,顶部透明区域需要被裁剪:WM_MOVING, WM_EXITSIZEMOVE
疑难点2: 裁剪与缩放的冲突
当窗体缩放时,需要取消裁剪操作以避免窗体抖动:WM_SIZING | WM_NCCALCSIZE | WM_NCHITTEST
疑难点3: 跨屏窗体异常
当拖动窗体跨越具有不同 DPI 的屏幕时,需要刷新窗口:WM_ENTERSIZEMOVE | WM_EXITSIZEMOVE | QWindow::screenChanged
注:本部分仅列出解决问题需要的 window notifications 和 一些接口。
四、剖析
前言
本部分仅对 1 例疑难点处理作简要分析,其它同理。
基本常识
windows 桌面窗口控制着所有顶层窗口的行为。本部分不再重复介绍,有以下链接可参考
- https://blog.csdn.net/tonglin12138/article/details/103967711
- https://www.cnblogs.com/staring-hxs/p/3202219.html
注:上述链接对于顶层窗口,子窗口等术语的定义会存在出入,一切以 Windows App Development 为准。
问题背景
to be continued…
【杂项】Windows 异形窗体改造
https://jalencui.com/2024/09/17/Windows-HeteroTypeWindow/