Skip to content

窗口控制

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);    // 搬到指定显示器

显示器枚举走 Appapp.primaryDisplay() / app.allDisplays()

DevTools

cpp
win->openDevTools();
win->closeDevTools();
bool open = win->isDevToolsOpen();
win->executeJavaScript(L"console.log('hi')");

TIP

closeDevToolsEnumWindows 标题匹配启发式关闭(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();
});

下一步