#pragma once #ifndef NOMINMAX #define NOMINMAX #endif #include #include namespace XCEngine::UI::Editor::Host { enum class BorderlessWindowChromeHitTarget : std::uint8_t { None = 0, DragRegion, MinimizeButton, MaximizeRestoreButton, CloseButton }; struct BorderlessWindowChromeMetrics { float buttonWidth = 46.0f; float buttonInsetX = 0.0f; float dragPaddingLeft = 6.0f; float dragPaddingRight = 6.0f; float iconThickness = 1.0f; }; struct BorderlessWindowChromePalette { ::XCEngine::UI::UIColor buttonHoverColor = ::XCEngine::UI::UIColor(0.14f, 0.14f, 0.14f, 1.0f); ::XCEngine::UI::UIColor buttonPressedColor = ::XCEngine::UI::UIColor(0.17f, 0.17f, 0.17f, 1.0f); ::XCEngine::UI::UIColor closeButtonHoverColor = ::XCEngine::UI::UIColor(0.84f, 0.28f, 0.22f, 1.0f); ::XCEngine::UI::UIColor closeButtonPressedColor = ::XCEngine::UI::UIColor(0.72f, 0.20f, 0.16f, 1.0f); ::XCEngine::UI::UIColor iconColor = ::XCEngine::UI::UIColor(0.92f, 0.92f, 0.92f, 1.0f); ::XCEngine::UI::UIColor closeIconHoverColor = ::XCEngine::UI::UIColor(1.0f, 1.0f, 1.0f, 1.0f); }; struct BorderlessWindowChromeState { BorderlessWindowChromeHitTarget hoveredTarget = BorderlessWindowChromeHitTarget::None; BorderlessWindowChromeHitTarget pressedTarget = BorderlessWindowChromeHitTarget::None; }; struct BorderlessWindowChromeLayout { ::XCEngine::UI::UIRect titleBarRect = {}; ::XCEngine::UI::UIRect dragRect = {}; ::XCEngine::UI::UIRect minimizeButtonRect = {}; ::XCEngine::UI::UIRect maximizeRestoreButtonRect = {}; ::XCEngine::UI::UIRect closeButtonRect = {}; }; BorderlessWindowChromeLayout BuildBorderlessWindowChromeLayout( const ::XCEngine::UI::UIRect& titleBarRect, float leadingOccupiedRight, const BorderlessWindowChromeMetrics& metrics = {}); BorderlessWindowChromeHitTarget HitTestBorderlessWindowChrome( const BorderlessWindowChromeLayout& layout, const ::XCEngine::UI::UIPoint& point); void AppendBorderlessWindowChrome( ::XCEngine::UI::UIDrawList& drawList, const BorderlessWindowChromeLayout& layout, const BorderlessWindowChromeState& state, bool maximized, const BorderlessWindowChromePalette& palette = {}, const BorderlessWindowChromeMetrics& metrics = {}); void RefreshBorderlessWindowDwmDecorations(HWND hwnd); void EnableBorderlessWindowShadow(HWND hwnd); bool HandleBorderlessWindowGetMinMaxInfo(HWND hwnd, LPARAM lParam); LRESULT HandleBorderlessWindowNcCalcSize( HWND hwnd, WPARAM wParam, LPARAM lParam, UINT dpi); } // namespace XCEngine::UI::Editor::Host