Browse Source

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

demo1
Dan Walmsley 6 years ago
parent
commit
73d5025448
  1. 2
      src/Avalonia.Controls/Platform/IWindowImpl.cs
  2. 16
      src/Avalonia.Controls/Window.cs
  3. 2
      src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs
  4. 2
      src/Avalonia.DesignerSupport/Remote/Stubs.cs
  5. 2
      src/Avalonia.Native/WindowImpl.cs
  6. 2
      src/Avalonia.X11/X11Window.cs
  7. 5
      src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
  8. 36
      src/Windows/Avalonia.Win32/WindowImpl.cs

2
src/Avalonia.Controls/Platform/IWindowImpl.cs

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

16
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
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
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
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
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
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);
}

36
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; }

Loading…
Cancel
Save