# eduwin 应用框架 API

## 应用生命周期

```c
int init_app(void);
```

初始化 eduwin 框架。必须在任何其他 eduwin 函数之前调用，成功返回 0，失败返回 -1。

```c
void run_app(void);
```

启动消息循环（阻塞），直到 `quit_app()` 被调用才返回。创建第一个窗口后，该窗口关闭时自动退出消息循环。

```c
void quit_app(void);
```

退出消息循环。

---

## 窗口

```c
HWND create_window(const WCHAR *title, int width, int height);
```

创建一个标准重叠窗口（带标题栏、边框、可缩放）。

```c
HWND create_hidden_window(int w, int h);
```

创建一个不显示的傀儡窗口（`WS_POPUP` + `STATIC` 类），最轻量、无边框、全程不可见。

**用途：** 某些子系统（如 WebView2）强制要求传入有效的父窗口句柄，传 `NULL` 会崩溃。在 headless / 后台服务模式下，用此函数创建一个不可见的"挂架"窗口。

**销毁：** 程序退出时自行 `DestroyWindow`。

```c
void show_window(HWND win);
```

创建一个窗口，`title` 是标题栏文本。返回窗口句柄。

```c
void show_window(HWND win);
```

显示窗口。必须在添加完所有控件和菜单后调用。

---

## 事件

```c
void on_window_close(HWND win, int (*callback)(void *), void *data);
```

注册窗口关闭事件。`callback` 返回 1 时关闭窗口，返回 0 则不关闭。

```c
void on_window_resize(HWND win, void (*callback)(int w, int h));
```

注册窗口大小变化事件。`callback` 的参数是窗口**客户区**的宽和高（像素），不含标题栏和边框。

```c
// 窗口缩放时在状态栏显示客户区尺寸
void on_size(int w, int h)
{
    WCHAR buf[128];
    str_format(buf, 128, L"Client: %d x %d", w, h);
    statusbar_set_text(sb, buf);
}

on_window_resize(win, on_size);
```

> **回调签名说明：**
>
> `on_window_resize` 的回调是 `void (*)(int w, int h)`，**不是** `void (*)(void *)`。
> `on_window_close` 的回调是 `int (*)(void *)`。
> 其他控件事件（如 `on_button_click`）的回调是 `void (*)(void *)`。
