|
@@ -31,10 +31,14 @@ namespace Avalonia.Win32
|
|
|
private IInputRoot _owner;
|
|
private IInputRoot _owner;
|
|
|
private bool _trackingMouse;
|
|
private bool _trackingMouse;
|
|
|
private bool _decorated = true;
|
|
private bool _decorated = true;
|
|
|
|
|
+ private bool _resizable = true;
|
|
|
private double _scaling = 1;
|
|
private double _scaling = 1;
|
|
|
private WindowState _showWindowState;
|
|
private WindowState _showWindowState;
|
|
|
private FramebufferManager _framebuffer;
|
|
private FramebufferManager _framebuffer;
|
|
|
private OleDropTarget _dropTarget;
|
|
private OleDropTarget _dropTarget;
|
|
|
|
|
+ private Size _minSize;
|
|
|
|
|
+ private Size _maxSize;
|
|
|
|
|
+
|
|
|
#if USE_MANAGED_DRAG
|
|
#if USE_MANAGED_DRAG
|
|
|
private readonly ManagedWindowResizeDragHelper _managedDrag;
|
|
private readonly ManagedWindowResizeDragHelper _managedDrag;
|
|
|
#endif
|
|
#endif
|
|
@@ -77,8 +81,8 @@ namespace Avalonia.Win32
|
|
|
{
|
|
{
|
|
|
get
|
|
get
|
|
|
{
|
|
{
|
|
|
- var style = UnmanagedMethods.GetWindowLong(_hwnd, -16);
|
|
|
|
|
- var exStyle = UnmanagedMethods.GetWindowLong(_hwnd, -20);
|
|
|
|
|
|
|
+ var style = UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE);
|
|
|
|
|
+ var exStyle = UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_EXSTYLE);
|
|
|
var padding = new UnmanagedMethods.RECT();
|
|
var padding = new UnmanagedMethods.RECT();
|
|
|
|
|
|
|
|
if (UnmanagedMethods.AdjustWindowRectEx(ref padding, style, false, exStyle))
|
|
if (UnmanagedMethods.AdjustWindowRectEx(ref padding, style, false, exStyle))
|
|
@@ -102,6 +106,12 @@ namespace Avalonia.Win32
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public void SetMinMaxSize(Size minSize, Size maxSize)
|
|
|
|
|
+ {
|
|
|
|
|
+ _minSize = minSize;
|
|
|
|
|
+ _maxSize = maxSize;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public IScreenImpl Screen
|
|
public IScreenImpl Screen
|
|
|
{
|
|
{
|
|
|
get;
|
|
get;
|
|
@@ -235,13 +245,19 @@ namespace Avalonia.Win32
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, -16);
|
|
|
|
|
|
|
+ var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE);
|
|
|
|
|
|
|
|
- style |= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW;
|
|
|
|
|
|
|
+ var systemDecorationStyles = UnmanagedMethods.WindowStyles.WS_OVERLAPPED
|
|
|
|
|
+ | UnmanagedMethods.WindowStyles.WS_CAPTION
|
|
|
|
|
+ | UnmanagedMethods.WindowStyles.WS_SYSMENU
|
|
|
|
|
+ | UnmanagedMethods.WindowStyles.WS_MINIMIZEBOX
|
|
|
|
|
+ | UnmanagedMethods.WindowStyles.WS_MAXIMIZEBOX;
|
|
|
|
|
+
|
|
|
|
|
+ style |= systemDecorationStyles;
|
|
|
|
|
|
|
|
if (!value)
|
|
if (!value)
|
|
|
{
|
|
{
|
|
|
- style ^= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW;
|
|
|
|
|
|
|
+ style ^= systemDecorationStyles;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
UnmanagedMethods.RECT windowRect;
|
|
UnmanagedMethods.RECT windowRect;
|
|
@@ -251,7 +267,7 @@ namespace Avalonia.Win32
|
|
|
Rect newRect;
|
|
Rect newRect;
|
|
|
var oldThickness = BorderThickness;
|
|
var oldThickness = BorderThickness;
|
|
|
|
|
|
|
|
- UnmanagedMethods.SetWindowLong(_hwnd, -16, (uint)style);
|
|
|
|
|
|
|
+ UnmanagedMethods.SetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE, (uint)style);
|
|
|
|
|
|
|
|
if (value)
|
|
if (value)
|
|
|
{
|
|
{
|
|
@@ -383,8 +399,11 @@ namespace Avalonia.Win32
|
|
|
|
|
|
|
|
public void SetCursor(IPlatformHandle cursor)
|
|
public void SetCursor(IPlatformHandle cursor)
|
|
|
{
|
|
{
|
|
|
- UnmanagedMethods.SetClassLong(_hwnd, UnmanagedMethods.ClassLongIndex.GCL_HCURSOR,
|
|
|
|
|
- cursor?.Handle ?? DefaultCursor);
|
|
|
|
|
|
|
+ var hCursor = cursor?.Handle ?? DefaultCursor;
|
|
|
|
|
+ UnmanagedMethods.SetClassLong(_hwnd, UnmanagedMethods.ClassLongIndex.GCL_HCURSOR, hCursor);
|
|
|
|
|
+
|
|
|
|
|
+ if (_owner.IsPointerOver)
|
|
|
|
|
+ UnmanagedMethods.SetCursor(hCursor);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
protected virtual IntPtr CreateWindowOverride(ushort atom)
|
|
protected virtual IntPtr CreateWindowOverride(ushort atom)
|
|
@@ -611,7 +630,26 @@ namespace Avalonia.Win32
|
|
|
case UnmanagedMethods.WindowsMessage.WM_MOVE:
|
|
case UnmanagedMethods.WindowsMessage.WM_MOVE:
|
|
|
PositionChanged?.Invoke(new Point((short)(ToInt32(lParam) & 0xffff), (short)(ToInt32(lParam) >> 16)));
|
|
PositionChanged?.Invoke(new Point((short)(ToInt32(lParam) & 0xffff), (short)(ToInt32(lParam) >> 16)));
|
|
|
return IntPtr.Zero;
|
|
return IntPtr.Zero;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ case UnmanagedMethods.WindowsMessage.WM_GETMINMAXINFO:
|
|
|
|
|
+
|
|
|
|
|
+ MINMAXINFO mmi = Marshal.PtrToStructure<UnmanagedMethods.MINMAXINFO>(lParam);
|
|
|
|
|
+
|
|
|
|
|
+ if (_minSize.Width > 0)
|
|
|
|
|
+ mmi.ptMinTrackSize.X = (int)((_minSize.Width * Scaling) + BorderThickness.Left + BorderThickness.Right);
|
|
|
|
|
+
|
|
|
|
|
+ if (_minSize.Height > 0)
|
|
|
|
|
+ mmi.ptMinTrackSize.Y = (int)((_minSize.Height * Scaling) + BorderThickness.Top + BorderThickness.Bottom);
|
|
|
|
|
+
|
|
|
|
|
+ if (!Double.IsInfinity(_maxSize.Width) && _maxSize.Width > 0)
|
|
|
|
|
+ mmi.ptMaxTrackSize.X = (int)((_maxSize.Width * Scaling) + BorderThickness.Left + BorderThickness.Right);
|
|
|
|
|
+
|
|
|
|
|
+ if (!Double.IsInfinity(_maxSize.Height) && _maxSize.Height > 0)
|
|
|
|
|
+ mmi.ptMaxTrackSize.Y = (int)((_maxSize.Height * Scaling) + BorderThickness.Top + BorderThickness.Bottom);
|
|
|
|
|
+
|
|
|
|
|
+ Marshal.StructureToPtr(mmi, lParam, true);
|
|
|
|
|
+ return IntPtr.Zero;
|
|
|
|
|
+
|
|
|
case UnmanagedMethods.WindowsMessage.WM_DISPLAYCHANGE:
|
|
case UnmanagedMethods.WindowsMessage.WM_DISPLAYCHANGE:
|
|
|
(Screen as ScreenImpl)?.InvalidateScreensCache();
|
|
(Screen as ScreenImpl)?.InvalidateScreensCache();
|
|
|
return IntPtr.Zero;
|
|
return IntPtr.Zero;
|
|
@@ -798,11 +836,11 @@ namespace Avalonia.Win32
|
|
|
|
|
|
|
|
public void ShowTaskbarIcon(bool value)
|
|
public void ShowTaskbarIcon(bool value)
|
|
|
{
|
|
{
|
|
|
- var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, -20);
|
|
|
|
|
-
|
|
|
|
|
- style &= ~(UnmanagedMethods.WindowStyles.WS_VISIBLE);
|
|
|
|
|
|
|
+ var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_EXSTYLE);
|
|
|
|
|
|
|
|
- style |= UnmanagedMethods.WindowStyles.WS_EX_TOOLWINDOW;
|
|
|
|
|
|
|
+ style &= ~(UnmanagedMethods.WindowStyles.WS_VISIBLE);
|
|
|
|
|
+
|
|
|
|
|
+ style |= UnmanagedMethods.WindowStyles.WS_EX_TOOLWINDOW;
|
|
|
if (value)
|
|
if (value)
|
|
|
style |= UnmanagedMethods.WindowStyles.WS_EX_APPWINDOW;
|
|
style |= UnmanagedMethods.WindowStyles.WS_EX_APPWINDOW;
|
|
|
else
|
|
else
|
|
@@ -813,9 +851,27 @@ namespace Avalonia.Win32
|
|
|
{
|
|
{
|
|
|
//Toggle to make the styles stick
|
|
//Toggle to make the styles stick
|
|
|
UnmanagedMethods.ShowWindow(_hwnd, ShowWindowCommand.Hide);
|
|
UnmanagedMethods.ShowWindow(_hwnd, ShowWindowCommand.Hide);
|
|
|
- UnmanagedMethods.SetWindowLong(_hwnd, -20, (uint)style);
|
|
|
|
|
|
|
+ UnmanagedMethods.SetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_EXSTYLE, (uint)style);
|
|
|
UnmanagedMethods.ShowWindow(_hwnd, windowPlacement.ShowCmd);
|
|
UnmanagedMethods.ShowWindow(_hwnd, windowPlacement.ShowCmd);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ public void CanResize(bool value)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (value == _resizable)
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE);
|
|
|
|
|
+
|
|
|
|
|
+ if (value)
|
|
|
|
|
+ style |= UnmanagedMethods.WindowStyles.WS_SIZEFRAME;
|
|
|
|
|
+ else
|
|
|
|
|
+ style &= ~(UnmanagedMethods.WindowStyles.WS_SIZEFRAME);
|
|
|
|
|
+
|
|
|
|
|
+ UnmanagedMethods.SetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE, (uint)style);
|
|
|
|
|
+ _resizable = value;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|