diff options
Diffstat (limited to 'src/platform/gui/win/UiApplication.cpp')
| -rw-r--r-- | src/platform/gui/win/UiApplication.cpp | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/src/platform/gui/win/UiApplication.cpp b/src/platform/gui/win/UiApplication.cpp index 12a74bc6..eb85ef90 100644 --- a/src/platform/gui/win/UiApplication.cpp +++ b/src/platform/gui/win/UiApplication.cpp @@ -1,21 +1,29 @@ #include "cru/platform/gui/win/UiApplication.h" -#include "WindowManager.h" #include "cru/platform/graphics/direct2d/Factory.h" #include "cru/platform/gui/win/Base.h" #include "cru/platform/gui/win/Clipboard.h" #include "cru/platform/gui/win/Cursor.h" #include "cru/platform/gui/win/Window.h" +#include <algorithm> #include <chrono> -namespace cru::platform::gui { -std::unique_ptr<IUiApplication> CreateUiApplication() { - return std::make_unique<win::WinUiApplication>(); +namespace cru::platform::gui::win { +namespace { +LRESULT __stdcall GeneralWndProc(HWND hWnd, UINT Msg, WPARAM wParam, + LPARAM lParam) { + auto window = WinUiApplication::GetInstance()->FromHWND(hWnd); + + LRESULT result; + if (window != nullptr && + window->HandleNativeWindowMessage(hWnd, Msg, wParam, lParam, &result)) + return result; + + return DefWindowProc(hWnd, Msg, wParam, lParam); } -} // namespace cru::platform::gui +} // namespace -namespace cru::platform::gui::win { WinUiApplication* WinUiApplication::instance = nullptr; WinUiApplication::WinUiApplication() { @@ -27,10 +35,12 @@ WinUiApplication::WinUiApplication() { ::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE); + general_window_class_ = std::make_unique<WindowClass>( + L"CruUIWindowClass", GeneralWndProc, instance_handle_); + graph_factory_ = std::make_unique< cru::platform::graphics::direct2d::DirectGraphicsFactory>(); - window_manager_ = std::make_unique<WindowManager>(this); cursor_manager_ = std::make_unique<WinCursorManager>(); clipboard_ = std::make_unique<WinClipboard>(this); } @@ -94,9 +104,8 @@ long long WinUiApplication::SetInterval(std::chrono::milliseconds milliseconds, void WinUiApplication::CancelTimer(long long id) { timers_.Remove(id); } std::vector<INativeWindow*> WinUiApplication::GetAllWindow() { - const auto&& windows = window_manager_->GetAllWindows(); std::vector<INativeWindow*> result; - for (const auto w : windows) { + for (const auto w : windows_) { result.push_back(static_cast<INativeWindow*>(w)); } return result; @@ -117,4 +126,28 @@ ICursorManager* WinUiApplication::GetCursorManager() { IClipboard* WinUiApplication::GetClipboard() { return clipboard_.get(); } +std::vector<WinNativeWindow*> WinUiApplication::GetAllWinWindow() { + return windows_; +} + +WinNativeWindow* WinUiApplication::FromHWND(HWND hwnd) { + for (auto window : windows_) { + if (window->GetWindowHandle() == hwnd) { + return window; + } + } + return nullptr; +} + +WindowClass* WinUiApplication::GetGeneralWindowClass() { + return general_window_class_.get(); +} + +void WinUiApplication::RegisterWindow(WinNativeWindow* window) { + windows_.push_back(window); +} + +void WinUiApplication::UnregisterWindow(WinNativeWindow* window) { + windows_.erase(std::ranges::find(windows_, window)); +} } // namespace cru::platform::gui::win |
