持久化与单实例
窗口状态持久化
记下窗口位置/尺寸/最大化状态,下次启动恢复。API 挂 App 与 Window。
cpp
// 退出前 / 关闭前存
win->saveWindowState();
// 或批量存所有顶层窗口
app.saveState();
// 启动时恢复
win->restoreWindowState();
app.restoreState();状态键由窗口 id 区分,多窗口各自恢复。
TIP
配合 onBeforeClose 或 AppEvent::Quit 在退出前调 saveState,启动 createWindow 后调 restoreState。
单实例锁
阻止多开——第二个实例启动时,激活已有实例并退出。
cpp
auto& app = App::instance();
if (!app.requestSingleInstanceLock()) {
return 1; // 已有实例运行,本进程退出
}
app.onSecondInstance([](const std::vector<std::wstring>& args) {
// 第二个实例启动了:激活主窗 / 处理命令行参数
auto win = App::instance().focused();
if (win) { win->show(); win->setFocus(); }
});
return app.run();进程级生命周期
cpp
app.on(AppEvent::Quit, []{ /* 退出清理:存状态、关连接 */ });
app.onBeforeQuit([]() -> bool {
if (hasUnsaved()) return false; // 取消退出
return true;
});
app.quit(); // 请求退出(走 onBeforeQuit)
app.exit(); // 立即退出配置 / KV
简单持久化 KV(若框架版本提供,否则用外部 JSON):
cpp
// 存自定义数据
app.saveState(); // 框架内置状态
// 业务配置通常自行写 config.json(见 Paths 约定)WARNING
业务配置(非窗口状态)建议自行落 <exe>/config/config.json,与框架窗口状态 KV 分开。
典型启动序列
cpp
int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) {
auto& app = App::instance();
if (!app.requestSingleInstanceLock()) return 1;
app.onSecondInstance(activateMain);
auto win = app.createWindow(opts);
app.restoreState(); // 恢复上次窗口状态
win->onBeforeClose([] { app.saveState(); return true; });
return app.run();
}