fix: 原生窗口销毁后宿主事件循环未退出

This commit is contained in:
Codex
2026-10-05 00:51:43 +08:00
parent 568ffc40eb
commit c0eca1d4bd
5 changed files with 125 additions and 7 deletions
+7
View File
@@ -16,6 +16,7 @@
#pragma once
#include "Control.h"
#include <atomic>
#include <string>
#include <vector>
#include <memory>
@@ -23,6 +24,8 @@
class Window
{
friend class Dialog;
// —— 尺寸状态 ——(绘制尺寸与待应用尺寸分离;收口时一次性更新)
int width; // 当前有效宽(已应用到画布/控件的客户区宽)
int height; // 当前有效高(已应用到画布/控件的客户区高)
@@ -40,6 +43,10 @@ class Window
HWND hWnd = NULL; // EasyX 初始化后的窗口句柄
WNDPROC oldWndProc = nullptr; // 保存旧过程(CallWindowProc 回落)
bool procHooked = false; // 避免重复子类化
// EasyX 的 WndProc 与宿主事件循环分属不同线程;只有 WndProc 完成 WM_NCDESTROY
// 转发后才发布 false,避免宿主提前析构仍在执行 WndProcThunk 的 Window 对象。
std::atomic<bool> nativeWindowAlive{ false };
bool hasLiveNativeWindow() const noexcept;
static LRESULT CALLBACK WndProcThunk(HWND h, UINT m, WPARAM w, LPARAM l); // 静态过程分发到 this
// —— 绘制相关 ——(是否使用合成双缓冲、窗口标题、背景等)