从交互范式到架构实现,系统拆解 Docking 框架的设计哲学、工程路径与前沿演进
摘要
窗口停靠与分离(Docking & Floating)是现代桌面应用与 Web IDE 中高频使用的交互模式。它允许用户将面板从主窗口中拖出成为独立窗口,再拖回重新停靠,从而在多显示器环境下灵活组织工作空间。本文以"拖拽状态机—布局序列化—跨窗口渲染—多屏适配"为主线,系统剖析 Docking 框架的架构原理与工程实现路径,覆盖 Qt Advanced Docking System、Electron、Golden Layout、Dockview 等主流技术栈,并结合多显示器 DPI 缩放、布局持久化、性能优化等实际痛点给出可落地的解决方案。文章还引入笔者提出的"布局意图连续性"分析视角,探讨 AI 驱动自适应布局的前沿方向。
关键词:窗口停靠;面板分离;多显示器;布局序列化;DPI 适配;Docking 框架
目录
一、问题域界定:为什么停靠与分离是双屏刚需
1.1 多显示器普及带来的交互范式迁移
根据 StatCounter 2024 年全球分辨率统计,1920×1080 仍占约 22%,但 2560×1440 及以上分辨率合计已超过 20%,且多显示器配置在开发者群体中的渗透率持续攀升。笔者查阅 Stack Overflow Developer Survey 2023 数据发现,约 42% 的专业开发者使用两台及以上显示器。这一硬件现实直接催生了一个交互需求:用户希望把工具面板、代码编辑器、终端、调试器等从主窗口中"拽"出来,放到第二块屏幕上独立显示。
传统的 MDI(Multiple Document Interface)或简单分屏方案无法满足这种需求——它们把面板锁死在主窗口内部,用户只能通过调整分割条来分配空间。而 Docking 机制允许面板脱离主窗口的物理边界,成为操作系统层面的独立顶层窗口,这才是真正的"双屏刚需"。
1.2 核心概念澄清
在展开讨论之前,有必要厘清几个容易混淆的概念:
- Dock(停靠):面板嵌入主窗口的某个停靠区域(上/下/左/右/中央),与主窗口共享同一个顶层窗口句柄。
- Float(浮动/分离):面板脱离主窗口,拥有独立的操作系统窗口句柄,可自由移动、缩放,甚至跨显示器。
- Tab(标签页):多个面板共享同一停靠区域时,以标签页形式叠放。
- Auto-hide(自动隐藏):面板收起为边缘条,鼠标悬停时滑出。
本文评述:这四个概念构成了 Docking 系统的状态空间。工程实现的关键挑战不在于单个状态的渲染,而在于状态之间的平滑迁移——尤其是 Dock ↔ Float 的双向转换,涉及窗口句柄的创建/销毁、渲染上下文的迁移、布局树的重新平衡,是整个系统中最容易出 bug 的环节。
1.3 典型应用场景
二、交互模型:拖拽状态机与命中检测
2.1 拖拽状态机的形式化描述
一次完整的"拖出—停靠"操作,在交互层面可以建模为一个有限状态机(FSM)。笔者认为,理解这个状态机是掌握 Docking 系统行为的关键。以下是笔者归纳的状态转移模型:
状态集合 S = { Idle, DragStarted, Dragging, HoverDockTarget, DropToDock, DropToFloat, Cancelled }
转移规则:
Idle --[mousedown on tab]--> DragStarted
DragStarted --[move > threshold]--> Dragging
DragStarted --[mouseup]--> Idle
Dragging --[enter dock zone]--> HoverDockTarget
Dragging --[leave window bounds]--> DropToFloat (预览)
HoverDockTarget --[mouseup]--> DropToDock
Dragging --[mouseup outside]--> DropToFloat
Dragging --[ESC]--> Cancelled
Cancelled --> Idle (恢复原布局)
这个状态机看似简单,但在实际工程中,每个转移都需要处理大量边界情况。例如,DragStarted → Dragging 的阈值判定(通常为 4-8 像素)直接影响用户体感:阈值太小会导致误触,太大则感觉拖拽"粘滞"。
本文评述:阈值的选择并非纯经验问题。根据 Fitts 定律的扩展研究,拖拽启动阈值与目标面板尺寸存在相关性。笔者建议采用自适应阈值:threshold = clamp(4, 0.02 * min(width, height), 12),在面板较小时降低阈值以提升响应感,面板较大时提高阈值以避免误触。
2.2 停靠区域的命中检测
当用户拖拽面板经过主窗口时,系统需要实时判断当前光标位置对应哪个停靠目标。主流实现采用"停靠指示器"(Dock Indicator / Drop Guide)模式:在光标附近绘制一个半透明的菱形或十字形覆盖层,将目标区域划分为上、下、左、右、中央五个投放区。
命中检测的算法核心是:给定光标坐标 (x, y) 和目标矩形 (rx, ry, rw, rh),计算归一化偏移量,再根据偏移量落入的扇区确定停靠方向。Qt Advanced Docking System 采用的是基于距离权重的方案,而 Visual Studio 的实现则使用了更复杂的"嵌套停靠"逻辑,支持在已有面板内部继续分割。
工程提示:命中检测的性能至关重要。在拖拽过程中,每帧都需要重新计算,如果使用朴素的遍历所有停靠区域的方式,面板数量多时会出现明显卡顿。建议使用空间索引(如 R-tree 或简单的网格划分)加速查询。
2.3 拖拽过程中的视觉反馈
优秀的 Docking 实现会在拖拽过程中提供三层视觉反馈:
- 拖拽幽灵(Drag Ghost):跟随光标的半透明面板缩略图,让用户知道"正在拖什么"。
- 停靠指示器(Dock Guide):显示"会停到哪里"。
- 目标区域高亮:被停靠的面板区域轻微变色,确认"谁会被影响"。
这三层反馈缺一不可。笔者在实际项目中发现,缺少拖拽幽灵会导致用户对拖拽操作产生不确定感,尤其是在跨窗口拖拽时,因为光标可能已经离开源窗口的可视区域。
三、架构解剖:Docking 框架的核心组件
3.1 布局树:一切的核心数据结构
几乎所有成熟的 Docking 框架都采用树形结构来描述布局。这棵树通常包含三种节点类型:
- Split Node(分割节点):表示水平或垂直分割,包含方向、比例和子节点列表。
- Tab Group Node(标签组节点):包含多个面板,同一时刻只显示一个。
- Panel Node(面板叶节点):实际的内容载体,对应一个具体的视图组件。
以 Golden Layout 为例,其布局树使用 JSON 描述,每个节点有 type 字段标识节点类型,content 字段存储面板元数据。这种设计的好处是序列化/反序列化非常自然——直接 JSON.stringify 即可持久化。
3.2 组件分层架构
从工程视角看,一个完整的 Docking 系统可以划分为以下层次:
本文评述:这种分层架构的核心价值在于关注点分离。交互层不需要知道布局树的具体结构,布局层不需要关心渲染细节,窗口层不需要理解业务逻辑。但在实际项目中,很多团队为了快速上线,往往把这几层揉在一起,导致后期维护成本急剧上升。笔者建议从第一天就严格分层,哪怕初期代码量会增加 30%。
3.3 面板注册与生命周期
每个可停靠面板都需要在框架中注册,注册信息通常包括:唯一 ID、标题、图标、默认位置、最小尺寸、是否可关闭/可浮动等。面板的生命周期涉及创建、激活、停用、销毁四个阶段,其中"停用"不等于"销毁"——当面板被其他标签页遮挡时,它应该被停用但保留状态,以便快速切换回来。
Qt Advanced Docking System 通过 CDockWidget 类管理面板生命周期,其 toggleView() 方法控制可见性而不销毁组件。Electron 生态中的 Dockview 则使用 React 组件的挂载/卸载机制,配合 keepAlive 选项来决定是否保留 DOM。
四、布局序列化:从内存树到持久化格式
4.1 序列化格式设计
布局持久化是 Docking 系统的"记忆"能力。用户精心调整的布局,下次打开应用时应该原样恢复。这要求序列化格式满足三个条件:完整(不丢失任何布局信息)、紧凑(不产生过大存储开销)、可迁移(版本升级后能兼容旧格式)。
以下是笔者推荐的一种布局序列化 JSON 结构(以模拟数据为例):
{
"version": "2.1.0",
"layout": {
"type": "split",
"direction": "horizontal",
"ratio": 0.25,
"children": [
{
"type": "tabgroup",
"activeIndex": 0,
"panels": [
{ "id": "explorer", "title": "资源管理器", "closable": true },
{ "id": "outline", "title": "大纲", "closable": true }
]
},
{
"type": "split",
"direction": "vertical",
"ratio": 0.7,
"children": [
{ "type": "panel", "id": "editor", "title": "编辑器" },
{ "type": "panel", "id": "terminal", "title": "终端" }
]
}
]
},
"floatingWindows": [
{
"bounds": { "x": 1920, "y": 0, "width": 800, "height": 600 },
"displayId": "DISPLAY2",
"layout": { "type": "panel", "id": "preview", "title": "预览" }
}
]
}
本文评述:注意 floatingWindows 字段中记录了 displayId,这是多屏场景下的关键设计。仅记录绝对坐标是不够的——当用户拔掉第二块显示器后,恢复布局时窗口可能出现在屏幕外。记录显示器标识,可以在显示器不可用时将窗口回退到主屏。
4.2 版本迁移策略
布局格式会随产品迭代而演进。新增字段、废弃字段、改变语义都是常见情况。工程上需要一套版本迁移机制:读取旧版本布局时,逐版本应用迁移函数,最终转换为当前版本格式。
笔者建议采用"迁移链"模式:v1→v2→v3→current,每个迁移函数只负责相邻版本之间的转换。这样新增版本时只需添加一个迁移函数,而不需要修改所有旧版本的兼容逻辑。
4.3 布局恢复的容错处理
恢复布局时可能遇到多种异常:面板 ID 不存在(插件被卸载)、显示器配置变化、布局数据损坏等。健壮的实现应该遵循"尽力恢复"原则:能恢复的部分尽量恢复,无法恢复的部分回退到默认位置,而不是整个布局重置。
实践案例:Visual Studio Code 在布局恢复时,如果检测到某个视图的扩展已被禁用,会将该视图从布局树中移除,同时保持其他视图的位置不变。这种"局部降级"策略比"全局重置"的用户体验好得多。
五、跨窗口渲染:分离窗口的生命周期管理
5.1 原生窗口 vs 模拟窗口
面板分离后,实现方式有两种路线:
- 原生顶层窗口:调用操作系统 API 创建真正的窗口句柄(如 Windows 的
CreateWindowEx、macOS 的NSWindow)。优点是支持操作系统级特性(贴边、任务栏、窗口管理),缺点是需要处理跨进程/跨线程渲染。 - 模拟窗口:在主窗口内用绝对定位的 div 模拟浮动面板。优点是实现简单、渲染统一,缺点是无法真正脱离主窗口边界,多屏场景下体验差。
本文评述:对于双屏刚需场景,必须选择原生窗口路线。模拟窗口在多显示器环境下会暴露致命缺陷——用户无法将面板拖到另一块屏幕上。Electron 的 BrowserWindow 和 Qt 的 QMainWindow 都提供了原生窗口能力,应当充分利用。
5.2 渲染上下文迁移
当面板从停靠状态变为浮动状态时,其渲染上下文需要从主窗口迁移到新窗口。这个过程在不同技术栈中的复杂度差异很大:
Qt 的方案最为简洁,因为 Qt 的窗口系统本身就是基于父子关系的,setParent(nullptr) 即可将控件变为顶层窗口,再设置 Qt::Window 标志即可。Web 方案则复杂得多,因为 DOM 节点在跨窗口移动时会丢失事件监听器和组件状态。
5.3 跨窗口拖拽的实现细节
跨窗口拖拽是 Docking 系统中最具挑战性的部分。当用户将面板从主窗口拖出时,系统需要:
- 检测光标离开主窗口边界(
mouseleave或全局鼠标钩子)。 - 创建新的顶层窗口,将面板内容迁移过去。
- 将后续鼠标事件路由到新窗口(或使用全局钩子继续跟踪)。
- 当用户将窗口拖回主窗口区域时,检测停靠意图并执行反向迁移。
在 Electron 中,可以使用 screen.getCursorScreenPoint() 获取全局光标位置,配合 win.setBounds() 实时更新浮动窗口位置。Qt 则通过 QDrag 和 dragMoveEvent 实现类似效果。
六、多屏适配:DPI 缩放与坐标系转换
6.1 多显示器 DPI 差异问题
现代多屏配置中,不同显示器的 DPI 往往不同。例如,笔记本内屏可能是 225 PPI(缩放 200%),外接显示器是 92 PPI(缩放 100%)。当用户将面板从内屏拖到外屏时,如果不做处理,面板会突然变大或变小。
根据 Microsoft 的 Per-Monitor DPI Awareness 文档,Windows 应用需要声明 DPI 感知级别,并在 WM_DPICHANGED 消息中调整窗口尺寸。Qt 6 通过 QScreen::devicePixelRatio() 提供每屏幕的缩放因子,Electron 则通过 screen.getDisplayNearestPoint() 获取显示器信息。
6.2 坐标系转换矩阵
在多屏环境下,存在多套坐标系:逻辑坐标(与 DPI 无关)、物理坐标(像素级)、屏幕坐标(跨显示器的全局坐标)。它们之间的转换是 Docking 系统必须正确处理的基础设施。
笔者归纳的转换关系如下:
物理坐标 = 逻辑坐标 × devicePixelRatio 屏幕坐标 = 物理坐标 + 显示器原点偏移 逻辑屏幕坐标 = 屏幕坐标 / 目标显示器 devicePixelRatio
本文评述:很多 Docking 实现在跨屏拖拽时出现"窗口跳跃"或"尺寸突变",根源就在于坐标系转换时使用了错误的 DPI 因子。正确的做法是:在拖拽过程中持续检测光标所在的显示器,使用该显示器的 DPI 因子进行转换,而不是使用源窗口的 DPI。
6.3 显示器热插拔处理
用户在使用过程中可能拔掉或插入显示器。此时,位于被移除显示器上的浮动窗口需要被"抢救"回主屏。工程上需要监听系统的显示器变更事件:
- Windows:
WM_DISPLAYCHANGE消息 - macOS:
NSApplicationDidChangeScreenParametersNotification - Qt:
QGuiApplication::screenRemoved信号 - Electron:
screen.on('display-removed')事件
检测到显示器移除后,应遍历所有浮动窗口,将位于已移除显示器上的窗口移动到主显示器可见区域内,并触发一次布局重新计算。
七、技术栈横评:Qt / Electron / Web 方案对比
7.1 Qt Advanced Docking System
Qt Advanced Docking System(ADS)是目前 Qt 生态中最成熟的开源 Docking 框架,由德国开发者 Manuel Freiholz 维护。它提供了完整的停靠、浮动、自动隐藏、布局持久化功能,支持 Qt 5.12+ 和 Qt 6。
ADS 的核心类包括 CDockManager(管理器)、CDockWidget(面板)、CFloatingDockContainer(浮动容器)。其架构设计清晰,但代码量较大(约 3 万行),学习曲线较陡。
本文评述:ADS 的优势在于与 Qt 原生窗口系统的深度集成,浮动窗口是真正的原生窗口,多屏体验优秀。缺点是自定义 UI 风格需要修改源码,且文档相对简略。适合对稳定性要求高的商业项目。
7.2 Electron 生态方案
Electron 应用实现 Docking 有两条路线:一是使用 Web 版 Docking 库(如 Golden Layout、Dockview),二是基于 Electron 的多窗口 API 自行实现。
Golden Layout 是最早的 Web Docking 库之一,支持嵌套分割、标签页、弹出窗口。但其弹出窗口使用的是浏览器 window.open(),在 Electron 中需要额外配置才能获得原生窗口行为。Dockview 是较新的替代品,基于 React,API 更现代,对 TypeScript 支持更好。
本文评述:Electron 方案的最大挑战是状态同步。当面板在多个 BrowserWindow 之间移动时,React/Vue 的组件状态、Redux store、IPC 通道都需要同步迁移。笔者建议采用"状态提升 + 序列化传递"的模式:将面板状态存储在渲染进程之外(主进程或独立的状态服务),面板组件只负责渲染,不持有状态。
7.3 纯 Web 方案
纯 Web 环境(浏览器内)无法创建真正的操作系统窗口,只能使用 window.open() 打开新标签页或弹出窗口。这种方式在多屏场景下体验受限,但对于 Web IDE(如 CodeSandbox、StackBlitz)来说仍是可行方案。
随着 Window Management API 的推进,浏览器未来可能提供更强大的多窗口能力。根据 W3C 的 Window Placement 规范草案,getScreenDetails() API 允许网页获取多显示器信息并精确控制窗口位置。Chrome 自 2022 年起已提供实验性支持。
八、性能优化:渲染、内存与拖拽流畅度
8.1 拖拽帧率保障
拖拽操作对帧率极其敏感。研究表明,当帧率低于 30 FPS 时,用户会明显感知到卡顿;低于 20 FPS 时,操作会变得难以精确控制。Docking 系统在拖拽过程中需要同时处理:鼠标事件、命中检测、视觉反馈更新、布局预览计算。这些操作如果都在主线程同步执行,很容易掉帧。
优化策略包括:
- 事件节流:将 mousemove 事件节流到 requestAnimationFrame 节奏,避免每像素触发一次计算。
- 命中检测缓存:停靠区域的几何信息在拖拽开始时计算一次,拖拽过程中只做简单比较。
- 视觉反馈分层:拖拽幽灵使用 CSS transform 或 GPU 合成层,避免触发重排。
- 布局预览延迟:停靠指示器的更新可以略微延迟(16-32ms),优先保证拖拽幽灵的跟手性。
8.2 内存管理
每个面板背后可能是一个复杂的视图组件(如代码编辑器、图表、终端)。当面板被隐藏或浮动时,如果不当处理,可能导致内存泄漏或重复创建。
笔者建议采用"池化 + 懒加载"策略:面板组件在首次显示时创建,之后保留在内存池中;当面板被关闭时,标记为可回收而非立即销毁;当内存压力增大时,再批量回收长期未使用的面板。
8.3 大规模面板场景
在金融终端等场景中,面板数量可能达到数十个。此时布局树的深度和宽度都会显著增加,渲染和计算开销随之上升。优化手段包括:
- 虚拟化渲染:只渲染可视区域内的面板。
- 布局计算增量更新:只重新计算受影响的分支。
- 标签页懒渲染:非激活标签页的内容不渲染或使用轻量占位。
九、前沿预判:AI 驱动与自适应布局
9.1 布局意图连续性
笔者提出"布局意图连续性"(Layout Intent Continuity)这一分析视角:用户在调整布局时,其操作背后存在一个隐含的意图——"我想同时看到 A 和 B"、"我想让 C 占据更大空间"。传统的 Docking 系统只记录布局的几何状态,丢失了意图信息。如果系统能够推断并保持这种意图,就能在窗口尺寸变化、显示器配置变化时做出更智能的调整。
例如,用户将终端面板拖到编辑器下方,意图可能是"编辑时需要参考终端输出"。当用户切换到全屏时,系统可以自动保持编辑器和终端的可见比例,而不是简单地按像素比例缩放。
9.2 基于使用模式的自适应布局
结合用户行为数据,Docking 系统可以实现自适应布局。例如:
- 检测到用户频繁在调试时打开"变量"面板,自动将其停靠在编辑器右侧。
- 检测到用户经常将"预览"面板拖到第二屏,下次启动时主动提示"是否在第二屏打开预览"。
- 根据当前任务类型(编码/调试/测试)自动切换布局预设。
本文评述:这类功能需要谨慎设计,避免变成"烦人的助手"。核心原则是建议而非强制——系统可以提示或预选,但最终决定权在用户。同时需要提供清晰的"撤销"和"恢复默认"入口。
9.3 大语言模型在布局管理中的潜在应用
2023 年以来,LLM 在代码生成、UI 理解方面展现出强大能力。一个值得探索的方向是:用户用自然语言描述布局需求,系统自动生成布局配置。例如,用户输入"我要一个适合调试 Python 的布局",系统生成包含编辑器、终端、变量查看器、调用栈的布局方案。
根据笔者对现有研究的梳理,这一方向面临的主要挑战是:布局配置的搜索空间巨大,LLM 需要理解面板之间的语义关系(哪些面板适合放在一起),以及不同屏幕尺寸下的适配规则。目前尚无成熟的工程方案,但已有学术论文探讨基于强化学习的 UI 布局生成(如 2023 年 CHI 会议上的相关研究)。
十、工程实践清单与参考资源
10.1 从零实现 Docking 系统的步骤清单
- 定义布局树数据结构(Split / TabGroup / Panel 三种节点)。
- 实现布局树的渲染器(递归遍历,生成对应的 UI 组件)。
- 实现分割条拖拽调整比例。
- 实现标签页切换与拖拽排序。
- 实现拖拽状态机与命中检测。
- 实现停靠指示器视觉反馈。
- 实现面板分离(创建原生窗口)。
- 实现跨窗口拖拽与重新停靠。
- 实现布局序列化与反序列化。
- 实现多显示器 DPI 适配。
- 实现显示器热插拔处理。
- 性能优化与边界情况处理。
10.2 推荐学习资源
- Qt Advanced Docking System 官方仓库:github.com/githubuser0xFFFF/Qt-Advanced-Docking-System
- Golden Layout 官方文档:golden-layout.com/docs/
- Dockview 官方文档:dockview.dev
- Electron 多窗口教程:electronjs.org/docs/latest/api/browser-window
- W3C Window Placement 规范草案:w3c.github.io/window-placement/
- Microsoft Per-Monitor DPI 文档:learn.microsoft.com/en-us/windows/win32/hidpi/
10.3 视频教程推荐
- Qt Advanced Docking System 集成教程(YouTube):搜索 "Qt Advanced Docking System tutorial"
- Electron 多窗口应用开发(B站):搜索 "Electron 多窗口 拖拽"
- Golden Layout 快速上手(YouTube):搜索 "Golden Layout getting started"
参考文献
[1] Freiholz M. Qt Advanced Docking System[CP/OL]. GitHub, 2024. https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System
[2] Golden Layout Contributors. Golden Layout Documentation[EB/OL]. 2024. https://golden-layout.com/docs/
[3] Dockview Contributors. Dockview: Zero Dependency Docking Layout Manager[EB/OL]. 2024. https://dockview.dev/
[4] Microsoft. High DPI Desktop Application Development on Windows[EB/OL]. Microsoft Learn, 2023.
[5] W3C. Window Placement Specification (Draft)[EB/OL]. 2023. https://w3c.github.io/window-placement/
[6] Electron Contributors. BrowserWindow API Documentation[EB/OL]. 2024. https://www.electronjs.org/docs/latest/api/browser-window
[7] StatCounter. Desktop Screen Resolution Stats Worldwide[DB/OL]. 2024. https://gs.statcounter.com/screen-resolution-stats
[8] Stack Overflow. 2023 Developer Survey[DB/OL]. 2023. https://survey.stackoverflow.co/2023/
[9] Nielsen J. Usability Engineering[M]. Morgan Kaufmann, 1994.(Fitts 定律相关章节)
[10] Card S K, Moran T P, Newell A. The Psychology of Human-Computer Interaction[M]. Lawrence Erlbaum Associates, 1983.
[11] Qt Company. Qt 6 Documentation: QScreen Class[EB/OL]. 2024. https://doc.qt.io/qt-6/qscreen.html
[12] Qt Company. Qt 6 Documentation: QDockWidget Class[EB/OL]. 2024. https://doc.qt.io/qt-6/qdockwidget.html
[13] Visual Studio Team. Customize Window Layouts in Visual Studio[EB/OL]. Microsoft Learn, 2023.
[14] Blender Foundation. Blender Manual: Window System[EB/OL]. 2024. https://docs.blender.org/manual/en/latest/interface/window_system/
[15] Blackmagic Design. DaVinci Resolve Reference Manual[EB/OL]. 2024.
[16] Tableau. Tableau Desktop User Guide: Dashboard Layouts[EB/OL]. 2024.
[17] Microsoft. Power BI Desktop Documentation: Report Layout[EB/OL]. 2024.
[18] Bloomberg. Bloomberg Terminal Architecture Overview[EB/OL]. 2023.
[19] Eclipse Foundation. Eclipse Rich Client Platform Documentation[EB/OL]. 2023.
[20] JetBrains. IntelliJ Platform SDK: Tool Windows[EB/OL]. 2024.
[21] CodeSandbox Team. CodeSandbox Architecture Blog[EB/OL]. 2023.
[22] StackBlitz Team. WebContainers: Running Node.js in the Browser[EB/OL]. 2023.
[23] Google Chrome Team. Window Management API[EB/OL]. Chrome Developer Documentation, 2023.
[24] Mozilla. Window.open() API Documentation[EB/OL]. MDN Web Docs, 2024.
[25] React Team. React Portals Documentation[EB/OL]. 2024. https://react.dev/reference/react-dom/createPortal
[26] Vue Team. Vue Teleport Documentation[EB/OL]. 2024. https://vuejs.org/guide/built-ins/teleport.html
[27] Apple. NSWindow Class Reference[EB/OL]. Apple Developer Documentation, 2024.
[28] Microsoft. CreateWindowEx Function Documentation[EB/OL]. Microsoft Learn, 2023.
[29] X.Org Foundation. X Window System Protocol[EB/OL]. 2023.
[30] Wayland Project. Wayland Protocol Documentation[EB/OL]. 2024.
[31] Freedesktop.org. XDG Shell Protocol[EB/OL]. 2023.
[32] Chromium Team. Multi-Screen Window Placement[EB/OL]. 2023.
[33] Electron Team. screen Module API[EB/OL]. 2024. https://www.electronjs.org/docs/latest/api/screen
[34] Qt Company. High DPI Scaling Documentation[EB/OL]. 2024. https://doc.qt.io/qt-6/highdpi.html
[35] Microsoft. DPI Awareness Mode Documentation[EB/OL]. 2023.
[36] Apple. High Resolution Guidelines for macOS[EB/OL]. 2023.
[37] W3C. CSS Device Adaptation Specification[EB/OL]. 2023.
[38] MDN. Window.devicePixelRatio[EB/OL]. 2024.
[39] Google. Material Design: Layout Principles[EB/OL]. 2023.
[40] Apple. Human Interface Guidelines: Windows[EB/OL]. 2024.
[41] Microsoft. Fluent Design System: Layout[EB/OL]. 2023.
[42] Nielsen Norman Group. Window Management UX Research[EB/OL]. 2023.
[43] CHI Conference. Proceedings of the 2023 CHI Conference on Human Factors in Computing Systems[C]. ACM, 2023.
[44] UIST Conference. Proceedings of the 36th Annual ACM Symposium on User Interface Software and Technology[C]. ACM, 2023.
[45] IEEE VIS. Proceedings of IEEE Visualization Conference 2023[C]. IEEE, 2023.
[46] Myers B A. A Brief History of Human-Computer Interaction Technology[J]. Interactions, 1998, 5(2
微信扫一扫分享
打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。
💬 评论 (0)
评论功能已关闭

