【杂项】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 桌面窗口控制着所有顶层窗口的行为。本部分不再重复介绍,有以下链接可参考

注:上述链接对于顶层窗口,子窗口等术语的定义会存在出入,一切以 Windows App Development 为准。

问题背景

to be continued…


【杂项】Windows 异形窗体改造
https://jalencui.com/2024/09/17/Windows-HeteroTypeWindow/
Author
Jalen Cui
Posted on
September 17, 2024
Licensed under