From 74bb9cd27242b9320f99ff4d2b50c3051576cc14 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 8 Feb 2022 16:53:51 +0800 Subject: ... --- include/cru/win/gui/Base.h | 27 +++ include/cru/win/gui/Base.hpp | 27 --- include/cru/win/gui/Clipboard.h | 24 +++ include/cru/win/gui/Clipboard.hpp | 24 --- include/cru/win/gui/Cursor.h | 51 +++++ include/cru/win/gui/Cursor.hpp | 51 ----- include/cru/win/gui/Exception.h | 7 + include/cru/win/gui/Exception.hpp | 7 - include/cru/win/gui/GodWindow.h | 39 ++++ include/cru/win/gui/GodWindow.hpp | 39 ---- include/cru/win/gui/InputMethod.h | 88 +++++++++ include/cru/win/gui/InputMethod.hpp | 88 --------- include/cru/win/gui/Keyboard.h | 9 + include/cru/win/gui/Keyboard.hpp | 9 - include/cru/win/gui/Resource.h | 24 +++ include/cru/win/gui/Resource.hpp | 24 --- include/cru/win/gui/UiApplication.h | 87 +++++++++ include/cru/win/gui/UiApplication.hpp | 87 --------- include/cru/win/gui/Window.h | 217 +++++++++++++++++++++ include/cru/win/gui/Window.hpp | 217 --------------------- include/cru/win/gui/WindowClass.h | 24 +++ include/cru/win/gui/WindowClass.hpp | 24 --- include/cru/win/gui/WindowNativeMessageEventArgs.h | 40 ++++ .../cru/win/gui/WindowNativeMessageEventArgs.hpp | 40 ---- 24 files changed, 637 insertions(+), 637 deletions(-) create mode 100644 include/cru/win/gui/Base.h delete mode 100644 include/cru/win/gui/Base.hpp create mode 100644 include/cru/win/gui/Clipboard.h delete mode 100644 include/cru/win/gui/Clipboard.hpp create mode 100644 include/cru/win/gui/Cursor.h delete mode 100644 include/cru/win/gui/Cursor.hpp create mode 100644 include/cru/win/gui/Exception.h delete mode 100644 include/cru/win/gui/Exception.hpp create mode 100644 include/cru/win/gui/GodWindow.h delete mode 100644 include/cru/win/gui/GodWindow.hpp create mode 100644 include/cru/win/gui/InputMethod.h delete mode 100644 include/cru/win/gui/InputMethod.hpp create mode 100644 include/cru/win/gui/Keyboard.h delete mode 100644 include/cru/win/gui/Keyboard.hpp create mode 100644 include/cru/win/gui/Resource.h delete mode 100644 include/cru/win/gui/Resource.hpp create mode 100644 include/cru/win/gui/UiApplication.h delete mode 100644 include/cru/win/gui/UiApplication.hpp create mode 100644 include/cru/win/gui/Window.h delete mode 100644 include/cru/win/gui/Window.hpp create mode 100644 include/cru/win/gui/WindowClass.h delete mode 100644 include/cru/win/gui/WindowClass.hpp create mode 100644 include/cru/win/gui/WindowNativeMessageEventArgs.h delete mode 100644 include/cru/win/gui/WindowNativeMessageEventArgs.hpp (limited to 'include/cru/win/gui') diff --git a/include/cru/win/gui/Base.h b/include/cru/win/gui/Base.h new file mode 100644 index 00000000..ab915c57 --- /dev/null +++ b/include/cru/win/gui/Base.h @@ -0,0 +1,27 @@ +#pragma once +#include "../WinPreConfig.h" + +#include "cru/common/Base.h" + +#ifdef CRU_PLATFORM_WINDOWS +#ifdef CRU_WIN_GUI_EXPORT_API +#define CRU_WIN_GUI_API __declspec(dllexport) +#else +#define CRU_WIN_GUI_API __declspec(dllimport) +#endif +#else +#define CRU_WIN_GUI_API +#endif + +namespace cru::platform::gui::win { +class GodWindow; +class TimerManager; +class WinCursor; +class WinCursorManager; +class WindowClass; +class WindowManager; +class WinNativeWindow; +class WinUiApplication; +class WinInputMethodContext; +class WinClipboard; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Base.hpp b/include/cru/win/gui/Base.hpp deleted file mode 100644 index 2a0d0247..00000000 --- a/include/cru/win/gui/Base.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include "../WinPreConfig.hpp" - -#include "cru/common/Base.hpp" - -#ifdef CRU_PLATFORM_WINDOWS -#ifdef CRU_WIN_GUI_EXPORT_API -#define CRU_WIN_GUI_API __declspec(dllexport) -#else -#define CRU_WIN_GUI_API __declspec(dllimport) -#endif -#else -#define CRU_WIN_GUI_API -#endif - -namespace cru::platform::gui::win { -class GodWindow; -class TimerManager; -class WinCursor; -class WinCursorManager; -class WindowClass; -class WindowManager; -class WinNativeWindow; -class WinUiApplication; -class WinInputMethodContext; -class WinClipboard; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Clipboard.h b/include/cru/win/gui/Clipboard.h new file mode 100644 index 00000000..7580642b --- /dev/null +++ b/include/cru/win/gui/Clipboard.h @@ -0,0 +1,24 @@ +#pragma once +#include "Resource.h" +#include "cru/common/Base.h" +#include "cru/platform/gui/Clipboard.h" +#include "cru/win/gui/Base.h" + +namespace cru::platform::gui::win { +class WinClipboard : public WinNativeResource, public virtual IClipboard { + public: + explicit WinClipboard(WinUiApplication* application); + + CRU_DELETE_COPY(WinClipboard) + CRU_DELETE_MOVE(WinClipboard) + + ~WinClipboard() override; + + public: + String GetText() override; + void SetText(String text) override; + + private: + WinUiApplication* application_; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Clipboard.hpp b/include/cru/win/gui/Clipboard.hpp deleted file mode 100644 index 63d4906a..00000000 --- a/include/cru/win/gui/Clipboard.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "Resource.hpp" -#include "cru/common/Base.hpp" -#include "cru/platform/gui/Clipboard.hpp" -#include "cru/win/gui/Base.hpp" - -namespace cru::platform::gui::win { -class WinClipboard : public WinNativeResource, public virtual IClipboard { - public: - explicit WinClipboard(WinUiApplication* application); - - CRU_DELETE_COPY(WinClipboard) - CRU_DELETE_MOVE(WinClipboard) - - ~WinClipboard() override; - - public: - String GetText() override; - void SetText(String text) override; - - private: - WinUiApplication* application_; -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Cursor.h b/include/cru/win/gui/Cursor.h new file mode 100644 index 00000000..7a9a2198 --- /dev/null +++ b/include/cru/win/gui/Cursor.h @@ -0,0 +1,51 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/Cursor.h" + +#include + +namespace cru::platform::gui::win { +class CRU_WIN_GUI_API WinCursor : public WinNativeResource, + public virtual ICursor { + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinCursor") + + public: + WinCursor(HCURSOR handle, bool auto_destroy); + + CRU_DELETE_COPY(WinCursor) + CRU_DELETE_MOVE(WinCursor) + + ~WinCursor() override; + + public: + HCURSOR GetHandle() const { return handle_; } + + private: + HCURSOR handle_; + bool auto_destroy_; +}; + +class WinCursorManager : public WinNativeResource, + public virtual ICursorManager { + public: + WinCursorManager(); + + CRU_DELETE_COPY(WinCursorManager) + CRU_DELETE_MOVE(WinCursorManager) + + ~WinCursorManager() override = default; + + public: + std::shared_ptr GetSystemWinCursor(SystemCursorType type); + + std::shared_ptr GetSystemCursor(SystemCursorType type) override { + return std::static_pointer_cast(GetSystemWinCursor(type)); + } + + private: + std::shared_ptr sys_arrow_; + std::shared_ptr sys_hand_; + std::shared_ptr sys_ibeam_; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Cursor.hpp b/include/cru/win/gui/Cursor.hpp deleted file mode 100644 index 89f61db9..00000000 --- a/include/cru/win/gui/Cursor.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#include "Resource.hpp" - -#include "cru/platform/gui/Cursor.hpp" - -#include - -namespace cru::platform::gui::win { -class CRU_WIN_GUI_API WinCursor : public WinNativeResource, - public virtual ICursor { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinCursor") - - public: - WinCursor(HCURSOR handle, bool auto_destroy); - - CRU_DELETE_COPY(WinCursor) - CRU_DELETE_MOVE(WinCursor) - - ~WinCursor() override; - - public: - HCURSOR GetHandle() const { return handle_; } - - private: - HCURSOR handle_; - bool auto_destroy_; -}; - -class WinCursorManager : public WinNativeResource, - public virtual ICursorManager { - public: - WinCursorManager(); - - CRU_DELETE_COPY(WinCursorManager) - CRU_DELETE_MOVE(WinCursorManager) - - ~WinCursorManager() override = default; - - public: - std::shared_ptr GetSystemWinCursor(SystemCursorType type); - - std::shared_ptr GetSystemCursor(SystemCursorType type) override { - return std::static_pointer_cast(GetSystemWinCursor(type)); - } - - private: - std::shared_ptr sys_arrow_; - std::shared_ptr sys_hand_; - std::shared_ptr sys_ibeam_; -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Exception.h b/include/cru/win/gui/Exception.h new file mode 100644 index 00000000..99ed5863 --- /dev/null +++ b/include/cru/win/gui/Exception.h @@ -0,0 +1,7 @@ +#pragma once +#include "../Exception.h" + +namespace cru::platform::gui::win { +using platform::win::Win32Error; +using platform::win::HResultError; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Exception.hpp b/include/cru/win/gui/Exception.hpp deleted file mode 100644 index 895e6c14..00000000 --- a/include/cru/win/gui/Exception.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -#include "../Exception.hpp" - -namespace cru::platform::gui::win { -using platform::win::Win32Error; -using platform::win::HResultError; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/GodWindow.h b/include/cru/win/gui/GodWindow.h new file mode 100644 index 00000000..63051245 --- /dev/null +++ b/include/cru/win/gui/GodWindow.h @@ -0,0 +1,39 @@ +#pragma once +#include "Base.h" + +#include "WindowNativeMessageEventArgs.h" +#include "cru/common/Event.h" +#include "cru/common/String.h" + +#include + +namespace cru::platform::gui::win { +class CRU_WIN_GUI_API GodWindow : public Object { + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::GodWindow") + + public: + explicit GodWindow(WinUiApplication* application); + + CRU_DELETE_COPY(GodWindow) + CRU_DELETE_MOVE(GodWindow) + + ~GodWindow() override; + + HWND GetHandle() const { return hwnd_; } + + bool HandleGodWindowMessage(HWND hwnd, UINT msg, WPARAM w_param, + LPARAM l_param, LRESULT* result); + + IEvent* MessageEvent() { + return &message_event_; + } + + private: + WinUiApplication* application_; + + std::unique_ptr god_window_class_; + HWND hwnd_; + + Event message_event_; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/GodWindow.hpp b/include/cru/win/gui/GodWindow.hpp deleted file mode 100644 index fa69cb84..00000000 --- a/include/cru/win/gui/GodWindow.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -#include "Base.hpp" - -#include "WindowNativeMessageEventArgs.hpp" -#include "cru/common/Event.hpp" -#include "cru/common/String.hpp" - -#include - -namespace cru::platform::gui::win { -class CRU_WIN_GUI_API GodWindow : public Object { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::GodWindow") - - public: - explicit GodWindow(WinUiApplication* application); - - CRU_DELETE_COPY(GodWindow) - CRU_DELETE_MOVE(GodWindow) - - ~GodWindow() override; - - HWND GetHandle() const { return hwnd_; } - - bool HandleGodWindowMessage(HWND hwnd, UINT msg, WPARAM w_param, - LPARAM l_param, LRESULT* result); - - IEvent* MessageEvent() { - return &message_event_; - } - - private: - WinUiApplication* application_; - - std::unique_ptr god_window_class_; - HWND hwnd_; - - Event message_event_; -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/InputMethod.h b/include/cru/win/gui/InputMethod.h new file mode 100644 index 00000000..27a621be --- /dev/null +++ b/include/cru/win/gui/InputMethod.h @@ -0,0 +1,88 @@ +// Some useful information can be found from chromium code: +// https://chromium.googlesource.com/chromium/chromium/+/refs/heads/master/ui/base/win/ime_input.h +// https://chromium.googlesource.com/chromium/chromium/+/refs/heads/master/ui/base/win/ime_input.cc + +#pragma once +#include "Resource.h" + +#include "WindowNativeMessageEventArgs.h" +#include "cru/platform/gui/InputMethod.h" + +#include + +namespace cru::platform::gui::win { +class CRU_WIN_GUI_API AutoHIMC : public Object { + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::AutoHIMC") + + public: + explicit AutoHIMC(HWND hwnd); + + CRU_DELETE_COPY(AutoHIMC) + + AutoHIMC(AutoHIMC&& other); + AutoHIMC& operator=(AutoHIMC&& other); + + ~AutoHIMC() override; + + HWND GetHwnd() const { return hwnd_; } + + HIMC Get() const { return handle_; } + + private: + HWND hwnd_; + HIMC handle_; +}; + +class CRU_WIN_GUI_API WinInputMethodContext + : public WinNativeResource, + public virtual IInputMethodContext { + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinInputMethodContext") + + public: + WinInputMethodContext(gsl::not_null window); + + CRU_DELETE_COPY(WinInputMethodContext) + CRU_DELETE_MOVE(WinInputMethodContext) + + ~WinInputMethodContext() override; + + bool ShouldManuallyDrawCompositionText() override { return true; } + + void EnableIME() override; + + void DisableIME() override; + + void CompleteComposition() override; + + void CancelComposition() override; + + CompositionText GetCompositionText() override; + + void SetCandidateWindowPosition(const Point& point) override; + + IEvent* CompositionStartEvent() override; + + IEvent* CompositionEndEvent() override; + + IEvent* CompositionEvent() override; + + IEvent* TextEvent() override; + + private: + void OnWindowNativeMessage(WindowNativeMessageEventArgs& args); + + String GetResultString(); + + AutoHIMC GetHIMC(); + + private: + WinNativeWindow* native_window_; + + EventRevokerListGuard event_guard_; + + Event composition_start_event_; + Event composition_end_event_; + Event composition_event_; + Event text_event_; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/InputMethod.hpp b/include/cru/win/gui/InputMethod.hpp deleted file mode 100644 index 0f50c0aa..00000000 --- a/include/cru/win/gui/InputMethod.hpp +++ /dev/null @@ -1,88 +0,0 @@ -// Some useful information can be found from chromium code: -// https://chromium.googlesource.com/chromium/chromium/+/refs/heads/master/ui/base/win/ime_input.h -// https://chromium.googlesource.com/chromium/chromium/+/refs/heads/master/ui/base/win/ime_input.cc - -#pragma once -#include "Resource.hpp" - -#include "WindowNativeMessageEventArgs.hpp" -#include "cru/platform/gui/InputMethod.hpp" - -#include - -namespace cru::platform::gui::win { -class CRU_WIN_GUI_API AutoHIMC : public Object { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::AutoHIMC") - - public: - explicit AutoHIMC(HWND hwnd); - - CRU_DELETE_COPY(AutoHIMC) - - AutoHIMC(AutoHIMC&& other); - AutoHIMC& operator=(AutoHIMC&& other); - - ~AutoHIMC() override; - - HWND GetHwnd() const { return hwnd_; } - - HIMC Get() const { return handle_; } - - private: - HWND hwnd_; - HIMC handle_; -}; - -class CRU_WIN_GUI_API WinInputMethodContext - : public WinNativeResource, - public virtual IInputMethodContext { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinInputMethodContext") - - public: - WinInputMethodContext(gsl::not_null window); - - CRU_DELETE_COPY(WinInputMethodContext) - CRU_DELETE_MOVE(WinInputMethodContext) - - ~WinInputMethodContext() override; - - bool ShouldManuallyDrawCompositionText() override { return true; } - - void EnableIME() override; - - void DisableIME() override; - - void CompleteComposition() override; - - void CancelComposition() override; - - CompositionText GetCompositionText() override; - - void SetCandidateWindowPosition(const Point& point) override; - - IEvent* CompositionStartEvent() override; - - IEvent* CompositionEndEvent() override; - - IEvent* CompositionEvent() override; - - IEvent* TextEvent() override; - - private: - void OnWindowNativeMessage(WindowNativeMessageEventArgs& args); - - String GetResultString(); - - AutoHIMC GetHIMC(); - - private: - WinNativeWindow* native_window_; - - EventRevokerListGuard event_guard_; - - Event composition_start_event_; - Event composition_end_event_; - Event composition_event_; - Event text_event_; -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Keyboard.h b/include/cru/win/gui/Keyboard.h new file mode 100644 index 00000000..18b37b60 --- /dev/null +++ b/include/cru/win/gui/Keyboard.h @@ -0,0 +1,9 @@ +#pragma once +#include "Base.h" + +#include "cru/platform/gui/Keyboard.h" + +namespace cru::platform::gui::win { +KeyCode CRU_WIN_GUI_API VirtualKeyToKeyCode(int virtual_key); +KeyModifier CRU_WIN_GUI_API RetrieveKeyMofifier(); +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Keyboard.hpp b/include/cru/win/gui/Keyboard.hpp deleted file mode 100644 index d736966a..00000000 --- a/include/cru/win/gui/Keyboard.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#include "Base.hpp" - -#include "cru/platform/gui/Keyboard.hpp" - -namespace cru::platform::gui::win { -KeyCode CRU_WIN_GUI_API VirtualKeyToKeyCode(int virtual_key); -KeyModifier CRU_WIN_GUI_API RetrieveKeyMofifier(); -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Resource.h b/include/cru/win/gui/Resource.h new file mode 100644 index 00000000..ed43bec3 --- /dev/null +++ b/include/cru/win/gui/Resource.h @@ -0,0 +1,24 @@ +#pragma once +#include "Base.h" + +#include "cru/platform/Resource.h" + +namespace cru::platform::gui::win { +class CRU_WIN_GUI_API WinNativeResource : public Object, + public virtual IPlatformResource { + public: + static String kPlatformId; + + protected: + WinNativeResource() = default; + + public: + CRU_DELETE_COPY(WinNativeResource) + CRU_DELETE_MOVE(WinNativeResource) + + ~WinNativeResource() override = default; + + public: + String GetPlatformId() const final { return kPlatformId; } +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Resource.hpp b/include/cru/win/gui/Resource.hpp deleted file mode 100644 index 34c4fc1b..00000000 --- a/include/cru/win/gui/Resource.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "Base.hpp" - -#include "cru/platform/Resource.hpp" - -namespace cru::platform::gui::win { -class CRU_WIN_GUI_API WinNativeResource : public Object, - public virtual IPlatformResource { - public: - static String kPlatformId; - - protected: - WinNativeResource() = default; - - public: - CRU_DELETE_COPY(WinNativeResource) - CRU_DELETE_MOVE(WinNativeResource) - - ~WinNativeResource() override = default; - - public: - String GetPlatformId() const final { return kPlatformId; } -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/UiApplication.h b/include/cru/win/gui/UiApplication.h new file mode 100644 index 00000000..a4dfcf3d --- /dev/null +++ b/include/cru/win/gui/UiApplication.h @@ -0,0 +1,87 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/Base.h" +#include "cru/platform/gui/UiApplication.h" + +#include + +namespace cru::platform::graphics::win::direct { +class DirectGraphicsFactory; +} + +namespace cru::platform::gui::win { +class CRU_WIN_GUI_API WinUiApplication : public WinNativeResource, + public virtual IUiApplication { + public: + static WinUiApplication* GetInstance() { return instance; } + + private: + static WinUiApplication* instance; + + public: + WinUiApplication(); + + CRU_DELETE_COPY(WinUiApplication) + CRU_DELETE_MOVE(WinUiApplication) + + ~WinUiApplication() override; + + public: + int Run() override; + void RequestQuit(int quit_code) override; + + void AddOnQuitHandler(std::function handler) override; + + bool IsQuitOnAllWindowClosed() override { + return is_quit_on_all_window_closed_; + } + void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) override { + is_quit_on_all_window_closed_ = quit_on_all_window_closed; + } + + long long SetImmediate(std::function action) override; + long long SetTimeout(std::chrono::milliseconds milliseconds, + std::function action) override; + long long SetInterval(std::chrono::milliseconds milliseconds, + std::function action) override; + void CancelTimer(long long id) override; + + std::vector GetAllWindow() override; + INativeWindow* CreateWindow() override; + + cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() override; + + cru::platform::graphics::win::direct::DirectGraphicsFactory* + GetDirectFactory() { + return graph_factory_.get(); + } + + ICursorManager* GetCursorManager() override; + + IClipboard* GetClipboard() override; + + HINSTANCE GetInstanceHandle() const { return instance_handle_; } + + GodWindow* GetGodWindow() const { return god_window_.get(); } + TimerManager* GetTimerManager() const { return timer_manager_.get(); } + WindowManager* GetWindowManager() const { return window_manager_.get(); } + + private: + HINSTANCE instance_handle_; + + bool is_quit_on_all_window_closed_ = true; + + std::unique_ptr + graph_factory_; + + std::unique_ptr god_window_; + std::unique_ptr timer_manager_; + std::unique_ptr window_manager_; + + std::unique_ptr cursor_manager_; + std::unique_ptr clipboard_; + + std::vector> quit_handlers_; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/UiApplication.hpp b/include/cru/win/gui/UiApplication.hpp deleted file mode 100644 index 1280e7a6..00000000 --- a/include/cru/win/gui/UiApplication.hpp +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once -#include "Resource.hpp" - -#include "cru/platform/gui/Base.hpp" -#include "cru/platform/gui/UiApplication.hpp" - -#include - -namespace cru::platform::graphics::win::direct { -class DirectGraphicsFactory; -} - -namespace cru::platform::gui::win { -class CRU_WIN_GUI_API WinUiApplication : public WinNativeResource, - public virtual IUiApplication { - public: - static WinUiApplication* GetInstance() { return instance; } - - private: - static WinUiApplication* instance; - - public: - WinUiApplication(); - - CRU_DELETE_COPY(WinUiApplication) - CRU_DELETE_MOVE(WinUiApplication) - - ~WinUiApplication() override; - - public: - int Run() override; - void RequestQuit(int quit_code) override; - - void AddOnQuitHandler(std::function handler) override; - - bool IsQuitOnAllWindowClosed() override { - return is_quit_on_all_window_closed_; - } - void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) override { - is_quit_on_all_window_closed_ = quit_on_all_window_closed; - } - - long long SetImmediate(std::function action) override; - long long SetTimeout(std::chrono::milliseconds milliseconds, - std::function action) override; - long long SetInterval(std::chrono::milliseconds milliseconds, - std::function action) override; - void CancelTimer(long long id) override; - - std::vector GetAllWindow() override; - INativeWindow* CreateWindow() override; - - cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() override; - - cru::platform::graphics::win::direct::DirectGraphicsFactory* - GetDirectFactory() { - return graph_factory_.get(); - } - - ICursorManager* GetCursorManager() override; - - IClipboard* GetClipboard() override; - - HINSTANCE GetInstanceHandle() const { return instance_handle_; } - - GodWindow* GetGodWindow() const { return god_window_.get(); } - TimerManager* GetTimerManager() const { return timer_manager_.get(); } - WindowManager* GetWindowManager() const { return window_manager_.get(); } - - private: - HINSTANCE instance_handle_; - - bool is_quit_on_all_window_closed_ = true; - - std::unique_ptr - graph_factory_; - - std::unique_ptr god_window_; - std::unique_ptr timer_manager_; - std::unique_ptr window_manager_; - - std::unique_ptr cursor_manager_; - std::unique_ptr clipboard_; - - std::vector> quit_handlers_; -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Window.h b/include/cru/win/gui/Window.h new file mode 100644 index 00000000..fcbe1dbd --- /dev/null +++ b/include/cru/win/gui/Window.h @@ -0,0 +1,217 @@ +#pragma once +#include "Resource.h" + +#include "WindowNativeMessageEventArgs.h" +#include "cru/platform/gui/Base.h" +#include "cru/platform/gui/Window.h" +#include "cru/win/graphics/direct/WindowRenderTarget.h" + +#include + +namespace cru::platform::gui::win { +class CRU_WIN_GUI_API WinNativeWindow : public WinNativeResource, + public virtual INativeWindow { + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinNativeWindow") + + public: + explicit WinNativeWindow(WinUiApplication* application); + + CRU_DELETE_COPY(WinNativeWindow) + CRU_DELETE_MOVE(WinNativeWindow) + + ~WinNativeWindow() override; + + public: + void Close() override; + + WinNativeWindow* GetParent() override { return parent_window_; } + void SetParent(INativeWindow* parent) override; + + WindowStyleFlag GetStyleFlag() override { return style_flag_; } + void SetStyleFlag(WindowStyleFlag flag) override; + + String GetTitle() override; + void SetTitle(String title) override; + + WindowVisibilityType GetVisibility() override { return visibility_; } + void SetVisibility(WindowVisibilityType visibility) override; + + Size GetClientSize() override; + void SetClientSize(const Size& size) override; + + Rect GetClientRect() override; + void SetClientRect(const Rect& rect) override; + + // Get the rect of the window containing frame. + // The lefttop of the rect is relative to screen lefttop. + Rect GetWindowRect() override; + + // Set the rect of the window containing frame. + // The lefttop of the rect is relative to screen lefttop. + void SetWindowRect(const Rect& rect) override; + + bool RequestFocus() override; + + Point GetMousePosition() override; + + bool CaptureMouse() override; + bool ReleaseMouse() override; + + void RequestRepaint() override; + std::unique_ptr BeginPaint() override; + + void SetCursor(std::shared_ptr cursor) override; + + void SetToForeground() override; + + IEvent* CreateEvent() override { return &create_event_; } + IEvent* DestroyEvent() override { return &destroy_event_; } + IEvent* PaintEvent() override { return &paint_event_; } + IEvent* VisibilityChangeEvent() override { + return &visibility_change_event_; + } + IEvent* ResizeEvent() override { return &resize_event_; } + IEvent* FocusEvent() override { return &focus_event_; } + IEvent* MouseEnterLeaveEvent() override { + return &mouse_enter_leave_event_; + } + IEvent* MouseMoveEvent() override { return &mouse_move_event_; } + IEvent* MouseDownEvent() override { + return &mouse_down_event_; + } + IEvent* MouseUpEvent() override { + return &mouse_up_event_; + } + IEvent* MouseWheelEvent() override { + return &mouse_wheel_event_; + } + + IEvent* KeyDownEvent() override { + return &key_down_event_; + } + IEvent* KeyUpEvent() override { + return &key_up_event_; + } + + IEvent* NativeMessageEvent() { + return &native_message_event_; + } + + IInputMethodContext* GetInputMethodContext() override; + + // Get the handle of the window. Return null if window is invalid. + HWND GetWindowHandle() const { return hwnd_; } + + bool HandleNativeWindowMessage(HWND hwnd, UINT msg, WPARAM w_param, + LPARAM l_param, LRESULT* result); + + graphics::win::direct::D2DWindowRenderTarget* GetWindowRenderTarget() const { + return window_render_target_.get(); + } + + //*************** region: dpi *************** + float GetDpi() const { return dpi_; } + + inline int DipToPixel(const float dip) { + return static_cast(dip * GetDpi() / 96.0f); + } + + inline POINT DipToPixel(const Point& dip_point) { + POINT result; + result.x = DipToPixel(dip_point.x); + result.y = DipToPixel(dip_point.y); + return result; + } + + inline RECT DipToPixel(const Rect& dip_rect) { + RECT result; + result.left = DipToPixel(dip_rect.left); + result.top = DipToPixel(dip_rect.top); + result.right = DipToPixel(dip_rect.GetRight()); + result.bottom = DipToPixel(dip_rect.GetBottom()); + return result; + } + + inline float PixelToDip(const int pixel) { + return static_cast(pixel) * 96.0f / GetDpi(); + } + + inline Point PixelToDip(const POINT& pi_point) { + return Point(PixelToDip(pi_point.x), PixelToDip(pi_point.y)); + } + + inline Rect PixelToDip(const RECT& pi_rect) { + return Rect::FromVertices(PixelToDip(pi_rect.left), PixelToDip(pi_rect.top), + PixelToDip(pi_rect.right), + PixelToDip(pi_rect.bottom)); + } + + private: + // Get the client rect in pixel. + RECT GetClientRectPixel(); + + void RecreateWindow(); + + //*************** region: native messages *************** + + void OnCreateInternal(); + void OnDestroyInternal(); + void OnPaintInternal(); + void OnMoveInternal(int new_left, int new_top); + void OnResizeInternal(int new_width, int new_height); + + void OnSetFocusInternal(); + void OnKillFocusInternal(); + + void OnMouseMoveInternal(POINT point); + void OnMouseLeaveInternal(); + void OnMouseDownInternal(platform::gui::MouseButton button, POINT point); + void OnMouseUpInternal(platform::gui::MouseButton button, POINT point); + + void OnMouseWheelInternal(short delta, POINT point); + void OnKeyDownInternal(int virtual_code); + void OnKeyUpInternal(int virtual_code); + + void OnActivatedInternal(); + void OnDeactivatedInternal(); + + private: + WinUiApplication* application_; + + WindowStyleFlag style_flag_{}; + WindowVisibilityType visibility_ = WindowVisibilityType::Hide; + Rect client_rect_{100, 100, 400, 300}; + String title_; + + HWND hwnd_ = nullptr; + WinNativeWindow* parent_window_ = nullptr; + + float dpi_; + + bool has_focus_ = false; + bool is_mouse_in_ = false; + + std::unique_ptr + window_render_target_; + + std::shared_ptr cursor_; + + std::unique_ptr input_method_context_; + + Event create_event_; + Event destroy_event_; + Event paint_event_; + Event resize_event_; + Event visibility_change_event_; + Event focus_event_; + Event mouse_enter_leave_event_; + Event mouse_move_event_; + Event mouse_down_event_; + Event mouse_up_event_; + Event mouse_wheel_event_; + Event key_down_event_; + Event key_up_event_; + + Event native_message_event_; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Window.hpp b/include/cru/win/gui/Window.hpp deleted file mode 100644 index 75530596..00000000 --- a/include/cru/win/gui/Window.hpp +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once -#include "Resource.hpp" - -#include "WindowNativeMessageEventArgs.hpp" -#include "cru/platform/gui/Base.hpp" -#include "cru/platform/gui/Window.hpp" -#include "cru/win/graphics/direct/WindowRenderTarget.hpp" - -#include - -namespace cru::platform::gui::win { -class CRU_WIN_GUI_API WinNativeWindow : public WinNativeResource, - public virtual INativeWindow { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinNativeWindow") - - public: - explicit WinNativeWindow(WinUiApplication* application); - - CRU_DELETE_COPY(WinNativeWindow) - CRU_DELETE_MOVE(WinNativeWindow) - - ~WinNativeWindow() override; - - public: - void Close() override; - - WinNativeWindow* GetParent() override { return parent_window_; } - void SetParent(INativeWindow* parent) override; - - WindowStyleFlag GetStyleFlag() override { return style_flag_; } - void SetStyleFlag(WindowStyleFlag flag) override; - - String GetTitle() override; - void SetTitle(String title) override; - - WindowVisibilityType GetVisibility() override { return visibility_; } - void SetVisibility(WindowVisibilityType visibility) override; - - Size GetClientSize() override; - void SetClientSize(const Size& size) override; - - Rect GetClientRect() override; - void SetClientRect(const Rect& rect) override; - - // Get the rect of the window containing frame. - // The lefttop of the rect is relative to screen lefttop. - Rect GetWindowRect() override; - - // Set the rect of the window containing frame. - // The lefttop of the rect is relative to screen lefttop. - void SetWindowRect(const Rect& rect) override; - - bool RequestFocus() override; - - Point GetMousePosition() override; - - bool CaptureMouse() override; - bool ReleaseMouse() override; - - void RequestRepaint() override; - std::unique_ptr BeginPaint() override; - - void SetCursor(std::shared_ptr cursor) override; - - void SetToForeground() override; - - IEvent* CreateEvent() override { return &create_event_; } - IEvent* DestroyEvent() override { return &destroy_event_; } - IEvent* PaintEvent() override { return &paint_event_; } - IEvent* VisibilityChangeEvent() override { - return &visibility_change_event_; - } - IEvent* ResizeEvent() override { return &resize_event_; } - IEvent* FocusEvent() override { return &focus_event_; } - IEvent* MouseEnterLeaveEvent() override { - return &mouse_enter_leave_event_; - } - IEvent* MouseMoveEvent() override { return &mouse_move_event_; } - IEvent* MouseDownEvent() override { - return &mouse_down_event_; - } - IEvent* MouseUpEvent() override { - return &mouse_up_event_; - } - IEvent* MouseWheelEvent() override { - return &mouse_wheel_event_; - } - - IEvent* KeyDownEvent() override { - return &key_down_event_; - } - IEvent* KeyUpEvent() override { - return &key_up_event_; - } - - IEvent* NativeMessageEvent() { - return &native_message_event_; - } - - IInputMethodContext* GetInputMethodContext() override; - - // Get the handle of the window. Return null if window is invalid. - HWND GetWindowHandle() const { return hwnd_; } - - bool HandleNativeWindowMessage(HWND hwnd, UINT msg, WPARAM w_param, - LPARAM l_param, LRESULT* result); - - graphics::win::direct::D2DWindowRenderTarget* GetWindowRenderTarget() const { - return window_render_target_.get(); - } - - //*************** region: dpi *************** - float GetDpi() const { return dpi_; } - - inline int DipToPixel(const float dip) { - return static_cast(dip * GetDpi() / 96.0f); - } - - inline POINT DipToPixel(const Point& dip_point) { - POINT result; - result.x = DipToPixel(dip_point.x); - result.y = DipToPixel(dip_point.y); - return result; - } - - inline RECT DipToPixel(const Rect& dip_rect) { - RECT result; - result.left = DipToPixel(dip_rect.left); - result.top = DipToPixel(dip_rect.top); - result.right = DipToPixel(dip_rect.GetRight()); - result.bottom = DipToPixel(dip_rect.GetBottom()); - return result; - } - - inline float PixelToDip(const int pixel) { - return static_cast(pixel) * 96.0f / GetDpi(); - } - - inline Point PixelToDip(const POINT& pi_point) { - return Point(PixelToDip(pi_point.x), PixelToDip(pi_point.y)); - } - - inline Rect PixelToDip(const RECT& pi_rect) { - return Rect::FromVertices(PixelToDip(pi_rect.left), PixelToDip(pi_rect.top), - PixelToDip(pi_rect.right), - PixelToDip(pi_rect.bottom)); - } - - private: - // Get the client rect in pixel. - RECT GetClientRectPixel(); - - void RecreateWindow(); - - //*************** region: native messages *************** - - void OnCreateInternal(); - void OnDestroyInternal(); - void OnPaintInternal(); - void OnMoveInternal(int new_left, int new_top); - void OnResizeInternal(int new_width, int new_height); - - void OnSetFocusInternal(); - void OnKillFocusInternal(); - - void OnMouseMoveInternal(POINT point); - void OnMouseLeaveInternal(); - void OnMouseDownInternal(platform::gui::MouseButton button, POINT point); - void OnMouseUpInternal(platform::gui::MouseButton button, POINT point); - - void OnMouseWheelInternal(short delta, POINT point); - void OnKeyDownInternal(int virtual_code); - void OnKeyUpInternal(int virtual_code); - - void OnActivatedInternal(); - void OnDeactivatedInternal(); - - private: - WinUiApplication* application_; - - WindowStyleFlag style_flag_{}; - WindowVisibilityType visibility_ = WindowVisibilityType::Hide; - Rect client_rect_{100, 100, 400, 300}; - String title_; - - HWND hwnd_ = nullptr; - WinNativeWindow* parent_window_ = nullptr; - - float dpi_; - - bool has_focus_ = false; - bool is_mouse_in_ = false; - - std::unique_ptr - window_render_target_; - - std::shared_ptr cursor_; - - std::unique_ptr input_method_context_; - - Event create_event_; - Event destroy_event_; - Event paint_event_; - Event resize_event_; - Event visibility_change_event_; - Event focus_event_; - Event mouse_enter_leave_event_; - Event mouse_move_event_; - Event mouse_down_event_; - Event mouse_up_event_; - Event mouse_wheel_event_; - Event key_down_event_; - Event key_up_event_; - - Event native_message_event_; -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/WindowClass.h b/include/cru/win/gui/WindowClass.h new file mode 100644 index 00000000..50729887 --- /dev/null +++ b/include/cru/win/gui/WindowClass.h @@ -0,0 +1,24 @@ +#pragma once +#include "Base.h" + +#include + +namespace cru::platform::gui::win { +class CRU_WIN_GUI_API WindowClass : public Object { + public: + WindowClass(std::wstring name, WNDPROC window_proc, HINSTANCE h_instance); + + CRU_DELETE_COPY(WindowClass) + CRU_DELETE_MOVE(WindowClass) + + ~WindowClass() override = default; + + const wchar_t* GetName() const { return name_.c_str(); } + + ATOM GetAtom() const { return atom_; } + + private: + std::wstring name_; + ATOM atom_; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/WindowClass.hpp b/include/cru/win/gui/WindowClass.hpp deleted file mode 100644 index ab55b214..00000000 --- a/include/cru/win/gui/WindowClass.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "Base.hpp" - -#include - -namespace cru::platform::gui::win { -class CRU_WIN_GUI_API WindowClass : public Object { - public: - WindowClass(std::wstring name, WNDPROC window_proc, HINSTANCE h_instance); - - CRU_DELETE_COPY(WindowClass) - CRU_DELETE_MOVE(WindowClass) - - ~WindowClass() override = default; - - const wchar_t* GetName() const { return name_.c_str(); } - - ATOM GetAtom() const { return atom_; } - - private: - std::wstring name_; - ATOM atom_; -}; -} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/WindowNativeMessageEventArgs.h b/include/cru/win/gui/WindowNativeMessageEventArgs.h new file mode 100644 index 00000000..bc85a597 --- /dev/null +++ b/include/cru/win/gui/WindowNativeMessageEventArgs.h @@ -0,0 +1,40 @@ +#pragma once +#include "Base.h" + +#include "cru/common/Base.h" + +namespace cru::platform::gui::win { +struct CRU_WIN_GUI_API WindowNativeMessage { + HWND hwnd; + UINT msg; + WPARAM w_param; + LPARAM l_param; +}; + +class CRU_WIN_GUI_API WindowNativeMessageEventArgs : public Object { + public: + WindowNativeMessageEventArgs(const WindowNativeMessage& message) + : message_(message) {} + CRU_DEFAULT_COPY(WindowNativeMessageEventArgs) + CRU_DEFAULT_MOVE(WindowNativeMessageEventArgs) + ~WindowNativeMessageEventArgs() override = default; + + const WindowNativeMessage& GetWindowMessage() const { return message_; } + + LRESULT GetResult() const { return result_; } + void SetResult(LRESULT result) { result_ = result; } + + bool IsHandled() const { return handled_; } + void SetHandled(bool handled) { handled_ = handled; } + + void HandleWithResult(LRESULT result) { + handled_ = true; + result_ = result; + } + + private: + WindowNativeMessage message_; + LRESULT result_; + bool handled_ = false; +}; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/WindowNativeMessageEventArgs.hpp b/include/cru/win/gui/WindowNativeMessageEventArgs.hpp deleted file mode 100644 index 7e62c19d..00000000 --- a/include/cru/win/gui/WindowNativeMessageEventArgs.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once -#include "Base.hpp" - -#include "cru/common/Base.hpp" - -namespace cru::platform::gui::win { -struct CRU_WIN_GUI_API WindowNativeMessage { - HWND hwnd; - UINT msg; - WPARAM w_param; - LPARAM l_param; -}; - -class CRU_WIN_GUI_API WindowNativeMessageEventArgs : public Object { - public: - WindowNativeMessageEventArgs(const WindowNativeMessage& message) - : message_(message) {} - CRU_DEFAULT_COPY(WindowNativeMessageEventArgs) - CRU_DEFAULT_MOVE(WindowNativeMessageEventArgs) - ~WindowNativeMessageEventArgs() override = default; - - const WindowNativeMessage& GetWindowMessage() const { return message_; } - - LRESULT GetResult() const { return result_; } - void SetResult(LRESULT result) { result_ = result; } - - bool IsHandled() const { return handled_; } - void SetHandled(bool handled) { handled_ = handled; } - - void HandleWithResult(LRESULT result) { - handled_ = true; - result_ = result; - } - - private: - WindowNativeMessage message_; - LRESULT result_; - bool handled_ = false; -}; -} // namespace cru::platform::gui::win -- cgit v1.2.3