1
0
Эх сурвалжийг харах

Add a readonly offscreen margin, to get the portion of the window that is offscreen.

Dan Walmsley 5 жил өмнө
parent
commit
73d5025448

+ 2 - 0
src/Avalonia.Controls/Platform/IWindowImpl.cs

@@ -104,5 +104,7 @@ namespace Avalonia.Platform
         Action<bool> ExtendClientAreaToDecorationsChanged { get; set; }
         
         Thickness ExtendedMargins { get; }
+
+        Thickness OffScreenMargin { get; } 
     }
 }

+ 15 - 1
src/Avalonia.Controls/Window.cs

@@ -113,7 +113,11 @@ namespace Avalonia.Controls
         public static readonly DirectProperty<Window, Thickness> WindowDecorationMarginsProperty =
             AvaloniaProperty.RegisterDirect<Window, Thickness>(nameof(WindowDecorationMargins),
                 o => o.WindowDecorationMargins);
-        
+
+        public static readonly DirectProperty<Window, Thickness> OffScreenMarginProperty =
+            AvaloniaProperty.RegisterDirect<Window, Thickness>(nameof(OffScreenMargin),
+                o => o.OffScreenMargin);
+
 
         /// <summary>
         /// Defines the <see cref="SystemDecorations"/> property.
@@ -304,6 +308,14 @@ namespace Avalonia.Controls
             private set => SetAndRaise(WindowDecorationMarginsProperty, ref _windowDecorationMargins, value);
         }
 
+        private Thickness _offScreenMargin;
+
+        public Thickness OffScreenMargin
+        {
+            get => _offScreenMargin;
+            private set => SetAndRaise(OffScreenMarginProperty, ref _offScreenMargin, value);
+        }
+
         /// <summary>
         /// Sets the system decorations (title bar, border, etc)
         /// </summary>
@@ -507,6 +519,8 @@ namespace Avalonia.Controls
             IsExtendedIntoWindowDecorations = isExtended;
 
             WindowDecorationMargins = PlatformImpl.ExtendedMargins;
+
+            OffScreenMargin = PlatformImpl.OffScreenMargin;
         }
 
         /// <summary>

+ 2 - 0
src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs

@@ -91,6 +91,8 @@ namespace Avalonia.DesignerSupport.Remote
 
         public bool IsClientAreaExtendedToDecorations { get; }
 
+        public Thickness OffScreenMargin { get; } = new Thickness();
+
         public void Activate()
         {
         }

+ 2 - 0
src/Avalonia.DesignerSupport/Remote/Stubs.cs

@@ -43,6 +43,8 @@ namespace Avalonia.DesignerSupport.Remote
 
         public Thickness ExtendedMargins { get; } = new Thickness();
 
+        public Thickness OffScreenMargin { get; } = new Thickness();
+
         public WindowStub(IWindowImpl parent = null)
         {
             if (parent != null)

+ 2 - 0
src/Avalonia.Native/WindowImpl.cs

@@ -102,6 +102,8 @@ namespace Avalonia.Native
 
         public Thickness ExtendedMargins { get; } = new Thickness();
 
+        public Thickness OffScreenMargin { get; } = new Thickness();
+
         public bool IsClientAreaExtendedToDecorations { get; }
 
         public void SetExtendClientAreaToDecorationsHint(bool extendIntoClientAreaHint)

+ 2 - 0
src/Avalonia.X11/X11Window.cs

@@ -315,6 +315,8 @@ namespace Avalonia.X11
 
         public Thickness ExtendedMargins { get; } = new Thickness();
 
+        public Thickness OffScreenMargin { get; } = new Thickness();
+
         public bool IsClientAreaExtendedToDecorations { get; }
 
         public Action Closed { get; set; }

+ 5 - 0
src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

@@ -374,6 +374,11 @@ namespace Avalonia.Win32
                         if (windowState != _lastWindowState)
                         {
                             _lastWindowState = windowState;
+
+                            UpdateExtendMargins();
+
+                            ExtendClientAreaToDecorationsChanged?.Invoke(true);
+
                             WindowStateChanged?.Invoke(windowState);
                         }
 

+ 35 - 1
src/Windows/Avalonia.Win32/WindowImpl.cs

@@ -42,7 +42,8 @@ namespace Avalonia.Win32
         private bool _isFullScreenActive;
         private bool _isClientAreaExtended;
         private Thickness _extendedMargins;
-
+        private Thickness _offScreenMargin;
+ 
 #if USE_MANAGED_DRAG
         private readonly ManagedWindowResizeDragHelper _managedDrag;
 #endif
@@ -667,6 +668,37 @@ namespace Avalonia.Win32
             TaskBarList.MarkFullscreen(_hwnd, fullscreen);
         }
 
+        private MARGINS UpdateExtendMargins()
+        {
+            RECT borderThickness = new RECT();
+            RECT borderCaptionThickness = new RECT();            
+
+            AdjustWindowRectEx(ref borderCaptionThickness, (uint)(GetStyle()), false, 0);
+            AdjustWindowRectEx(ref borderThickness, (uint)(GetStyle() & ~WindowStyles.WS_CAPTION), false, 0);
+            borderThickness.left *= -1;
+            borderThickness.top *= -1;
+            borderCaptionThickness.left *= -1;
+            borderCaptionThickness.top *= -1;
+
+            _extendedMargins = new Thickness(1 / Scaling, borderCaptionThickness.top / Scaling, 1 / Scaling, 1 / Scaling);
+
+            if (WindowState == WindowState.Maximized)
+            {
+                _offScreenMargin = new Thickness(borderThickness.left / Scaling, borderThickness.top / Scaling, borderThickness.right / Scaling, borderThickness.bottom / Scaling);
+            }
+            else
+            {                
+                _offScreenMargin = new Thickness();
+            }
+
+            MARGINS margins = new MARGINS();
+            margins.cxLeftWidth = 1;
+            margins.cxRightWidth = 1;
+            margins.cyBottomHeight = 1;
+            margins.cyTopHeight = borderThickness.top;
+            return margins;
+        }
+
         private void ExtendClientArea (ExtendClientAreaChromeHints hints)
         {
             if (!_isClientAreaExtended)
@@ -1010,6 +1042,8 @@ namespace Avalonia.Win32
 
         public Thickness ExtendedMargins => _extendedMargins;
 
+        public Thickness OffScreenMargin => _offScreenMargin;
+
         private struct SavedWindowInfo
         {
             public WindowStyles Style { get; set; }