diff options
Diffstat (limited to 'include/cru/win')
-rw-r--r-- | include/cru/win/graphics/direct/Brush.hpp (renamed from include/cru/win/graph/direct/Brush.hpp) | 6 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/ComResource.hpp (renamed from include/cru/win/graph/direct/ComResource.hpp) | 4 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/ConvertUtil.hpp (renamed from include/cru/win/graph/direct/ConvertUtil.hpp) | 6 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Exception.hpp (renamed from include/cru/win/graph/direct/Exception.hpp) | 4 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Factory.hpp (renamed from include/cru/win/graph/direct/Factory.hpp) | 6 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Font.hpp (renamed from include/cru/win/graph/direct/Font.hpp) | 6 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Geometry.hpp (renamed from include/cru/win/graph/direct/Geometry.hpp) | 6 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Painter.hpp (renamed from include/cru/win/graph/direct/Painter.hpp) | 8 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Resource.hpp (renamed from include/cru/win/graph/direct/Resource.hpp) | 6 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/TextLayout.hpp (renamed from include/cru/win/graph/direct/TextLayout.hpp) | 8 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/WindowPainter.hpp | 21 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/WindowRenderTarget.hpp | 42 | ||||
-rw-r--r-- | include/cru/win/gui/Base.hpp (renamed from include/cru/win/native/Base.hpp) | 9 | ||||
-rw-r--r-- | include/cru/win/gui/Cursor.hpp (renamed from include/cru/win/native/Cursor.hpp) | 9 | ||||
-rw-r--r-- | include/cru/win/gui/Exception.hpp (renamed from include/cru/win/native/Exception.hpp) | 4 | ||||
-rw-r--r-- | include/cru/win/gui/GodWindow.hpp (renamed from include/cru/win/native/GodWindow.hpp) | 15 | ||||
-rw-r--r-- | include/cru/win/gui/InputMethod.hpp (renamed from include/cru/win/native/InputMethod.hpp) | 31 | ||||
-rw-r--r-- | include/cru/win/gui/Keyboard.hpp | 9 | ||||
-rw-r--r-- | include/cru/win/gui/Resource.hpp (renamed from include/cru/win/native/Resource.hpp) | 4 | ||||
-rw-r--r-- | include/cru/win/gui/UiApplication.hpp (renamed from include/cru/win/native/UiApplication.hpp) | 22 | ||||
-rw-r--r-- | include/cru/win/gui/Window.hpp (renamed from include/cru/win/native/Window.hpp) | 96 | ||||
-rw-r--r-- | include/cru/win/gui/WindowClass.hpp (renamed from include/cru/win/native/WindowClass.hpp) | 4 | ||||
-rw-r--r-- | include/cru/win/gui/WindowNativeMessageEventArgs.hpp (renamed from include/cru/win/native/WindowNativeMessageEventArgs.hpp) | 4 | ||||
-rw-r--r-- | include/cru/win/native/Keyboard.hpp | 9 | ||||
-rw-r--r-- | include/cru/win/native/WindowRenderTarget.hpp | 47 |
25 files changed, 198 insertions, 188 deletions
diff --git a/include/cru/win/graph/direct/Brush.hpp b/include/cru/win/graphics/direct/Brush.hpp index df1debe3..fbff83b5 100644 --- a/include/cru/win/graph/direct/Brush.hpp +++ b/include/cru/win/graphics/direct/Brush.hpp @@ -2,9 +2,9 @@ #include "ComResource.hpp" #include "Resource.hpp" -#include "cru/platform/graph/Brush.hpp" +#include "cru/platform/graphics/Brush.hpp" -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { struct ID2DBrush : virtual IBrush { virtual ID2D1Brush* GetD2DBrushInterface() const = 0; }; @@ -36,4 +36,4 @@ class D2DSolidColorBrush : public DirectGraphResource, Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> brush_; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/ComResource.hpp b/include/cru/win/graphics/direct/ComResource.hpp index 2ac332cd..34ea39ed 100644 --- a/include/cru/win/graph/direct/ComResource.hpp +++ b/include/cru/win/graphics/direct/ComResource.hpp @@ -3,9 +3,9 @@ #include "cru/common/Base.hpp" -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { template <typename TInterface> struct IComResource : virtual Interface { virtual TInterface* GetComInterface() const = 0; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/ConvertUtil.hpp b/include/cru/win/graphics/direct/ConvertUtil.hpp index 12a04c7b..0d8da8a1 100644 --- a/include/cru/win/graph/direct/ConvertUtil.hpp +++ b/include/cru/win/graphics/direct/ConvertUtil.hpp @@ -1,9 +1,9 @@ #pragma once #include "../../WinPreConfig.hpp" -#include "cru/platform/graph/Base.hpp" +#include "cru/platform/graphics/Base.hpp" -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { inline D2D1_MATRIX_3X2_F Convert(const platform::Matrix& matrix) { D2D1_MATRIX_3X2_F m; m._11 = matrix.m11; @@ -104,4 +104,4 @@ inline bool operator==(const D2D1_ELLIPSE& left, const D2D1_ELLIPSE& right) { inline bool operator!=(const D2D1_ELLIPSE& left, const D2D1_ELLIPSE& right) { return !(left == right); } -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/Exception.hpp b/include/cru/win/graphics/direct/Exception.hpp index 8b62e8fa..72493f2f 100644 --- a/include/cru/win/graph/direct/Exception.hpp +++ b/include/cru/win/graphics/direct/Exception.hpp @@ -1,7 +1,7 @@ #pragma once #include "../../Exception.hpp" -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { using platform::win::HResultError; using platform::win::ThrowIfFailed; -} // namespace cru::platform::graph::win::direct
\ No newline at end of file +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/Factory.hpp b/include/cru/win/graphics/direct/Factory.hpp index e70454f5..70f3ede1 100644 --- a/include/cru/win/graph/direct/Factory.hpp +++ b/include/cru/win/graphics/direct/Factory.hpp @@ -1,9 +1,9 @@ #pragma once #include "Resource.hpp" -#include "cru/platform/graph/Factory.hpp" +#include "cru/platform/graphics/Factory.hpp" -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { class DirectGraphFactory : public DirectResource, public virtual IGraphFactory { public: DirectGraphFactory(); @@ -55,4 +55,4 @@ class DirectGraphFactory : public DirectResource, public virtual IGraphFactory { Microsoft::WRL::ComPtr<IDWriteFactory> dwrite_factory_; Microsoft::WRL::ComPtr<IDWriteFontCollection> dwrite_system_font_collection_; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/Font.hpp b/include/cru/win/graphics/direct/Font.hpp index 2195f3e4..fd3921a3 100644 --- a/include/cru/win/graph/direct/Font.hpp +++ b/include/cru/win/graphics/direct/Font.hpp @@ -2,11 +2,11 @@ #include "ComResource.hpp" #include "Resource.hpp" -#include "cru/platform/graph/Font.hpp" +#include "cru/platform/graphics/Font.hpp" #include <string_view> -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { class DWriteFont : public DirectGraphResource, public virtual IFont, public virtual IComResource<IDWriteTextFormat> { @@ -30,4 +30,4 @@ class DWriteFont : public DirectGraphResource, std::u16string font_family_; Microsoft::WRL::ComPtr<IDWriteTextFormat> text_format_; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/Geometry.hpp b/include/cru/win/graphics/direct/Geometry.hpp index 87987d3e..edfec590 100644 --- a/include/cru/win/graph/direct/Geometry.hpp +++ b/include/cru/win/graphics/direct/Geometry.hpp @@ -2,9 +2,9 @@ #include "ComResource.hpp" #include "Resource.hpp" -#include "cru/platform/graph/Geometry.hpp" +#include "cru/platform/graphics/Geometry.hpp" -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { class D2DGeometryBuilder : public DirectGraphResource, public virtual IGeometryBuilder { public: @@ -54,4 +54,4 @@ class D2DGeometry : public DirectGraphResource, private: Microsoft::WRL::ComPtr<ID2D1PathGeometry> geometry_; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/Painter.hpp b/include/cru/win/graphics/direct/Painter.hpp index a50f962d..b34c1563 100644 --- a/include/cru/win/graph/direct/Painter.hpp +++ b/include/cru/win/graphics/direct/Painter.hpp @@ -2,11 +2,11 @@ #include "ComResource.hpp" #include "Resource.hpp" -#include "cru/platform/graph/Painter.hpp" +#include "cru/platform/graphics/Painter.hpp" #include <vector> -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { class D2DPainter : public DirectResource, public virtual IPainter, public virtual IComResource<ID2D1RenderTarget> { @@ -27,6 +27,8 @@ class D2DPainter : public DirectResource, void Clear(const Color& color) override; + void DrawLine(const Point& start, const Point& end, IBrush* brush, + float width) override; void StrokeRectangle(const Rect& rectangle, IBrush* brush, float width) override; void FillRectangle(const Rect& rectangle, IBrush* brush) override; @@ -57,4 +59,4 @@ class D2DPainter : public DirectResource, bool is_drawing_ = true; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/Resource.hpp b/include/cru/win/graphics/direct/Resource.hpp index 6162ebd8..f60f373e 100644 --- a/include/cru/win/graph/direct/Resource.hpp +++ b/include/cru/win/graphics/direct/Resource.hpp @@ -1,11 +1,11 @@ #pragma once #include "../../WinPreConfig.hpp" -#include "cru/platform/graph/Resource.hpp" +#include "cru/platform/graphics/Resource.hpp" #include <string_view> -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { class DirectGraphFactory; class DirectResource : public Object, public virtual INativeResource { @@ -46,4 +46,4 @@ class DirectGraphResource : public DirectResource, private: DirectGraphFactory* factory_; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graph/direct/TextLayout.hpp b/include/cru/win/graphics/direct/TextLayout.hpp index 016009ab..aa040278 100644 --- a/include/cru/win/graph/direct/TextLayout.hpp +++ b/include/cru/win/graphics/direct/TextLayout.hpp @@ -2,12 +2,12 @@ #include "ComResource.hpp" #include "Resource.hpp" -#include "cru/platform/graph/TextLayout.hpp" +#include "cru/platform/graphics/TextLayout.hpp" #include <limits> #include <memory> -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { class DWriteFont; class DWriteTextLayout : public DirectGraphResource, @@ -38,7 +38,7 @@ class DWriteTextLayout : public DirectGraphResource, void SetMaxWidth(float max_width) override; void SetMaxHeight(float max_height) override; - Rect GetTextBounds() override; + Rect GetTextBounds(bool includingTrailingSpace = false) override; // Return empty vector if text_range.count is 0. Text range could be in // reverse direction, it should be normalized first in implementation. std::vector<Rect> TextRangeRect(const TextRange& text_range) override; @@ -52,4 +52,4 @@ class DWriteTextLayout : public DirectGraphResource, float max_height_ = std::numeric_limits<float>::max(); Microsoft::WRL::ComPtr<IDWriteTextLayout> text_layout_; }; -} // namespace cru::platform::graph::win::direct +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graphics/direct/WindowPainter.hpp b/include/cru/win/graphics/direct/WindowPainter.hpp new file mode 100644 index 00000000..b5faf7b5 --- /dev/null +++ b/include/cru/win/graphics/direct/WindowPainter.hpp @@ -0,0 +1,21 @@ +#pragma once +#include "Painter.hpp" +#include "WindowRenderTarget.hpp" + +namespace cru::platform::graphics::win::direct { +class D2DWindowPainter : public graphics::win::direct::D2DPainter { + public: + explicit D2DWindowPainter(D2DWindowRenderTarget* window); + + CRU_DELETE_COPY(D2DWindowPainter) + CRU_DELETE_MOVE(D2DWindowPainter) + + ~D2DWindowPainter() override; + + protected: + void DoEndDraw() override; + + private: + D2DWindowRenderTarget* render_target_; +}; +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graphics/direct/WindowRenderTarget.hpp b/include/cru/win/graphics/direct/WindowRenderTarget.hpp new file mode 100644 index 00000000..75b1bf20 --- /dev/null +++ b/include/cru/win/graphics/direct/WindowRenderTarget.hpp @@ -0,0 +1,42 @@ +#pragma once +#include "Factory.hpp" + +namespace cru::platform::graphics::win::direct { +// Represents a window render target. +class D2DWindowRenderTarget : public Object { + public: + D2DWindowRenderTarget(gsl::not_null<DirectGraphFactory*> factory, HWND hwnd); + + CRU_DELETE_COPY(D2DWindowRenderTarget) + CRU_DELETE_MOVE(D2DWindowRenderTarget) + + ~D2DWindowRenderTarget() override = default; + + public: + graphics::win::direct::DirectGraphFactory* GetDirectFactory() const { + return factory_; + } + + ID2D1DeviceContext* GetD2D1DeviceContext() { + return d2d1_device_context_.Get(); + } + + void SetDpi(float x, float y); + + // Resize the underlying buffer. + void ResizeBuffer(int width, int height); + + // Present the data of the underlying buffer to the window. + void Present(); + + private: + void CreateTargetBitmap(); + + private: + DirectGraphFactory* factory_; + HWND hwnd_; + Microsoft::WRL::ComPtr<ID2D1DeviceContext> d2d1_device_context_; + Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain_; + Microsoft::WRL::ComPtr<ID2D1Bitmap1> target_bitmap_; +}; +} // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/native/Base.hpp b/include/cru/win/gui/Base.hpp index a50c6dd1..00782663 100644 --- a/include/cru/win/native/Base.hpp +++ b/include/cru/win/gui/Base.hpp @@ -3,17 +3,14 @@ #include "cru/common/Base.hpp" -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class GodWindow; class TimerManager; class WinCursor; class WinCursorManager; class WindowClass; class WindowManager; -class WindowRenderTarget; class WinNativeWindow; -class WinNativeWindowResolver; class WinUiApplication; -class WinInputMethodManager; -class WinInputMethodContextRef; -} // namespace cru::platform::native::win +class WinInputMethodContext; +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/Cursor.hpp b/include/cru/win/gui/Cursor.hpp index 373b9170..e7c76879 100644 --- a/include/cru/win/native/Cursor.hpp +++ b/include/cru/win/gui/Cursor.hpp @@ -1,13 +1,13 @@ #pragma once #include "Resource.hpp" -#include "cru/platform/native/Cursor.hpp" +#include "cru/platform/gui/Cursor.hpp" #include <memory> -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class WinCursor : public WinNativeResource, public virtual ICursor { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::WinCursor") + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinCursor") public: WinCursor(HCURSOR handle, bool auto_destroy); @@ -45,5 +45,6 @@ class WinCursorManager : public WinNativeResource, private: std::shared_ptr<WinCursor> sys_arrow_; std::shared_ptr<WinCursor> sys_hand_; + std::shared_ptr<WinCursor> sys_ibeam_; }; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/Exception.hpp b/include/cru/win/gui/Exception.hpp index 6a5265c1..895e6c14 100644 --- a/include/cru/win/native/Exception.hpp +++ b/include/cru/win/gui/Exception.hpp @@ -1,7 +1,7 @@ #pragma once #include "../Exception.hpp" -namespace cru::platform::native::win { +namespace cru::platform::gui::win { using platform::win::Win32Error; using platform::win::HResultError; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/GodWindow.hpp b/include/cru/win/gui/GodWindow.hpp index 8b20e01f..0343b159 100644 --- a/include/cru/win/native/GodWindow.hpp +++ b/include/cru/win/gui/GodWindow.hpp @@ -1,11 +1,14 @@ #pragma once #include "Base.hpp" +#include "WindowNativeMessageEventArgs.hpp" +#include "cru/common/Event.hpp" + #include <memory> -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class GodWindow : public Object { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::GodWindow") + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::GodWindow") public: explicit GodWindow(WinUiApplication* application); @@ -20,10 +23,16 @@ class GodWindow : public Object { bool HandleGodWindowMessage(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param, LRESULT* result); + IEvent<WindowNativeMessageEventArgs&>* MessageEvent() { + return &message_event_; + } + private: WinUiApplication* application_; std::unique_ptr<WindowClass> god_window_class_; HWND hwnd_; + + Event<WindowNativeMessageEventArgs&> message_event_; }; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/InputMethod.hpp b/include/cru/win/gui/InputMethod.hpp index 113f460d..51a007d8 100644 --- a/include/cru/win/native/InputMethod.hpp +++ b/include/cru/win/gui/InputMethod.hpp @@ -6,13 +6,13 @@ #include "Resource.hpp" #include "WindowNativeMessageEventArgs.hpp" -#include "cru/platform/native/InputMethod.hpp" +#include "cru/platform/gui/InputMethod.hpp" #include <imm.h> -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class AutoHIMC : public Object { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::AutoHIMC") + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::AutoHIMC") public: explicit AutoHIMC(HWND hwnd); @@ -35,7 +35,7 @@ class AutoHIMC : public Object { class WinInputMethodContext : public WinNativeResource, public virtual IInputMethodContext { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::WinInputMethodContext") + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinInputMethodContext") public: WinInputMethodContext(gsl::not_null<WinNativeWindow*> window); @@ -72,31 +72,16 @@ class WinInputMethodContext : public WinNativeResource, std::u16string GetResultString(); - std::optional<AutoHIMC> TryGetHIMC(); + AutoHIMC GetHIMC(); private: - std::shared_ptr<INativeWindowResolver> native_window_resolver_; + WinNativeWindow* native_window_; - std::vector<EventRevokerGuard> event_revoker_guards_; + EventRevokerListGuard event_guard_; Event<std::nullptr_t> composition_start_event_; Event<std::nullptr_t> composition_end_event_; Event<std::nullptr_t> composition_event_; Event<std::u16string_view> text_event_; }; - -class WinInputMethodManager : public WinNativeResource, - public virtual IInputMethodManager { - public: - WinInputMethodManager(WinUiApplication* application); - - CRU_DELETE_COPY(WinInputMethodManager) - CRU_DELETE_MOVE(WinInputMethodManager) - - ~WinInputMethodManager() override; - - public: - std::unique_ptr<IInputMethodContext> GetContext( - INativeWindow* window) override; -}; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/Keyboard.hpp b/include/cru/win/gui/Keyboard.hpp new file mode 100644 index 00000000..5b98833c --- /dev/null +++ b/include/cru/win/gui/Keyboard.hpp @@ -0,0 +1,9 @@ +#pragma once +#include "Base.hpp" + +#include "cru/platform/gui/Keyboard.hpp" + +namespace cru::platform::gui::win { +KeyCode VirtualKeyToKeyCode(int virtual_key); +KeyModifier RetrieveKeyMofifier(); +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/Resource.hpp b/include/cru/win/gui/Resource.hpp index 0de0e1a8..1f6f0a4a 100644 --- a/include/cru/win/native/Resource.hpp +++ b/include/cru/win/gui/Resource.hpp @@ -3,7 +3,7 @@ #include "cru/platform/Resource.hpp" -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class WinNativeResource : public Object, public virtual INativeResource { public: static constexpr std::u16string_view k_platform_id = u"Windows"; @@ -20,4 +20,4 @@ class WinNativeResource : public Object, public virtual INativeResource { public: std::u16string_view GetPlatformId() const final { return k_platform_id; } }; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/UiApplication.hpp b/include/cru/win/gui/UiApplication.hpp index cbc08af7..4cf46858 100644 --- a/include/cru/win/native/UiApplication.hpp +++ b/include/cru/win/gui/UiApplication.hpp @@ -1,15 +1,16 @@ #pragma once #include "Resource.hpp" -#include "cru/platform/native/UiApplication.hpp" +#include "cru/platform/gui/Base.hpp" +#include "cru/platform/gui/UiApplication.hpp" #include <memory> -namespace cru::platform::graph::win::direct { +namespace cru::platform::graphics::win::direct { class DirectGraphFactory; } -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class WinUiApplication : public WinNativeResource, public virtual IUiApplication { public: @@ -32,7 +33,7 @@ class WinUiApplication : public WinNativeResource, void AddOnQuitHandler(std::function<void()> handler) override; - void InvokeLater(std::function<void()> action) override; + long long SetImmediate(std::function<void()> action) override; long long SetTimeout(std::chrono::milliseconds milliseconds, std::function<void()> action) override; long long SetInterval(std::chrono::milliseconds milliseconds, @@ -40,17 +41,15 @@ class WinUiApplication : public WinNativeResource, void CancelTimer(long long id) override; std::vector<INativeWindow*> GetAllWindow() override; - std::shared_ptr<INativeWindowResolver> CreateWindow( - INativeWindow* parent) override; + INativeWindow* CreateWindow(INativeWindow* parent, CreateWindowFlag flag) override; - cru::platform::graph::IGraphFactory* GetGraphFactory() override; + cru::platform::graphics::IGraphFactory* GetGraphFactory() override; - cru::platform::graph::win::direct::DirectGraphFactory* GetDirectFactory() { + cru::platform::graphics::win::direct::DirectGraphFactory* GetDirectFactory() { return graph_factory_.get(); } ICursorManager* GetCursorManager() override; - IInputMethodManager* GetInputMethodManager() override; HINSTANCE GetInstanceHandle() const { return instance_handle_; } @@ -61,7 +60,7 @@ class WinUiApplication : public WinNativeResource, private: HINSTANCE instance_handle_; - std::unique_ptr<cru::platform::graph::win::direct::DirectGraphFactory> + std::unique_ptr<cru::platform::graphics::win::direct::DirectGraphFactory> graph_factory_; std::unique_ptr<GodWindow> god_window_; @@ -69,8 +68,7 @@ class WinUiApplication : public WinNativeResource, std::unique_ptr<WindowManager> window_manager_; std::unique_ptr<WinCursorManager> cursor_manager_; - std::unique_ptr<WinInputMethodManager> input_method_manager_; std::vector<std::function<void()>> quit_handlers_; }; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/Window.hpp b/include/cru/win/gui/Window.hpp index 3e0b11cd..3ba9ef68 100644 --- a/include/cru/win/native/Window.hpp +++ b/include/cru/win/gui/Window.hpp @@ -2,13 +2,16 @@ #include "Resource.hpp" #include "WindowNativeMessageEventArgs.hpp" -#include "cru/platform/native/Window.hpp" +#include "cru/platform/GraphBase.hpp" +#include "cru/platform/gui/Base.hpp" +#include "cru/platform/gui/Window.hpp" +#include "cru/win/graphics/direct/WindowRenderTarget.hpp" #include <memory> -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { - CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::WinNativeWindow") + CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinNativeWindow") public: WinNativeWindow(WinUiApplication* application, WindowClass* window_class, @@ -20,10 +23,6 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { ~WinNativeWindow() override; public: - std::shared_ptr<INativeWindowResolver> GetResolver() override { - return std::static_pointer_cast<INativeWindowResolver>(resolver_); - } - void Close() override; WinNativeWindow* GetParent() override { return parent_window_; } @@ -48,7 +47,7 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { bool ReleaseMouse() override; void RequestRepaint() override; - std::unique_ptr<graph::IPainter> BeginPaint() override; + std::unique_ptr<graphics::IPainter> BeginPaint() override; void SetCursor(std::shared_ptr<ICursor> cursor) override; @@ -60,18 +59,18 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { return &mouse_enter_leave_event_; } IEvent<Point>* MouseMoveEvent() override { return &mouse_move_event_; } - IEvent<platform::native::NativeMouseButtonEventArgs>* MouseDownEvent() + IEvent<platform::gui::NativeMouseButtonEventArgs>* MouseDownEvent() override { return &mouse_down_event_; } - IEvent<platform::native::NativeMouseButtonEventArgs>* MouseUpEvent() + IEvent<platform::gui::NativeMouseButtonEventArgs>* MouseUpEvent() override { return &mouse_up_event_; } - IEvent<platform::native::NativeKeyEventArgs>* KeyDownEvent() override { + IEvent<platform::gui::NativeKeyEventArgs>* KeyDownEvent() override { return &key_down_event_; } - IEvent<platform::native::NativeKeyEventArgs>* KeyUpEvent() override { + IEvent<platform::gui::NativeKeyEventArgs>* KeyUpEvent() override { return &key_up_event_; } @@ -79,16 +78,40 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { 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); - WindowRenderTarget* GetWindowRenderTarget() const { + 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<int>(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 float PixelToDip(const int pixel) { + return static_cast<float>(pixel) * 96.0f / GetDpi(); + } + + inline Point PixelToDip(const POINT& pi_point) { + return Point(PixelToDip(pi_point.x), PixelToDip(pi_point.y)); + } + private: // Get the client rect in pixel. RECT GetClientRectPixel(); @@ -104,8 +127,8 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { void OnMouseMoveInternal(POINT point); void OnMouseLeaveInternal(); - void OnMouseDownInternal(platform::native::MouseButton button, POINT point); - void OnMouseUpInternal(platform::native::MouseButton button, POINT point); + 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); @@ -124,53 +147,32 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { // again. bool sync_flag_ = false; - std::shared_ptr<WinNativeWindowResolver> resolver_; - HWND hwnd_; WinNativeWindow* parent_window_; + float dpi_; + bool has_focus_ = false; bool is_mouse_in_ = false; - std::unique_ptr<WindowRenderTarget> window_render_target_; + std::unique_ptr<graphics::win::direct::D2DWindowRenderTarget> + window_render_target_; std::shared_ptr<WinCursor> cursor_; + std::unique_ptr<WinInputMethodContext> input_method_context_; + Event<std::nullptr_t> destroy_event_; Event<std::nullptr_t> paint_event_; Event<Size> resize_event_; Event<FocusChangeType> focus_event_; Event<MouseEnterLeaveType> mouse_enter_leave_event_; Event<Point> mouse_move_event_; - Event<platform::native::NativeMouseButtonEventArgs> mouse_down_event_; - Event<platform::native::NativeMouseButtonEventArgs> mouse_up_event_; - Event<platform::native::NativeKeyEventArgs> key_down_event_; - Event<platform::native::NativeKeyEventArgs> key_up_event_; + Event<platform::gui::NativeMouseButtonEventArgs> mouse_down_event_; + Event<platform::gui::NativeMouseButtonEventArgs> mouse_up_event_; + Event<platform::gui::NativeKeyEventArgs> key_down_event_; + Event<platform::gui::NativeKeyEventArgs> key_up_event_; Event<WindowNativeMessageEventArgs&> native_message_event_; }; - -class WinNativeWindowResolver : public WinNativeResource, - public virtual INativeWindowResolver { - friend WinNativeWindow::~WinNativeWindow(); - - public: - WinNativeWindowResolver(WinNativeWindow* window) : window_(window) {} - - CRU_DELETE_COPY(WinNativeWindowResolver) - CRU_DELETE_MOVE(WinNativeWindowResolver) - - ~WinNativeWindowResolver() override = default; - - public: - INativeWindow* Resolve() override { return window_; } - - private: - void Reset(); - - private: - WinNativeWindow* window_; -}; - -WinNativeWindow* Resolve(gsl::not_null<INativeWindowResolver*> resolver); -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/WindowClass.hpp b/include/cru/win/gui/WindowClass.hpp index fdd55065..2c07b68f 100644 --- a/include/cru/win/native/WindowClass.hpp +++ b/include/cru/win/gui/WindowClass.hpp @@ -3,7 +3,7 @@ #include <string> -namespace cru::platform::native::win { +namespace cru::platform::gui::win { class WindowClass : public Object { public: WindowClass(std::wstring name, WNDPROC window_proc, HINSTANCE h_instance); @@ -21,4 +21,4 @@ class WindowClass : public Object { std::wstring name_; ATOM atom_; }; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/WindowNativeMessageEventArgs.hpp b/include/cru/win/gui/WindowNativeMessageEventArgs.hpp index 84a7a123..834ba3c2 100644 --- a/include/cru/win/native/WindowNativeMessageEventArgs.hpp +++ b/include/cru/win/gui/WindowNativeMessageEventArgs.hpp @@ -3,7 +3,7 @@ #include "cru/common/Base.hpp" -namespace cru::platform::native::win { +namespace cru::platform::gui::win { struct WindowNativeMessage { HWND hwnd; UINT msg; @@ -37,4 +37,4 @@ class WindowNativeMessageEventArgs : public Object { LRESULT result_; bool handled_ = false; }; -} // namespace cru::platform::native::win +} // namespace cru::platform::gui::win diff --git a/include/cru/win/native/Keyboard.hpp b/include/cru/win/native/Keyboard.hpp deleted file mode 100644 index 790e0015..00000000 --- a/include/cru/win/native/Keyboard.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#include "Base.hpp" - -#include "cru/platform/native/Keyboard.hpp" - -namespace cru::platform::native::win { -KeyCode VirtualKeyToKeyCode(int virtual_key); -KeyModifier RetrieveKeyMofifier(); -} // namespace cru::platform::native::win diff --git a/include/cru/win/native/WindowRenderTarget.hpp b/include/cru/win/native/WindowRenderTarget.hpp deleted file mode 100644 index 83ac1e03..00000000 --- a/include/cru/win/native/WindowRenderTarget.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include "Base.hpp" - -namespace cru::platform::graph::win::direct { -class DirectGraphFactory; -} - -namespace cru::platform::native::win { -// Represents a window render target. -class WindowRenderTarget : public Object { - public: - WindowRenderTarget(graph::win::direct::DirectGraphFactory* factory, - HWND hwnd); - - CRU_DELETE_COPY(WindowRenderTarget) - CRU_DELETE_MOVE(WindowRenderTarget) - - ~WindowRenderTarget() override = default; - - public: - graph::win::direct::DirectGraphFactory* GetDirectFactory() const { - return factory_; - } - - ID2D1DeviceContext* GetD2D1DeviceContext() { - return d2d1_device_context_.Get(); - } - - // Resize the underlying buffer. - void ResizeBuffer(int width, int height); - - // Set this render target as the d2d device context's target. - void SetAsTarget(); - - // Present the data of the underlying buffer to the window. - void Present(); - - private: - void CreateTargetBitmap(); - - private: - graph::win::direct::DirectGraphFactory* factory_; - Microsoft::WRL::ComPtr<ID2D1DeviceContext> d2d1_device_context_; - Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain_; - Microsoft::WRL::ComPtr<ID2D1Bitmap1> target_bitmap_; -}; -} // namespace cru::platform::native::win |