Skip to content

多窗口管理

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 后自动从注册表移除。Appweak_ptr,窗口对象由业务 shared_ptr 持有。最后窗口关闭的默认行为可配(退 app 或驻留托盘)。

下一步