窗口
内容的画面画在 new DesktopEngine.Window({ type }) 创建的原生窗口里。
| type | 用途 |
|---|---|
desktop | 壁纸:桌面层,在桌面图标之下,所有空间可见,也能收到鼠标移动 |
widget | 贴在桌面上的小组件:桌面图标之上,无边框、背景透明,可拖动 |
overlay | 浮于所有窗口之上:无边框、背景透明,所有空间和全屏应用上都可见,用于浮动小组件和桌面伙伴 |
panel | 带标题栏的浮动面板 |
normal | 普通窗口 |
desktop、widget、overlay 显示时不会激活 DesktopEngine,不会抢走用户当前应用的焦点。
内容能创建哪些窗口由它的类型决定,运行时强制执行:壁纸只能用 desktop;小组件和桌面伙伴只能用 widget 和 overlay(按用户选的位置,传入 launchOptions.windowType 即可)。其他类型,包括不写 type 的普通窗口,new DesktopEngine.Window() 会抛出错误。desktopengine dev 和「开发」菜单载入的内容也一样,发布前就能发现;没有清单的小程序不受限制。
窗口本身是透明的,样式不支持圆角:需要圆角时,在 Canvas 上画圆角矩形(见小组件模板)。窗口创建后会一直存在,直到调用 destroy()。
鼠标
widget和overlay窗口按住任意位置就能拖动(系统原生拖动):拖动时依次收到mousedown、窗口的move和松手时的mouseup,拖动过程中没有mousemove;单击只收到click,没有mousedown/mouseup。- 窗口的
dragRegion限定按住哪些地方会拖动窗口,其余地方的按下和拖动交给组件(mousedown、按住时的mousemove、mouseup),适合表盘、滑块这类控件;null(默认)是整个窗口,[]是哪里都不拖动。 - 窗口拖到屏幕边缘松手后,大小不变,停在松手的位置,不过 macOS 仍会显示平铺的预览。把窗口的
allowsTiling设为true,macOS 就会把它平铺(例如占半屏),这时需要处理resize。 - 窗口的
hitRegion(以窗口左上角为原点的矩形数组,单位点)限定只有这些地方响应鼠标,其余地方的点击、拖动和悬停都会穿透到下面的窗口;null(默认)是整个窗口。窗口透明的地方默认仍然会接住鼠标,不规则形状的桌面伙伴应随画面更新它(见 pet 模板)。 mouseenter、mousemove、mouseleave在窗口不是当前窗口时也会触发。- 事件回调的参数是普通对象,
this是触发事件的对象;双击事件名是dbclick。
显示器和缩放
launchOptions.display是内容所在的显示器,frame是整块屏幕,visibleFrame去掉了菜单栏和程序坞。- 窗口的
devicePixelRatio是所在显示器的缩放比例。小组件、桌面伙伴被拖到缩放比例不同的显示器上(例如从 Retina 屏拖到 1x 的外接显示器),或者用户改了显示器的分辨率,它会改变并触发窗口的devicepixelratiochange事件,这时按新的值重设画布的width/height、重画。 - 注意这里改
width/height不会重置 2D 上下文的状态(浏览器会),缩放用setTransform(ratio, 0, 0, ratio, 0, 0)重设,不要再叠加一次scale()(见 widget、pet 模板)。
完整的属性和事件见 Window。
