+ \r
+ for (auto handler : window->handlers[msg])\r
+ handler(hwnd, msg, wParam, lParam);\r
+\r
+ if (defaultHandler)\r
+ return DefWindowProc(hwnd, msg, wParam, lParam);\r
+ else\r
+ return 0;\r
+ }\r
+ public:\r
+ lay_context ctx;\r
+ std::unordered_map<UINT,\r
+ std::vector<\r
+ std::function<void(HWND, UINT, WPARAM, LPARAM)>>> handlers;\r
+\r
+ Window(std::string title, std::string className, HINSTANCE hInstance)\r
+ {\r
+ WNDCLASSEXA wc;\r
+ wc.cbSize = sizeof(WNDCLASSEX);\r
+ wc.style = 0;\r
+ wc.lpfnWndProc = WndProc;\r
+ wc.cbClsExtra = 0;\r
+ wc.cbWndExtra = sizeof(Window*);\r
+ wc.hInstance = hInstance;\r
+ wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON_WHITE));\r
+ wc.hCursor = LoadCursor(hInstance, IDC_ARROW);\r
+ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);\r
+ wc.lpszMenuName = nullptr;\r
+ wc.lpszClassName = className.c_str();\r
+ wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON_WHITE));\r
+ RegisterClassExA(&wc);\r
+\r
+ lay_init_context(&ctx);\r
+ lId = lay_item(&ctx);\r
+ lay_set_contain(&ctx, lId, LAY_COLUMN);\r
+\r
+ hwnd = CreateWindowA(className.c_str(),\r
+ title.c_str(),\r
+ WS_OVERLAPPEDWINDOW,\r
+ CW_USEDEFAULT,\r
+ CW_USEDEFAULT,\r
+ CW_USEDEFAULT,\r
+ CW_USEDEFAULT,\r
+ nullptr,\r
+ nullptr,\r
+ hInstance,\r
+ nullptr);\r
+\r
+ SetWindowLongPtrA(hwnd, 0, (LONG_PTR)this);\r
+ }\r
+ bool update()\r
+ {\r
+ MSG msg;\r
+ if (GetMessage(&msg, nullptr, 0, 0) > 0) {\r
+ TranslateMessage(&msg);\r
+ DispatchMessage(&msg);\r
+ return true;\r