diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 648a3c6a34..3b2b99fb0c 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -1467,6 +1467,16 @@ namespace Avalonia.Win32.Interop [DllImport("dwmapi.dll")] public static extern void DwmEnableBlurBehindWindow(IntPtr hwnd, ref DWM_BLURBEHIND blurBehind); + + [Flags] + public enum LayeredWindowFlags + { + LWA_ALPHA = 0x00000002, + LWA_COLORKEY = 0x00000001, + } + + [DllImport("user32.dll")] + public static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, LayeredWindowFlags dwFlags); [Flags] public enum DWM_BB diff --git a/src/Windows/Avalonia.Win32/Win32NativeControlHost.cs b/src/Windows/Avalonia.Win32/Win32NativeControlHost.cs index 8f62163d81..2a1628ea7d 100644 --- a/src/Windows/Avalonia.Win32/Win32NativeControlHost.cs +++ b/src/Windows/Avalonia.Win32/Win32NativeControlHost.cs @@ -9,10 +9,12 @@ namespace Avalonia.Win32 { class Win32NativeControlHost : INativeControlHostImpl { + private readonly bool _useLayeredWindow; public WindowImpl Window { get; } - public Win32NativeControlHost(WindowImpl window) + public Win32NativeControlHost(WindowImpl window, bool useLayeredWindow) { + _useLayeredWindow = useLayeredWindow; Window = window; } @@ -25,12 +27,12 @@ namespace Avalonia.Win32 public INativeControlHostDestroyableControlHandle CreateDefaultChild(IPlatformHandle parent) { AssertCompatible(parent); - return new DumbWindow(parent.Handle); + return new DumbWindow(false, parent.Handle); } public INativeControlHostControlTopLevelAttachment CreateNewAttachment(Func create) { - var holder = new DumbWindow(Window.Handle.Handle); + var holder = new DumbWindow(_useLayeredWindow, Window.Handle.Handle); Win32NativeControlAttachment attachment = null; try { @@ -52,7 +54,7 @@ namespace Avalonia.Win32 public INativeControlHostControlTopLevelAttachment CreateNewAttachment(IPlatformHandle handle) { AssertCompatible(handle); - return new Win32NativeControlAttachment(new DumbWindow(Window.Handle.Handle), + return new Win32NativeControlAttachment(new DumbWindow(_useLayeredWindow, Window.Handle.Handle), handle) { AttachedTo = this }; } @@ -67,7 +69,7 @@ namespace Avalonia.Win32 UnmanagedMethods.WndProc _wndProcDelegate; private readonly string _className; - public DumbWindow(IntPtr? parent = null) + public DumbWindow(bool layered = false, IntPtr? parent = null) { _wndProcDelegate = WndProc; var wndClassEx = new UnmanagedMethods.WNDCLASSEX @@ -80,7 +82,7 @@ namespace Avalonia.Win32 var atom = UnmanagedMethods.RegisterClassEx(ref wndClassEx); Handle = UnmanagedMethods.CreateWindowEx( - 0, + layered ? (int)UnmanagedMethods.WindowStyles.WS_EX_LAYERED : 0, atom, null, (int)UnmanagedMethods.WindowStyles.WS_CHILD, @@ -92,6 +94,9 @@ namespace Avalonia.Win32 IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); + if (layered) + UnmanagedMethods.SetLayeredWindowAttributes(Handle, 0, 255, + UnmanagedMethods.LayeredWindowFlags.LWA_ALPHA); } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index b7fc35db72..0a031cd5bf 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -145,7 +145,7 @@ namespace Avalonia.Win32 Screen = new ScreenImpl(); - _nativeControlHost = new Win32NativeControlHost(this); + _nativeControlHost = new Win32NativeControlHost(this, _isUsingComposition); s_instances.Add(this); }