|
|
@@ -15,6 +15,7 @@ using Avalonia.Input.Raw;
|
|
|
using Avalonia.Platform;
|
|
|
using Avalonia.Win32.Input;
|
|
|
using Avalonia.Win32.Interop;
|
|
|
+using static Avalonia.Win32.Interop.UnmanagedMethods;
|
|
|
|
|
|
namespace Avalonia.Win32
|
|
|
{
|
|
|
@@ -135,7 +136,7 @@ namespace Avalonia.Win32
|
|
|
{
|
|
|
var placement = default(UnmanagedMethods.WINDOWPLACEMENT);
|
|
|
UnmanagedMethods.GetWindowPlacement(_hwnd, ref placement);
|
|
|
-
|
|
|
+
|
|
|
switch (placement.ShowCmd)
|
|
|
{
|
|
|
case UnmanagedMethods.ShowWindowCommand.Maximize:
|
|
|
@@ -184,22 +185,32 @@ namespace Avalonia.Win32
|
|
|
public void SetSystemDecorations(bool value)
|
|
|
{
|
|
|
if (value == _decorated)
|
|
|
+ {
|
|
|
return;
|
|
|
- var style = (UnmanagedMethods.WindowStyles) UnmanagedMethods.GetWindowLong(_hwnd, -16);
|
|
|
+ }
|
|
|
+
|
|
|
+ var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, -16);
|
|
|
+
|
|
|
style |= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW;
|
|
|
+
|
|
|
if (!value)
|
|
|
+ {
|
|
|
style ^= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW;
|
|
|
+ }
|
|
|
|
|
|
UnmanagedMethods.RECT windowRect;
|
|
|
|
|
|
UnmanagedMethods.GetWindowRect(_hwnd, out windowRect);
|
|
|
+
|
|
|
Rect newRect;
|
|
|
var oldThickness = BorderThickness;
|
|
|
|
|
|
- UnmanagedMethods.SetWindowLong(_hwnd, -16, (uint) style);
|
|
|
+ UnmanagedMethods.SetWindowLong(_hwnd, -16, (uint)style);
|
|
|
+
|
|
|
if (value)
|
|
|
{
|
|
|
var thickness = BorderThickness;
|
|
|
+
|
|
|
newRect = new Rect(
|
|
|
windowRect.left - thickness.Left,
|
|
|
windowRect.top - thickness.Top,
|
|
|
@@ -207,19 +218,20 @@ namespace Avalonia.Win32
|
|
|
(windowRect.bottom - windowRect.top) + (thickness.Top + thickness.Bottom));
|
|
|
}
|
|
|
else
|
|
|
+ {
|
|
|
newRect = new Rect(
|
|
|
- windowRect.left + oldThickness.Left,
|
|
|
- windowRect.top + oldThickness.Top,
|
|
|
- (windowRect.right - windowRect.left) - (oldThickness.Left + oldThickness.Right),
|
|
|
- (windowRect.bottom - windowRect.top) - (oldThickness.Top + oldThickness.Bottom));
|
|
|
- UnmanagedMethods.SetWindowPos(_hwnd, IntPtr.Zero, (int) newRect.X, (int) newRect.Y, (int) newRect.Width,
|
|
|
- (int) newRect.Height,
|
|
|
+ windowRect.left + oldThickness.Left,
|
|
|
+ windowRect.top + oldThickness.Top,
|
|
|
+ (windowRect.right - windowRect.left) - (oldThickness.Left + oldThickness.Right),
|
|
|
+ (windowRect.bottom - windowRect.top) - (oldThickness.Top + oldThickness.Bottom));
|
|
|
+ }
|
|
|
+
|
|
|
+ UnmanagedMethods.SetWindowPos(_hwnd, IntPtr.Zero, (int)newRect.X, (int)newRect.Y, (int)newRect.Width,
|
|
|
+ (int)newRect.Height,
|
|
|
UnmanagedMethods.SetWindowPosFlags.SWP_NOZORDER | UnmanagedMethods.SetWindowPosFlags.SWP_NOACTIVATE);
|
|
|
|
|
|
|
|
|
_decorated = value;
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
public void Invalidate(Rect rect)
|
|
|
@@ -268,7 +280,7 @@ namespace Avalonia.Win32
|
|
|
|
|
|
public void BeginMoveDrag()
|
|
|
{
|
|
|
- UnmanagedMethods.DefWindowProc(_hwnd, (int) UnmanagedMethods.WindowsMessage.WM_NCLBUTTONDOWN,
|
|
|
+ UnmanagedMethods.DefWindowProc(_hwnd, (int)UnmanagedMethods.WindowsMessage.WM_NCLBUTTONDOWN,
|
|
|
new IntPtr((int)UnmanagedMethods.HitTestValues.HTCAPTION), IntPtr.Zero);
|
|
|
}
|
|
|
|
|
|
@@ -286,8 +298,8 @@ namespace Avalonia.Win32
|
|
|
|
|
|
public void BeginResizeDrag(WindowEdge edge)
|
|
|
{
|
|
|
- UnmanagedMethods.DefWindowProc(_hwnd, (int) UnmanagedMethods.WindowsMessage.WM_NCLBUTTONDOWN,
|
|
|
- new IntPtr((int) EdgeDic[edge]), IntPtr.Zero);
|
|
|
+ UnmanagedMethods.DefWindowProc(_hwnd, (int)UnmanagedMethods.WindowsMessage.WM_NCLBUTTONDOWN,
|
|
|
+ new IntPtr((int)EdgeDic[edge]), IntPtr.Zero);
|
|
|
}
|
|
|
|
|
|
public Point Position
|
|
|
@@ -303,8 +315,8 @@ namespace Avalonia.Win32
|
|
|
UnmanagedMethods.SetWindowPos(
|
|
|
Handle.Handle,
|
|
|
IntPtr.Zero,
|
|
|
- (int) value.X,
|
|
|
- (int) value.Y,
|
|
|
+ (int)value.X,
|
|
|
+ (int)value.Y,
|
|
|
0,
|
|
|
0,
|
|
|
UnmanagedMethods.SetWindowPosFlags.SWP_NOSIZE | UnmanagedMethods.SetWindowPosFlags.SWP_NOACTIVATE);
|
|
|
@@ -454,7 +466,7 @@ namespace Avalonia.Win32
|
|
|
: RawMouseEventType.MiddleButtonDown,
|
|
|
DipFromLParam(lParam), GetMouseModifiers(wParam));
|
|
|
break;
|
|
|
-
|
|
|
+
|
|
|
case UnmanagedMethods.WindowsMessage.WM_LBUTTONUP:
|
|
|
case UnmanagedMethods.WindowsMessage.WM_RBUTTONUP:
|
|
|
case UnmanagedMethods.WindowsMessage.WM_MBUTTONUP:
|
|
|
@@ -462,9 +474,9 @@ namespace Avalonia.Win32
|
|
|
WindowsMouseDevice.Instance,
|
|
|
timestamp,
|
|
|
_owner,
|
|
|
- msg == (int) UnmanagedMethods.WindowsMessage.WM_LBUTTONUP
|
|
|
+ msg == (int)UnmanagedMethods.WindowsMessage.WM_LBUTTONUP
|
|
|
? RawMouseEventType.LeftButtonUp
|
|
|
- : msg == (int) UnmanagedMethods.WindowsMessage.WM_RBUTTONUP
|
|
|
+ : msg == (int)UnmanagedMethods.WindowsMessage.WM_RBUTTONUP
|
|
|
? RawMouseEventType.RightButtonUp
|
|
|
: RawMouseEventType.MiddleButtonUp,
|
|
|
DipFromLParam(lParam), GetMouseModifiers(wParam));
|
|
|
@@ -508,7 +520,7 @@ namespace Avalonia.Win32
|
|
|
timestamp,
|
|
|
_owner,
|
|
|
ScreenToClient(DipFromLParam(lParam)),
|
|
|
- new Vector(-(ToInt32(wParam) >> 16) / wheelDelta,0), GetMouseModifiers(wParam));
|
|
|
+ new Vector(-(ToInt32(wParam) >> 16) / wheelDelta, 0), GetMouseModifiers(wParam));
|
|
|
break;
|
|
|
|
|
|
case UnmanagedMethods.WindowsMessage.WM_MOUSELEAVE:
|
|
|
@@ -585,9 +597,9 @@ namespace Avalonia.Win32
|
|
|
var modifiers = WindowsKeyboardDevice.Instance.Modifiers;
|
|
|
if (keys.HasFlag(UnmanagedMethods.ModifierKeys.MK_LBUTTON))
|
|
|
modifiers |= InputModifiers.LeftMouseButton;
|
|
|
- if(keys.HasFlag(UnmanagedMethods.ModifierKeys.MK_RBUTTON))
|
|
|
- modifiers |= InputModifiers.RightMouseButton;
|
|
|
- if(keys.HasFlag(UnmanagedMethods.ModifierKeys.MK_MBUTTON))
|
|
|
+ if (keys.HasFlag(UnmanagedMethods.ModifierKeys.MK_RBUTTON))
|
|
|
+ modifiers |= InputModifiers.RightMouseButton;
|
|
|
+ if (keys.HasFlag(UnmanagedMethods.ModifierKeys.MK_MBUTTON))
|
|
|
modifiers |= InputModifiers.MiddleMouseButton;
|
|
|
return modifiers;
|
|
|
}
|
|
|
@@ -666,6 +678,8 @@ namespace Avalonia.Win32
|
|
|
{
|
|
|
UnmanagedMethods.ShowWindowCommand command;
|
|
|
|
|
|
+ bool doShow = true;
|
|
|
+
|
|
|
switch (state)
|
|
|
{
|
|
|
case WindowState.Minimized:
|
|
|
@@ -673,7 +687,31 @@ namespace Avalonia.Win32
|
|
|
break;
|
|
|
case WindowState.Maximized:
|
|
|
command = UnmanagedMethods.ShowWindowCommand.Maximize;
|
|
|
+
|
|
|
+ if (!_decorated)
|
|
|
+ {
|
|
|
+ IntPtr monitor = MonitorFromWindow(_hwnd, MONITOR.MONITOR_DEFAULTTONEAREST);
|
|
|
+
|
|
|
+ if (monitor != IntPtr.Zero)
|
|
|
+ {
|
|
|
+ MONITORINFO monitorInfo = new MONITORINFO();
|
|
|
+
|
|
|
+ if (UnmanagedMethods.GetMonitorInfo(monitor, monitorInfo))
|
|
|
+ {
|
|
|
+ RECT rcMonitorArea = monitorInfo.rcMonitor;
|
|
|
+
|
|
|
+ var x = monitorInfo.rcWork.left;
|
|
|
+ var y = monitorInfo.rcWork.top;
|
|
|
+ var cx = Math.Abs(monitorInfo.rcWork.right - x);
|
|
|
+ var cy = Math.Abs(monitorInfo.rcWork.bottom - y);
|
|
|
+
|
|
|
+ doShow = false;
|
|
|
+ UnmanagedMethods.SetWindowPos(_hwnd, new IntPtr(-2), x, y, cx, cy, SetWindowPosFlags.SWP_SHOWWINDOW);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
break;
|
|
|
+
|
|
|
case WindowState.Normal:
|
|
|
command = UnmanagedMethods.ShowWindowCommand.Restore;
|
|
|
break;
|
|
|
@@ -681,7 +719,11 @@ namespace Avalonia.Win32
|
|
|
throw new ArgumentException("Invalid WindowState.");
|
|
|
}
|
|
|
|
|
|
- UnmanagedMethods.ShowWindow(_hwnd, command);
|
|
|
+ if (doShow)
|
|
|
+ {
|
|
|
+ UnmanagedMethods.ShowWindow(_hwnd, command);
|
|
|
+ }
|
|
|
+
|
|
|
UnmanagedMethods.SetFocus(_hwnd);
|
|
|
}
|
|
|
|