多窗口管理
App 维护全局窗口注册表,支持 MRU 激活历史、父子树、分组、批量操作与跨窗口广播。
创建与查询
cpp
auto w1 = app.createWindow(Window::opts().title(L"main"));
auto w2 = app.createWindow(Window::opts().title(L"child"));
auto all = app.windows(); // 所有活窗口
auto win = app.getById(id); // 按 id
auto win = app.getByHwnd(hwnd); // 按 HWND
auto win = app.focused(); // 当前焦点窗口
auto tops = app.topLevelWindows(); // 顶层窗口(无父)
auto hits = app.findByTitle(L"main"); // 按标题
auto hits = app.findByUrl(L"..."); // 按 url
auto hits = app.childWindowsOf(parent); // 直接子
auto hits = app.descendantsOf(parent); // 全部后代MRU 激活
最近使用(Most Recently Used)激活历史,支持窗口间循环切换:
cpp
app.activate(win);
app.nextWindow(); // MRU 序下一个
app.previousWindow(); // 上一个
auto recent = app.mostRecentActive();分组
把窗口归组,便于批量操作(如一组工具窗口一起显隐):
cpp
app.setGroup(w1, L"tools");
app.setGroup(w2, L"tools");
auto group = app.windowsInGroup(L"tools");
app.activateGroup(L"tools");
app.closeGroup(L"tools");批量操作
cpp
app.minimizeAll();
app.restoreAll();
app.closeAll();
app.closeAllExcept(keepWin);
app.cascade(); // 层叠
app.tile(TileMode::Grid); // 网格平铺广播
broadcast 即发即忘地向所有窗口的 Bridge 发同一通道:
cpp
app.broadcast("settingsChanged", payload);每个窗口前端:
js
bridge.on('settingsChanged', p => applySettings(p));父子 / 模态
父子关系在 窗口控制 详述。要点:
- 子窗口
setParent(parent)后随父关闭 setModal(true)相对 parent 模态(阻塞父交互)
生命周期
窗口 close 后自动从注册表移除。App 持 weak_ptr,窗口对象由业务 shared_ptr 持有。最后窗口关闭的默认行为可配(退 app 或驻留托盘)。