Menu popup position fix;

move minmaxsize logic from behavior to avoid use behavior in MarkupExtensionProperties;
WindowHeaderBrush improve for DevLab colors
This commit is contained in:
2019-04-21 00:24:08 +03:00
parent 4abae309d5
commit 77b83a61d8
9 changed files with 125 additions and 88 deletions

View File

@@ -0,0 +1,78 @@
using BrightSharp.Interop;
using BrightSharp.Interop.Constants;
using BrightSharp.Interop.Structures;
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
namespace BrightSharp.Behaviors
{
internal class MinMaxSize_Logic
{
private HwndSource hwndSource;
private Window associatedObject;
public MinMaxSize_Logic(Window associatedObject)
{
this.associatedObject = associatedObject;
}
public void OnAttached()
{
this.associatedObject.SourceInitialized += AssociatedObject_SourceInitialized;
}
private void AssociatedObject_SourceInitialized(object sender, EventArgs e)
{
IntPtr handle = new WindowInteropHelper(this.associatedObject).Handle;
hwndSource = HwndSource.FromHwnd(handle);
hwndSource.AddHook(WindowProc);
}
public void OnDetaching()
{
this.associatedObject.SourceInitialized -= AssociatedObject_SourceInitialized;
if (hwndSource != null)
{
hwndSource.RemoveHook(WindowProc);
hwndSource.Dispose();
}
}
private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case 0x0024:
WmGetMinMaxInfo(hwnd, lParam);
handled = true;
break;
}
return (IntPtr)0;
}
private void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
var mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
// Adjust the maximized size and position to fit the work area of the correct monitor
IntPtr monitor = NativeMethods.MonitorFromWindow(hwnd, (int)MonitorFromWindowFlags.MONITOR_DEFAULTTONEAREST);
if (monitor != IntPtr.Zero)
{
var monitorInfo = new MONITORINFO();
NativeMethods.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);
mmi.ptMinTrackSize.x = (int)associatedObject.MinWidth;
mmi.ptMinTrackSize.y = (int)associatedObject.MinHeight;
}
Marshal.StructureToPtr(mmi, lParam, true);
}
}
}