diff options
author | crupest <crupest@outlook.com> | 2022-01-12 23:13:10 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-12 23:13:10 +0800 |
commit | 276ae73fa444c16f34a379ae9d8f58c883056b4a (patch) | |
tree | 96f4d7103976836e918b4fa1db0fdbb80777986e /include/cru/win | |
parent | 01f98ce88950cdb729f5db58bf26f2fffa1c326c (diff) | |
parent | 65c799c5339ba37bea2217b168e96b15aceaef85 (diff) | |
download | cru-276ae73fa444c16f34a379ae9d8f58c883056b4a.tar.gz cru-276ae73fa444c16f34a379ae9d8f58c883056b4a.tar.bz2 cru-276ae73fa444c16f34a379ae9d8f58c883056b4a.zip |
Merge pull request #44 from crupest/dev
Windows development.
Diffstat (limited to 'include/cru/win')
-rw-r--r-- | include/cru/win/WinPreConfig.hpp | 1 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Brush.hpp | 4 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Factory.hpp | 15 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Font.hpp | 6 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Geometry.hpp | 8 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Painter.hpp | 10 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/Resource.hpp | 20 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/TextLayout.hpp | 23 | ||||
-rw-r--r-- | include/cru/win/graphics/direct/WindowRenderTarget.hpp | 6 | ||||
-rw-r--r-- | include/cru/win/gui/GodWindow.hpp | 1 | ||||
-rw-r--r-- | include/cru/win/gui/InputMethod.hpp | 6 | ||||
-rw-r--r-- | include/cru/win/gui/UiApplication.hpp | 22 | ||||
-rw-r--r-- | include/cru/win/gui/Window.hpp | 55 |
13 files changed, 118 insertions, 59 deletions
diff --git a/include/cru/win/WinPreConfig.hpp b/include/cru/win/WinPreConfig.hpp index 1613da95..1bd494f2 100644 --- a/include/cru/win/WinPreConfig.hpp +++ b/include/cru/win/WinPreConfig.hpp @@ -8,6 +8,7 @@ #undef CreateWindow #undef DrawText #undef CreateFont +#undef CreateEvent #include <d2d1_2.h> #include <d3d11.h> diff --git a/include/cru/win/graphics/direct/Brush.hpp b/include/cru/win/graphics/direct/Brush.hpp index fbff83b5..9d8e5384 100644 --- a/include/cru/win/graphics/direct/Brush.hpp +++ b/include/cru/win/graphics/direct/Brush.hpp @@ -9,12 +9,12 @@ struct ID2DBrush : virtual IBrush { virtual ID2D1Brush* GetD2DBrushInterface() const = 0; }; -class D2DSolidColorBrush : public DirectGraphResource, +class D2DSolidColorBrush : public DirectGraphicsResource, public virtual ISolidColorBrush, public virtual ID2DBrush, public virtual IComResource<ID2D1SolidColorBrush> { public: - explicit D2DSolidColorBrush(DirectGraphFactory* factory); + explicit D2DSolidColorBrush(DirectGraphicsFactory* factory); CRU_DELETE_COPY(D2DSolidColorBrush) CRU_DELETE_MOVE(D2DSolidColorBrush) diff --git a/include/cru/win/graphics/direct/Factory.hpp b/include/cru/win/graphics/direct/Factory.hpp index 70f3ede1..efcebba7 100644 --- a/include/cru/win/graphics/direct/Factory.hpp +++ b/include/cru/win/graphics/direct/Factory.hpp @@ -4,14 +4,15 @@ #include "cru/platform/graphics/Factory.hpp" namespace cru::platform::graphics::win::direct { -class DirectGraphFactory : public DirectResource, public virtual IGraphFactory { +class DirectGraphicsFactory : public DirectResource, + public virtual IGraphicsFactory { public: - DirectGraphFactory(); + DirectGraphicsFactory(); - CRU_DELETE_COPY(DirectGraphFactory) - CRU_DELETE_MOVE(DirectGraphFactory) + CRU_DELETE_COPY(DirectGraphicsFactory) + CRU_DELETE_MOVE(DirectGraphicsFactory) - ~DirectGraphFactory() override; + ~DirectGraphicsFactory() override; public: ID3D11Device* GetD3D11Device() const { return d3d11_device_.Get(); } @@ -38,11 +39,11 @@ class DirectGraphFactory : public DirectResource, public virtual IGraphFactory { std::unique_ptr<IGeometryBuilder> CreateGeometryBuilder() override; - std::unique_ptr<IFont> CreateFont(std::u16string font_family, + std::unique_ptr<IFont> CreateFont(String font_family, float font_size) override; std::unique_ptr<ITextLayout> CreateTextLayout(std::shared_ptr<IFont> font, - std::u16string text) override; + String text) override; private: Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_; diff --git a/include/cru/win/graphics/direct/Font.hpp b/include/cru/win/graphics/direct/Font.hpp index fd3921a3..3cd94f82 100644 --- a/include/cru/win/graphics/direct/Font.hpp +++ b/include/cru/win/graphics/direct/Font.hpp @@ -7,11 +7,11 @@ #include <string_view> namespace cru::platform::graphics::win::direct { -class DWriteFont : public DirectGraphResource, +class DWriteFont : public DirectGraphicsResource, public virtual IFont, public virtual IComResource<IDWriteTextFormat> { public: - DWriteFont(DirectGraphFactory* factory, std::u16string font_family, + DWriteFont(DirectGraphicsFactory* factory, String font_family, float font_size); CRU_DELETE_COPY(DWriteFont) @@ -27,7 +27,7 @@ class DWriteFont : public DirectGraphResource, float GetFontSize() override; private: - std::u16string font_family_; + String font_family_; Microsoft::WRL::ComPtr<IDWriteTextFormat> text_format_; }; } // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graphics/direct/Geometry.hpp b/include/cru/win/graphics/direct/Geometry.hpp index edfec590..b3b82f9c 100644 --- a/include/cru/win/graphics/direct/Geometry.hpp +++ b/include/cru/win/graphics/direct/Geometry.hpp @@ -5,10 +5,10 @@ #include "cru/platform/graphics/Geometry.hpp" namespace cru::platform::graphics::win::direct { -class D2DGeometryBuilder : public DirectGraphResource, +class D2DGeometryBuilder : public DirectGraphicsResource, public virtual IGeometryBuilder { public: - explicit D2DGeometryBuilder(DirectGraphFactory* factory); + explicit D2DGeometryBuilder(DirectGraphicsFactory* factory); CRU_DELETE_COPY(D2DGeometryBuilder) CRU_DELETE_MOVE(D2DGeometryBuilder) @@ -33,11 +33,11 @@ class D2DGeometryBuilder : public DirectGraphResource, Microsoft::WRL::ComPtr<ID2D1GeometrySink> geometry_sink_; }; -class D2DGeometry : public DirectGraphResource, +class D2DGeometry : public DirectGraphicsResource, public virtual IGeometry, public IComResource<ID2D1Geometry> { public: - D2DGeometry(DirectGraphFactory* factory, + D2DGeometry(DirectGraphicsFactory* factory, Microsoft::WRL::ComPtr<ID2D1PathGeometry> geometry); CRU_DELETE_COPY(D2DGeometry) diff --git a/include/cru/win/graphics/direct/Painter.hpp b/include/cru/win/graphics/direct/Painter.hpp index b34c1563..d7b90d19 100644 --- a/include/cru/win/graphics/direct/Painter.hpp +++ b/include/cru/win/graphics/direct/Painter.hpp @@ -24,6 +24,7 @@ class D2DPainter : public DirectResource, public: Matrix GetTransform() override; void SetTransform(const platform::Matrix& matrix) override; + void ConcatTransform(const Matrix& matrix) override; void Clear(const Color& color) override; @@ -32,6 +33,9 @@ class D2DPainter : public DirectResource, void StrokeRectangle(const Rect& rectangle, IBrush* brush, float width) override; void FillRectangle(const Rect& rectangle, IBrush* brush) override; + void StrokeEllipse(const Rect& outline_rect, IBrush* brush, + float width) override; + void FillEllipse(const Rect& outline_rect, IBrush* brush) override; void StrokeGeometry(IGeometry* geometry, IBrush* brush, float width) override; void FillGeometry(IGeometry* geometry, IBrush* brush) override; @@ -40,9 +44,11 @@ class D2DPainter : public DirectResource, IBrush* brush) override; void PushLayer(const Rect& bounds) override; - void PopLayer() override; + void PushState() override; + void PopState() override; + void EndDraw() override final; protected: @@ -56,6 +62,8 @@ class D2DPainter : public DirectResource, ID2D1RenderTarget* render_target_; std::vector<Microsoft::WRL::ComPtr<ID2D1Layer>> layers_; + std::vector<Microsoft::WRL::ComPtr<ID2D1DrawingStateBlock>> + drawing_state_stack_; bool is_drawing_ = true; }; diff --git a/include/cru/win/graphics/direct/Resource.hpp b/include/cru/win/graphics/direct/Resource.hpp index e6ffb203..c376628d 100644 --- a/include/cru/win/graphics/direct/Resource.hpp +++ b/include/cru/win/graphics/direct/Resource.hpp @@ -6,7 +6,7 @@ #include <string_view> namespace cru::platform::graphics::win::direct { -class DirectGraphFactory; +class DirectGraphicsFactory; class DirectResource : public Object, public virtual IPlatformResource { public: @@ -25,25 +25,25 @@ class DirectResource : public Object, public virtual IPlatformResource { String GetPlatformId() const final { return kPlatformId; } }; -class DirectGraphResource : public DirectResource, - public virtual IGraphResource { +class DirectGraphicsResource : public DirectResource, + public virtual IGraphicsResource { protected: // Param factory can't be null. - explicit DirectGraphResource(DirectGraphFactory* factory); + explicit DirectGraphicsResource(DirectGraphicsFactory* factory); public: - CRU_DELETE_COPY(DirectGraphResource) - CRU_DELETE_MOVE(DirectGraphResource) + CRU_DELETE_COPY(DirectGraphicsResource) + CRU_DELETE_MOVE(DirectGraphicsResource) - ~DirectGraphResource() override = default; + ~DirectGraphicsResource() override = default; public: - IGraphFactory* GetGraphFactory() final; + IGraphicsFactory* GetGraphicsFactory() final; public: - DirectGraphFactory* GetDirectFactory() const { return factory_; } + DirectGraphicsFactory* GetDirectFactory() const { return factory_; } private: - DirectGraphFactory* factory_; + DirectGraphicsFactory* factory_; }; } // namespace cru::platform::graphics::win::direct diff --git a/include/cru/win/graphics/direct/TextLayout.hpp b/include/cru/win/graphics/direct/TextLayout.hpp index aa040278..b1843dd7 100644 --- a/include/cru/win/graphics/direct/TextLayout.hpp +++ b/include/cru/win/graphics/direct/TextLayout.hpp @@ -10,12 +10,12 @@ namespace cru::platform::graphics::win::direct { class DWriteFont; -class DWriteTextLayout : public DirectGraphResource, +class DWriteTextLayout : public DirectGraphicsResource, public virtual ITextLayout, public virtual IComResource<IDWriteTextLayout> { public: - DWriteTextLayout(DirectGraphFactory* factory, std::shared_ptr<IFont> font, - std::u16string text); + DWriteTextLayout(DirectGraphicsFactory* factory, std::shared_ptr<IFont> font, + String text); CRU_DELETE_COPY(DWriteTextLayout) CRU_DELETE_MOVE(DWriteTextLayout) @@ -28,9 +28,8 @@ class DWriteTextLayout : public DirectGraphResource, } public: - std::u16string GetText() override; - std::u16string_view GetTextView() override; - void SetText(std::u16string new_text) override; + String GetText() override; + void SetText(String new_text) override; std::shared_ptr<IFont> GetFont() override; void SetFont(std::shared_ptr<IFont> font) override; @@ -38,15 +37,23 @@ class DWriteTextLayout : public DirectGraphResource, void SetMaxWidth(float max_width) override; void SetMaxHeight(float max_height) override; + bool IsEditMode() override; + void SetEditMode(bool enable) override; + + Index GetLineIndexFromCharIndex(Index char_index) override; + float GetLineHeight(Index line_index) override; + Index GetLineCount() 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; - Point TextSinglePoint(Index position, bool trailing) override; + Rect TextSinglePoint(Index position, bool trailing) override; TextHitTestResult HitTest(const Point& point) override; private: - std::u16string text_; + bool edit_mode_ = false; + String text_; std::shared_ptr<DWriteFont> font_; float max_width_ = std::numeric_limits<float>::max(); float max_height_ = std::numeric_limits<float>::max(); diff --git a/include/cru/win/graphics/direct/WindowRenderTarget.hpp b/include/cru/win/graphics/direct/WindowRenderTarget.hpp index 75b1bf20..c197841d 100644 --- a/include/cru/win/graphics/direct/WindowRenderTarget.hpp +++ b/include/cru/win/graphics/direct/WindowRenderTarget.hpp @@ -5,7 +5,7 @@ namespace cru::platform::graphics::win::direct { // Represents a window render target. class D2DWindowRenderTarget : public Object { public: - D2DWindowRenderTarget(gsl::not_null<DirectGraphFactory*> factory, HWND hwnd); + D2DWindowRenderTarget(gsl::not_null<DirectGraphicsFactory*> factory, HWND hwnd); CRU_DELETE_COPY(D2DWindowRenderTarget) CRU_DELETE_MOVE(D2DWindowRenderTarget) @@ -13,7 +13,7 @@ class D2DWindowRenderTarget : public Object { ~D2DWindowRenderTarget() override = default; public: - graphics::win::direct::DirectGraphFactory* GetDirectFactory() const { + graphics::win::direct::DirectGraphicsFactory* GetDirectFactory() const { return factory_; } @@ -33,7 +33,7 @@ class D2DWindowRenderTarget : public Object { void CreateTargetBitmap(); private: - DirectGraphFactory* factory_; + DirectGraphicsFactory* factory_; HWND hwnd_; Microsoft::WRL::ComPtr<ID2D1DeviceContext> d2d1_device_context_; Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain_; diff --git a/include/cru/win/gui/GodWindow.hpp b/include/cru/win/gui/GodWindow.hpp index 0343b159..d9a128e6 100644 --- a/include/cru/win/gui/GodWindow.hpp +++ b/include/cru/win/gui/GodWindow.hpp @@ -3,6 +3,7 @@ #include "WindowNativeMessageEventArgs.hpp" #include "cru/common/Event.hpp" +#include "cru/common/String.hpp" #include <memory> diff --git a/include/cru/win/gui/InputMethod.hpp b/include/cru/win/gui/InputMethod.hpp index 51a007d8..3784dcda 100644 --- a/include/cru/win/gui/InputMethod.hpp +++ b/include/cru/win/gui/InputMethod.hpp @@ -65,12 +65,12 @@ class WinInputMethodContext : public WinNativeResource, IEvent<std::nullptr_t>* CompositionEvent() override; - IEvent<std::u16string_view>* TextEvent() override; + IEvent<StringView>* TextEvent() override; private: void OnWindowNativeMessage(WindowNativeMessageEventArgs& args); - std::u16string GetResultString(); + String GetResultString(); AutoHIMC GetHIMC(); @@ -82,6 +82,6 @@ class WinInputMethodContext : public WinNativeResource, 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_; + Event<StringView> text_event_; }; } // namespace cru::platform::gui::win diff --git a/include/cru/win/gui/UiApplication.hpp b/include/cru/win/gui/UiApplication.hpp index 4cf46858..4b972fee 100644 --- a/include/cru/win/gui/UiApplication.hpp +++ b/include/cru/win/gui/UiApplication.hpp @@ -7,7 +7,7 @@ #include <memory> namespace cru::platform::graphics::win::direct { -class DirectGraphFactory; +class DirectGraphicsFactory; } namespace cru::platform::gui::win { @@ -33,6 +33,13 @@ class WinUiApplication : public WinNativeResource, void AddOnQuitHandler(std::function<void()> 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<void()> action) override; long long SetTimeout(std::chrono::milliseconds milliseconds, std::function<void()> action) override; @@ -41,16 +48,19 @@ class WinUiApplication : public WinNativeResource, void CancelTimer(long long id) override; std::vector<INativeWindow*> GetAllWindow() override; - INativeWindow* CreateWindow(INativeWindow* parent, CreateWindowFlag flag) override; + INativeWindow* CreateWindow() override; - cru::platform::graphics::IGraphFactory* GetGraphFactory() override; + cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() override; - cru::platform::graphics::win::direct::DirectGraphFactory* GetDirectFactory() { + 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(); } @@ -60,7 +70,9 @@ class WinUiApplication : public WinNativeResource, private: HINSTANCE instance_handle_; - std::unique_ptr<cru::platform::graphics::win::direct::DirectGraphFactory> + bool is_quit_on_all_window_closed_ = true; + + std::unique_ptr<cru::platform::graphics::win::direct::DirectGraphicsFactory> graph_factory_; std::unique_ptr<GodWindow> god_window_; diff --git a/include/cru/win/gui/Window.hpp b/include/cru/win/gui/Window.hpp index 97a74fa7..41eac5fa 100644 --- a/include/cru/win/gui/Window.hpp +++ b/include/cru/win/gui/Window.hpp @@ -2,7 +2,6 @@ #include "Resource.hpp" #include "WindowNativeMessageEventArgs.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" @@ -14,8 +13,7 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinNativeWindow") public: - WinNativeWindow(WinUiApplication* application, WindowClass* window_class, - DWORD window_style, WinNativeWindow* parent); + explicit WinNativeWindow(WinUiApplication* application); CRU_DELETE_COPY(WinNativeWindow) CRU_DELETE_MOVE(WinNativeWindow) @@ -26,13 +24,20 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { void Close() override; WinNativeWindow* GetParent() override { return parent_window_; } + void SetParent(INativeWindow* parent) override; - bool IsVisible() override; - void SetVisible(bool is_visible) override; + WindowStyleFlag GetStyleFlag() override { return style_flag_; } + void SetStyleFlag(WindowStyleFlag flag) 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; @@ -41,6 +46,8 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { // 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; @@ -51,8 +58,12 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { void SetCursor(std::shared_ptr<ICursor> cursor) override; + IEvent<std::nullptr_t>* CreateEvent() override { return &create_event_; } IEvent<std::nullptr_t>* DestroyEvent() override { return &destroy_event_; } IEvent<std::nullptr_t>* PaintEvent() override { return &paint_event_; } + IEvent<WindowVisibilityType>* VisibilityChangeEvent() override { + return &visibility_change_event_; + } IEvent<Size>* ResizeEvent() override { return &resize_event_; } IEvent<FocusChangeType>* FocusEvent() override { return &focus_event_; } IEvent<MouseEnterLeaveType>* MouseEnterLeaveEvent() override { @@ -106,6 +117,15 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { 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<float>(pixel) * 96.0f / GetDpi(); } @@ -114,14 +134,24 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { 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(); @@ -142,15 +172,12 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { private: WinUiApplication* application_; - // when delete is called first, it set this to true to indicate - // destroy message handler not to double delete this instance; - // when destroy handler is called first (by user action or method - // Close), it set this to true to indicate delete not call Close - // again. - bool sync_flag_ = false; + WindowStyleFlag style_flag_{}; + WindowVisibilityType visibility_ = WindowVisibilityType::Hide; + Rect client_rect_{100, 100, 400, 300}; - HWND hwnd_; - WinNativeWindow* parent_window_; + HWND hwnd_ = nullptr; + WinNativeWindow* parent_window_ = nullptr; float dpi_; @@ -164,9 +191,11 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { std::unique_ptr<WinInputMethodContext> input_method_context_; + Event<std::nullptr_t> create_event_; Event<std::nullptr_t> destroy_event_; Event<std::nullptr_t> paint_event_; Event<Size> resize_event_; + Event<WindowVisibilityType> visibility_change_event_; Event<FocusChangeType> focus_event_; Event<MouseEnterLeaveType> mouse_enter_leave_event_; Event<Point> mouse_move_event_; |