窗口控制
Window 封装一个 Win32 HWND + WebView2 controller,由 App::createWindow 创建,返回 shared_ptr<Window>。
创建
Window::Opts 链式配置 + App::createWindow:
cpp
auto win = app.createWindow(
Window::opts()
.title(L"my app")
.size(1000, 700)
.center(true)
.url(L"src/assets/html/index.html")
);常用 Opts:
| 字段 | 说明 |
|---|---|
title | 窗口标题 |
width / height | 初始尺寸 |
x / y | 初始位置(不设则 center) |
center | 居中 |
resizable / minimizable / maximizable | 可缩放/最小化/最大化 |
frameless | 无边框自绘 |
transparent | 透明(Win10 2004+ 分层窗口,有限支持) |
alwaysOnTop | 置顶 |
url | 加载地址(约定目录 / 本地路径 / https) |
icon | 图标资源 |
bootSplashHtml | 启动屏 HTML |
导航
cpp
win->loadURL(L"src/assets/html/index.html"); // 打包资源
win->loadURL(L"https://github.com"); // 远程
win->loadFile(L"E:\\dev\\index.html"); // 本地文件(dev)
win->loadHTML(L"<h1>hi</h1>"); // 直接 HTML
win->reload();
win->goBack();
win->goForward();loadURL 三分支:https:// → Navigate;本地路径命中 manifest → 内存拦截(打包模式);未命中 → file:///(dev 读盘)。详见 资源打包。
控制
cpp
win->show();
win->hide();
win->close();
win->destroy();
win->minimize();
win->maximize();
win->restore();
win->setFullScreen(true);
win->setResizable(false);
win->setAlwaysOnTop(true);
win->setOpacity(0.9);
win->setFocusable(false);几何
cpp
auto b = win->getBounds(); // {x,y,width,height}
win->setBounds({100, 100, 800, 600});
win->setSize(1024, 768);
win->setPosition(200, 200);
win->setMinimumSize(400, 300);
win->setMaximumSize(1920, 1080);
win->setAspectRatio(16.0 / 9.0); // 宽高比锁定
win->center();多屏
cpp
auto m = win->monitor(); // 当前所在显示器
bool pri = win->isOnPrimary();
win->moveToDisplay(otherMonitor); // 搬到指定显示器显示器枚举走 App:app.primaryDisplay() / app.allDisplays()。
DevTools
cpp
win->openDevTools();
win->closeDevTools();
bool open = win->isDevToolsOpen();
win->executeJavaScript(L"console.log('hi')");TIP
closeDevTools 靠 EnumWindows 标题匹配启发式关闭(OpenDevToolsWindow 不返 HWND),偶发关不掉时手动关。
图标
cpp
win->setIcon(L"IDI_MYICON"); // 资源名
auto ic = win->icon();父子 / 模态
cpp
child->setParent(parent);
auto p = child->parent();
auto kids = child->children();
child->setModal(true); // 模态(相对 parent)事件
cpp
win->on(WindowEvent::Resize, [](const ResizePayload& p) {
std::wcout << p.w << L"x" << p.h << L"\n";
});
win->on(PageEvent::TitleChanged, [](const auto& p) { /* ... */ });完整事件清单见 事件系统。
可取消关闭
cpp
win->onBeforeClose([]() -> bool {
// 返回 false 阻止关闭(如有未保存内容)
return confirmDiscard();
});