Browse Source

Merge pull request #3221 from mstr2/undecorated-window

Added window animations for undecorated Win32 window
pull/3232/head
Benedikt Stebner 6 years ago
committed by GitHub
parent
commit
a3712ed4c2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
  2. 23
      src/Windows/Avalonia.Win32/WindowImpl.cs

3
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

@ -921,6 +921,9 @@ namespace Avalonia.Win32.Interop
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "SetWindowTextW")]
public static extern bool SetWindowText(IntPtr hwnd, string lpString);
[DllImport("uxtheme.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern HRESULT SetWindowTheme(IntPtr hwnd, string subAppName, string subIdList);
public enum ClassLongIndex : int
{

23
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -968,26 +968,20 @@ namespace Avalonia.Win32
{
var oldDecorated = _decorated;
var oldThickness = BorderThickness;
change();
var style = (WindowStyles)GetWindowLong(_hwnd, (int)WindowLongParam.GWL_STYLE);
const WindowStyles controlledFlags = WindowStyles.WS_OVERLAPPEDWINDOW;
style = style | controlledFlags ^ controlledFlags;
style |= WindowStyles.WS_OVERLAPPEDWINDOW;
if (!_decorated)
{
style ^= (WindowStyles.WS_CAPTION | WindowStyles.WS_SYSMENU);
style &= ~WindowStyles.WS_SYSMENU;
}
if (!_resizable)
{
style ^= (WindowStyles.WS_SIZEFRAME);
style &= ~WindowStyles.WS_SIZEFRAME;
}
GetClientRect(_hwnd, out var oldClientRect);
@ -995,7 +989,6 @@ namespace Avalonia.Win32
ClientToScreen(_hwnd, ref oldClientRectOrigin);
oldClientRect.Offset(oldClientRectOrigin);
SetWindowLong(_hwnd, (int)WindowLongParam.GWL_STYLE, (uint)style);
UnmanagedMethods.GetWindowRect(_hwnd, out var windowRect);
@ -1004,8 +997,16 @@ namespace Avalonia.Win32
{
var newRect = oldClientRect;
if (_decorated)
AdjustWindowRectEx(ref newRect, (uint)style, false,
GetWindowLong(_hwnd, (int)WindowLongParam.GWL_EXSTYLE));
{
SetWindowTheme(_hwnd, null, null);
AdjustWindowRectEx(
ref newRect, (uint)style, false, GetWindowLong(_hwnd, (int)WindowLongParam.GWL_EXSTYLE));
}
else
{
SetWindowTheme(_hwnd, "", "");
}
SetWindowPos(_hwnd, IntPtr.Zero, newRect.left, newRect.top, newRect.Width, newRect.Height,
SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOACTIVATE | SetWindowPosFlags.SWP_FRAMECHANGED);
frameUpdated = true;

Loading…
Cancel
Save