From 849b1d22bab264c2499b9fa46544b6b55567c8af Mon Sep 17 00:00:00 2001 From: aeoth Date: Sat, 29 Jan 2011 15:54:53 +1100 Subject: [PATCH] Added JMorril's BorderlessWindowBehaviour Added said behaviour to the demo app, as well as merging all the styles. --- Lib/System.Windows.Interactivity.dll | Bin 0 -> 39936 bytes .../Behaviours/BorderlessWindowBehavior.cs | 305 ++++++++++++++++++ MahApps.Metro/MahApps.Metro.csproj | 8 +- MahApps.Metro/Merged.xaml | 8 - MahApps.Metro/Styles/Colours.xaml | 4 +- MetroDemo/App.xaml | 13 +- MetroDemo/MainWindow.xaml | 10 +- MetroDemo/MainWindow.xaml.cs | 25 +- MetroDemo/MetroDemo.csproj | 7 + 9 files changed, 345 insertions(+), 35 deletions(-) create mode 100644 Lib/System.Windows.Interactivity.dll create mode 100644 MahApps.Metro/Behaviours/BorderlessWindowBehavior.cs delete mode 100644 MahApps.Metro/Merged.xaml diff --git a/Lib/System.Windows.Interactivity.dll b/Lib/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..7497ef33188099c5ee484730ce198d46e2677b54 GIT binary patch literal 39936 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 literal 0 HcmV?d00001 diff --git a/MahApps.Metro/Behaviours/BorderlessWindowBehavior.cs b/MahApps.Metro/Behaviours/BorderlessWindowBehavior.cs new file mode 100644 index 0000000000..3390d1f82b --- /dev/null +++ b/MahApps.Metro/Behaviours/BorderlessWindowBehavior.cs @@ -0,0 +1,305 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interactivity; +using System.Windows.Interop; + +namespace MahApps.Metro.Behaviours +{ + + /// + /// http://gallery.expression.microsoft.com/ZuneWindowBehavior/ + /// Published: 10/18/2010 + /// Created by: jmorrill + /// Supporting Url: http://jmorrill.hjtcentral.com + /// Tags: Behavior, WPF, Zune + /// License Information: + /// This contribution is licensed to you under Creative Commons by its owner, not Microsoft. Microsoft does not guarantee the contribution or purport to grant rights to it. + /// + /// + public class BorderlessWindowBehavior : Behavior + { + #region NativeStuffs + [StructLayout(LayoutKind.Sequential)] + public struct MARGINS + { + public int leftWidth; + public int rightWidth; + public int topHeight; + public int bottomHeight; + } + + [DllImport("dwmapi.dll")] + private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset); + + /// + /// POINT aka POINTAPI + /// + [StructLayout(LayoutKind.Sequential)] + public struct POINT + { + /// + /// x coordinate of point. + /// + public int x; + /// + /// y coordinate of point. + /// + public int y; + + /// + /// Construct a point of coordinates (x,y). + /// + public POINT(int x, int y) + { + this.x = x; + this.y = y; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct MINMAXINFO + { + public POINT ptReserved; + public POINT ptMaxSize; + public POINT ptMaxPosition; + public POINT ptMinTrackSize; + public POINT ptMaxTrackSize; + }; + + /// + /// + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public class MONITORINFO + { + /// + /// + public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); + + /// + /// + public RECT rcMonitor = new RECT(); + + /// + /// + public RECT rcWork = new RECT(); + + /// + /// + public int dwFlags = 0; + } + + + /// Win32 + [StructLayout(LayoutKind.Sequential, Pack = 0)] + public struct RECT + { + /// Win32 + public int left; + /// Win32 + public int top; + /// Win32 + public int right; + /// Win32 + public int bottom; + + /// Win32 + public static readonly RECT Empty = new RECT(); + + /// Win32 + public int Width + { + get { return Math.Abs(right - left); } // Abs needed for BIDI OS + } + /// Win32 + public int Height + { + get { return bottom - top; } + } + + /// Win32 + public RECT(int left, int top, int right, int bottom) + { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + + /// Win32 + public RECT(RECT rcSrc) + { + this.left = rcSrc.left; + this.top = rcSrc.top; + this.right = rcSrc.right; + this.bottom = rcSrc.bottom; + } + + /// Win32 + public bool IsEmpty + { + get + { + // BUGBUG : On Bidi OS (hebrew arabic) left > right + return left >= right || top >= bottom; + } + } + /// Return a user friendly representation of this struct + public override string ToString() + { + if (this == RECT.Empty) { return "RECT {Empty}"; } + return "RECT { left : " + left + " / top : " + top + " / right : " + right + " / bottom : " + bottom + " }"; + } + + /// Determine if 2 RECT are equal (deep compare) + public override bool Equals(object obj) + { + if (!(obj is Rect)) { return false; } + return (this == (RECT)obj); + } + + /// Return the HashCode for this struct (not garanteed to be unique) + public override int GetHashCode() + { + return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode(); + } + + + /// Determine if 2 RECT are equal (deep compare) + public static bool operator ==(RECT rect1, RECT rect2) + { + return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom); + } + + /// Determine if 2 RECT are different(deep compare) + public static bool operator !=(RECT rect1, RECT rect2) + { + return !(rect1 == rect2); + } + + + } + + [DllImport("user32")] + internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); + + /// + /// + /// + [DllImport("User32")] + internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); + + private static void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) + { + + MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); + + // Adjust the maximized size and position to fit the work area of the correct monitor + int MONITOR_DEFAULTTONEAREST = 0x00000002; + System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + + if (monitor != System.IntPtr.Zero) + { + + MONITORINFO monitorInfo = new MONITORINFO(); + GetMonitorInfo(monitor, monitorInfo); + RECT rcWorkArea = monitorInfo.rcWork; + RECT rcMonitorArea = monitorInfo.rcMonitor; + mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left); + mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top); + mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left); + mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top); + } + + Marshal.StructureToPtr(mmi, lParam, true); + } + + [DllImport("user32.dll")] + public static extern IntPtr DefWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam); + + #endregion + + private const int WM_NCCALCSIZE = 0x83; + private const int WM_NCPAINT = 0x85; + private const int WM_NCACTIVATE = 0x86; + private const int WM_GETMINMAXINFO = 0x24; + + private HwndSource m_hwndSource; + private IntPtr m_hwnd; + + protected override void OnAttached() + { + if (AssociatedObject.IsInitialized) + AddHwndHook(); + else + AssociatedObject.SourceInitialized += AssociatedObject_SourceInitialized; + + AssociatedObject.WindowStyle = WindowStyle.None; + AssociatedObject.ResizeMode = ResizeMode.CanResizeWithGrip; + base.OnAttached(); + } + + protected override void OnDetaching() + { + RemoveHwndHook(); + base.OnDetaching(); + } + + private void AddHwndHook() + { + m_hwndSource = HwndSource.FromVisual(AssociatedObject) as HwndSource; + m_hwndSource.AddHook(HwndHook); + m_hwnd = new WindowInteropHelper(AssociatedObject).Handle; + } + + private void RemoveHwndHook() + { + AssociatedObject.SourceInitialized -= AssociatedObject_SourceInitialized; + m_hwndSource.RemoveHook(HwndHook); + } + + private void AssociatedObject_SourceInitialized(object sender, EventArgs e) + { + AddHwndHook(); + } + + private IntPtr HwndHook(IntPtr hWnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled) + { + IntPtr returnval = IntPtr.Zero; + switch (message) + { + case WM_NCCALCSIZE: + /* Hides the border */ + handled = true; + break; + case WM_NCPAINT: + { + if (Environment.OSVersion.Version.Major >= 6) + { + var m = new MARGINS { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; + DwmExtendFrameIntoClientArea(m_hwnd, ref m); + } + handled = true; + } + break; + case WM_NCACTIVATE: + { + /* As per http://msdn.microsoft.com/en-us/library/ms632633(VS.85).aspx , "-1" lParam + * "does not repaint the nonclient area to reflect the state change." */ + returnval = DefWindowProc(hWnd, message, wParam, new IntPtr(-1)); + handled = true; + } + break; + case WM_GETMINMAXINFO: + /* From Lester's Blog (thanks @aeoth): + * http://blogs.msdn.com/b/llobo/archive/2006/08/01/maximizing-window-_2800_with-windowstyle_3d00_none_2900_-considering-taskbar.aspx */ + WmGetMinMaxInfo(hWnd, lParam); + handled = true; + break; + } + + return returnval; + } + } +} diff --git a/MahApps.Metro/MahApps.Metro.csproj b/MahApps.Metro/MahApps.Metro.csproj index f9d51dfb08..ff98d6a569 100644 --- a/MahApps.Metro/MahApps.Metro.csproj +++ b/MahApps.Metro/MahApps.Metro.csproj @@ -36,6 +36,9 @@ + + ..\Lib\System.Windows.Interactivity.dll + @@ -49,6 +52,7 @@ + Code @@ -73,10 +77,6 @@ - - Designer - MSBuild:Compile - Designer MSBuild:Compile diff --git a/MahApps.Metro/Merged.xaml b/MahApps.Metro/Merged.xaml deleted file mode 100644 index 1d6effd0df..0000000000 --- a/MahApps.Metro/Merged.xaml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/MahApps.Metro/Styles/Colours.xaml b/MahApps.Metro/Styles/Colours.xaml index aa65b5b5fc..f01f49092d 100644 --- a/MahApps.Metro/Styles/Colours.xaml +++ b/MahApps.Metro/Styles/Colours.xaml @@ -190,8 +190,8 @@ - - + + diff --git a/MetroDemo/App.xaml b/MetroDemo/App.xaml index 8a829a7e79..fc2250b553 100644 --- a/MetroDemo/App.xaml +++ b/MetroDemo/App.xaml @@ -3,6 +3,17 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> - + + + + + + + + + + + diff --git a/MetroDemo/MainWindow.xaml b/MetroDemo/MainWindow.xaml index 551f1cd589..161b553e24 100644 --- a/MetroDemo/MainWindow.xaml +++ b/MetroDemo/MainWindow.xaml @@ -1,8 +1,12 @@  + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:behaviours="clr-namespace:MahApps.Metro.Behaviours;assembly=MahApps.Metro" Title="MainWindow" Height="350" Width="525" + MouseDown="WindowMouseDown"> + + + + - +