Browse Source

enable drop shadow on win32 popups.

pull/2156/head
Dan Walmsley 8 years ago
parent
commit
076b811f2a
  1. 27
      src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
  2. 10
      src/Windows/Avalonia.Win32/PopupImpl.cs
  3. 2
      src/Windows/Avalonia.Win32/WindowImpl.cs

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

@ -909,8 +909,17 @@ namespace Avalonia.Win32.Interop
public enum ClassLongIndex : int public enum ClassLongIndex : int
{ {
GCL_HCURSOR = -12, GCLP_MENUNAME = -8,
GCL_HICON = -14 GCLP_HBRBACKGROUND = -10,
GCLP_HCURSOR = -12,
GCLP_HICON = -14,
GCLP_HMODULE = -16,
GCL_CBWNDEXTRA = -18,
GCL_CBCLSEXTRA = -20,
GCLP_WNDPROC = -24,
GCL_STYLE = -26,
GCLP_HICONSM = -34,
GCW_ATOM = -32
} }
[DllImport("user32.dll", EntryPoint = "SetClassLongPtr")] [DllImport("user32.dll", EntryPoint = "SetClassLongPtr")]
@ -929,6 +938,20 @@ namespace Avalonia.Win32.Interop
return SetClassLong64(hWnd, nIndex, dwNewLong); return SetClassLong64(hWnd, nIndex, dwNewLong);
} }
public static IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex)
{
if (IntPtr.Size > 4)
return GetClassLongPtr64(hWnd, nIndex);
else
return new IntPtr(GetClassLongPtr32(hWnd, nIndex));
}
[DllImport("user32.dll", EntryPoint = "GetClassLong")]
public static extern uint GetClassLongPtr32(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "GetClassLongPtr")]
public static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "SetCursor")] [DllImport("user32.dll", EntryPoint = "SetCursor")]
internal static extern IntPtr SetCursor(IntPtr hCursor); internal static extern IntPtr SetCursor(IntPtr hCursor);

10
src/Windows/Avalonia.Win32/PopupImpl.cs

@ -24,7 +24,7 @@ namespace Avalonia.Win32
UnmanagedMethods.WindowStyles.WS_EX_TOOLWINDOW | UnmanagedMethods.WindowStyles.WS_EX_TOOLWINDOW |
UnmanagedMethods.WindowStyles.WS_EX_TOPMOST; UnmanagedMethods.WindowStyles.WS_EX_TOPMOST;
return UnmanagedMethods.CreateWindowEx( var result = UnmanagedMethods.CreateWindowEx(
(int)exStyle, (int)exStyle,
atom, atom,
null, null,
@ -37,6 +37,14 @@ namespace Avalonia.Win32
IntPtr.Zero, IntPtr.Zero,
IntPtr.Zero, IntPtr.Zero,
IntPtr.Zero); IntPtr.Zero);
var classes = (int)UnmanagedMethods.GetClassLongPtr(result, (int)UnmanagedMethods.ClassLongIndex.GCL_STYLE);
classes |= (int)UnmanagedMethods.ClassStyles.CS_DROPSHADOW;
UnmanagedMethods.SetClassLong(result, UnmanagedMethods.ClassLongIndex.GCL_STYLE, new IntPtr(classes));
return result;
} }
protected override IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) protected override IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)

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

@ -384,7 +384,7 @@ namespace Avalonia.Win32
public void SetCursor(IPlatformHandle cursor) public void SetCursor(IPlatformHandle cursor)
{ {
var hCursor = cursor?.Handle ?? DefaultCursor; var hCursor = cursor?.Handle ?? DefaultCursor;
UnmanagedMethods.SetClassLong(_hwnd, UnmanagedMethods.ClassLongIndex.GCL_HCURSOR, hCursor); UnmanagedMethods.SetClassLong(_hwnd, UnmanagedMethods.ClassLongIndex.GCLP_HCURSOR, hCursor);
if (_owner.IsPointerOver) if (_owner.IsPointerOver)
UnmanagedMethods.SetCursor(hCursor); UnmanagedMethods.SetCursor(hCursor);

Loading…
Cancel
Save