/// <summary> /// Get the min/max window size for this window /// Correctly accounting for the taskbar size and position /// </summary> /// <param name="hwnd"></param> /// <param name="lParam"></param> private void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { // Get the point position to determine what screen we are on GetCursorPos(out POINT lMousePosition); // Now get the current screen var lCurrentScreen = MonitorFromPoint(lMousePosition, MonitorOptions.MONITOR_DEFAULTTONEAREST); // Try and get the current screen information var lCurrentScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lCurrentScreen, lCurrentScreenInfo) == false) { return; } // If this has changed from the last one, update the transform if (lCurrentScreen != mLastScreen || mMonitorDpi == null) { mMonitorDpi = VisualTreeHelper.GetDpi(mWindow); } // Store last know screen mLastScreen = lCurrentScreen; // Get min/max structure to fill with information var lMmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // Size size limits, relative to 0,0 being the current screens top-left corner lMmi.ptMaxPosition.X = lCurrentScreenInfo.rcWork.Left; lMmi.ptMaxPosition.Y = lCurrentScreenInfo.rcWork.Top; lMmi.ptMaxSize.X = lCurrentScreenInfo.rcWork.Right - lCurrentScreenInfo.rcWork.Left; lMmi.ptMaxSize.Y = lCurrentScreenInfo.rcWork.Bottom - lCurrentScreenInfo.rcWork.Top; // Set monitor size CurrentMonitorSize = new Rectangle(lMmi.ptMaxPosition.X, lMmi.ptMaxPosition.Y, lMmi.ptMaxSize.X + lMmi.ptMaxPosition.X, lMmi.ptMaxSize.Y + lMmi.ptMaxPosition.Y); // Set min size var minSize = new Point(mWindow.MinWidth * mMonitorDpi.Value.DpiScaleX, mWindow.MinHeight * mMonitorDpi.Value.DpiScaleX); lMmi.ptMinTrackSize.X = (int)minSize.X; lMmi.ptMinTrackSize.Y = (int)minSize.Y; // Store new size mScreenSize = new Rect(lMmi.ptMaxPosition.X, lMmi.ptMaxPosition.Y, lMmi.ptMaxSize.X, lMmi.ptMaxSize.Y); // Now we have the max size, allow the host to tweak as needed Marshal.StructureToPtr(lMmi, lParam, true); }
/// <summary> /// Get the min/max window size for this window /// Correctly accounting for the task bar size and position /// </summary> /// <param name="hwnd"></param> /// <param name="lParam"></param> private void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { // Get the point position to determine what screen we are on GetCursorPos(out var lMousePosition); // Now get the current screen var lCurrentScreen = mBeingMoved ? // If being dragged get it from the mouse position MonitorFromPoint(lMousePosition, MonitorOptions.MONITOR_DEFAULTTONULL) : // Otherwise get it from the window position (for example being moved via Win + Arrow) // in case the mouse is on another monitor MonitorFromWindow(hwnd, MonitorOptions.MONITOR_DEFAULTTONULL); var lPrimaryScreen = MonitorFromPoint(new POINT(0, 0), MonitorOptions.MONITOR_DEFAULTTOPRIMARY); // Try and get the current screen information var lCurrentScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lCurrentScreen, lCurrentScreenInfo) == false) { return; } // Try and get the primary screen information var lPrimaryScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lPrimaryScreen, lPrimaryScreenInfo) == false) { return; } // NOTE: Always update it // If this has changed from the last one, update the transform //if (lCurrentScreen != mLastScreen || mMonitorDpi == null) mMonitorDpi = VisualTreeHelper.GetDpi(mWindow); // Store last know screen mLastScreen = lCurrentScreen; // Get work area sizes and rations var currentX = lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left; var currentY = lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top; var currentWidth = (lCurrentScreenInfo.RCWork.Right - lCurrentScreenInfo.RCWork.Left); var currentHeight = (lCurrentScreenInfo.RCWork.Bottom - lCurrentScreenInfo.RCWork.Top); var currentRatio = (float)currentWidth / (float)currentHeight; var primaryX = lPrimaryScreenInfo.RCWork.Left - lPrimaryScreenInfo.RCMonitor.Left; var primaryY = lPrimaryScreenInfo.RCWork.Top - lPrimaryScreenInfo.RCMonitor.Top; var primaryWidth = (lPrimaryScreenInfo.RCWork.Right - lPrimaryScreenInfo.RCWork.Left); var primaryHeight = (lPrimaryScreenInfo.RCWork.Bottom - lPrimaryScreenInfo.RCWork.Top); var primaryRatio = (float)primaryWidth / (float)primaryHeight; if (lParam != IntPtr.Zero) { // Get min/max structure to fill with information var lMmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // // NOTE: The below setting of max sizes we no longer do // as through observations, it appears Windows works // correctly only when the max window size is set to // EXACTLY the size of the primary window // // Anything else and the behavior is wrong and the max // window width on a secondary monitor if larger than the // primary then goes too large // // lMmi.PointMaxPosition.X = 0; // lMmi.PointMaxPosition.Y = 0; // lMmi.PointMaxSize.X = lCurrentScreenInfo.RCMonitor.Right - lCurrentScreenInfo.RCMonitor.Left; // lMmi.PointMaxSize.Y = lCurrentScreenInfo.RCMonitor.Bottom - lCurrentScreenInfo.RCMonitor.Top; // // Instead we now just add a margin to the window itself // to compensate when maximized // // // NOTE: rcMonitor is the monitor size // rcWork is the available screen size (so the area inside the task bar start menu for example) // Size limits (used by Windows when maximized) // relative to 0,0 being the current screens top-left corner // Set to primary monitor size lMmi.PointMaxPosition.X = lPrimaryScreenInfo.RCMonitor.Left; lMmi.PointMaxPosition.Y = lPrimaryScreenInfo.RCMonitor.Top; lMmi.PointMaxSize.X = lPrimaryScreenInfo.RCMonitor.Right; lMmi.PointMaxSize.Y = lPrimaryScreenInfo.RCMonitor.Bottom; // Set min size var minSize = new Point(mWindow.MinWidth * mMonitorDpi.Value.DpiScaleX, mWindow.MinHeight * mMonitorDpi.Value.DpiScaleX); lMmi.PointMinTrackSize.X = (int)minSize.X; lMmi.PointMinTrackSize.Y = (int)minSize.Y; // Now we have the max size, allow the host to tweak as needed Marshal.StructureToPtr(lMmi, lParam, true); } // Set monitor size CurrentMonitorSize = new Rectangle(currentX, currentY, currentWidth + currentX, currentHeight + currentY); // Get margin around window CurrentMonitorMargin = new Thickness( (lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left) / mMonitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top) / mMonitorDpi.Value.DpiScaleY, (lCurrentScreenInfo.RCMonitor.Right - lCurrentScreenInfo.RCWork.Right) / mMonitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCMonitor.Bottom - lCurrentScreenInfo.RCWork.Bottom) / mMonitorDpi.Value.DpiScaleY ); // Store new size mScreenSize = new Rect(lCurrentScreenInfo.RCWork.Left, lCurrentScreenInfo.RCWork.Top, currentWidth, currentHeight); }
/// <summary> /// Monitors for size changes and detects if the window has been docked (Aero snap) to an edge /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Window_SizeChanged(object sender, SizeChangedEventArgs e) { // Make sure our monitor info is up-to-date WmGetMinMaxInfo(IntPtr.Zero, IntPtr.Zero); // Get the monitor transform for the current position mMonitorDpi = VisualTreeHelper.GetDpi(mWindow); // Cannot calculate size until we know monitor scale if (mMonitorDpi == null) { return; } // Get window rectangle var top = mWindow.Top; var left = mWindow.Left; var bottom = top + mWindow.Height; var right = left + mWindow.Width; // Get window position/size in device pixels var windowTopLeft = new Point(left * mMonitorDpi.Value.DpiScaleX, top * mMonitorDpi.Value.DpiScaleX); var windowBottomRight = new Point(right * mMonitorDpi.Value.DpiScaleX, bottom * mMonitorDpi.Value.DpiScaleX); // Check for edges docked var edgedTop = windowTopLeft.Y <= (mScreenSize.Top + mEdgeTolerance) && windowTopLeft.Y >= (mScreenSize.Top - mEdgeTolerance); var edgedLeft = windowTopLeft.X <= (mScreenSize.Left + mEdgeTolerance) && windowTopLeft.X >= (mScreenSize.Left - mEdgeTolerance); var edgedBottom = windowBottomRight.Y >= (mScreenSize.Bottom - mEdgeTolerance) && windowBottomRight.Y <= (mScreenSize.Bottom + mEdgeTolerance); var edgedRight = windowBottomRight.X >= (mScreenSize.Right - mEdgeTolerance) && windowBottomRight.X <= (mScreenSize.Right + mEdgeTolerance); // Get docked position var dock = WindowDockPosition.Undocked; // Left docking if (edgedTop && edgedBottom && edgedLeft) { dock = WindowDockPosition.Left; } // Right docking else if (edgedTop && edgedBottom && edgedRight) { dock = WindowDockPosition.Right; } // Top/bottom else if (edgedTop && edgedBottom) { dock = WindowDockPosition.TopBottom; } // Top-left else if (edgedTop && edgedLeft) { dock = WindowDockPosition.TopLeft; } // Top-right else if (edgedTop && edgedRight) { dock = WindowDockPosition.TopRight; } // Bottom-left else if (edgedBottom && edgedLeft) { dock = WindowDockPosition.BottomLeft; } // Bottom-right else if (edgedBottom && edgedRight) { dock = WindowDockPosition.BottomRight; } // None else { dock = WindowDockPosition.Undocked; } // If dock has changed if (dock != mLastDock) { // Inform listeners WindowDockChanged(dock); } // Save last dock position mLastDock = dock; }
/// <summary> /// Get the min/max window size for this window /// Correctly accounting for the taskbar size and position /// </summary> /// <param name="hwnd"></param> /// <param name="lParam"></param> private void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { // Get the point position to determine what screen we are on GetCursorPos(out POINT lMousePosition); // Now get the current screen var lCurrentScreen = MonitorFromPoint(lMousePosition, MonitorOptions.MONITOR_DEFAULTTONEAREST); var lPrimaryScreen = MonitorFromPoint(new POINT(0, 0), MonitorOptions.MONITOR_DEFAULTTOPRIMARY); // Try and get the current screen information var lCurrentScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lCurrentScreen, lCurrentScreenInfo) == false) { return; } // Try and get the primary screen information var lPrimaryScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lPrimaryScreen, lPrimaryScreenInfo) == false) { return; } // If this has changed from the last one, update the transform if (lCurrentScreen != mLastScreen || mMonitorDpi == null) { mMonitorDpi = VisualTreeHelper.GetDpi(mWindow); } // Store last know screen mLastScreen = lCurrentScreen; // Get work area sizes and rations var currentX = lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left; var currentY = lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top; var currentWidth = (lCurrentScreenInfo.RCWork.Right - lCurrentScreenInfo.RCWork.Left); var currentHeight = (lCurrentScreenInfo.RCWork.Bottom - lCurrentScreenInfo.RCWork.Top); var currentRatio = (float)currentWidth / (float)currentHeight; var primaryX = lPrimaryScreenInfo.RCWork.Left - lPrimaryScreenInfo.RCMonitor.Left; var primaryY = lPrimaryScreenInfo.RCWork.Top - lPrimaryScreenInfo.RCMonitor.Top; var primaryWidth = (lPrimaryScreenInfo.RCWork.Right - lPrimaryScreenInfo.RCWork.Left); var primaryHeight = (lPrimaryScreenInfo.RCWork.Bottom - lPrimaryScreenInfo.RCWork.Top); var primaryRatio = (float)primaryWidth / (float)primaryHeight; // Get min/max structure to fill with information var lMmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // NOTE: rcMonitor is the monitor size // rcWork is the available screen size (so the area inside the taskbar start menu for example) // Size size limits (used by Windows when maximized) // relative to 0,0 being the current screens top-left corner // // - Position lMmi.PointMaxPosition.X = currentX; lMmi.PointMaxPosition.Y = currentY; // // - Size lMmi.PointMaxSize.X = currentWidth; lMmi.PointMaxSize.Y = currentHeight; // NOTE: This fixes the bug mentioned below... setting the max size to the size of the current window // which I think is a reasonable limit for the window // // In future we should find a good way to detect the size request coming from a window about to // maximize and limit this constraint to only when maximized. For now this is fine // lMmi.PointMaxTrackSize.X = currentWidth; lMmi.PointMaxTrackSize.Y = currentHeight; // // BUG: // NOTE: I've noticed a bug which I think is Windows itself // If your non-primary monitor has a greater width than your primary // (or possibly due to the screen ratio's being different) // then setting the max X on the monitor to the correct value causes // it to scale wrong. // // The fix seems to be to set the max width only (height is fine) // to that of the primary monitor, not the current monitor // // However, 1 pixel different and the size goes totally wrong again // so the fix doesn't work when the taskbar is on the left or right // // Set monitor size CurrentMonitorSize = new Rectangle(lMmi.PointMaxPosition.X, lMmi.PointMaxPosition.Y, lMmi.PointMaxSize.X + lMmi.PointMaxPosition.X, lMmi.PointMaxSize.Y + lMmi.PointMaxPosition.Y); // Set min size var minSize = new Point(mWindow.MinWidth * mMonitorDpi.Value.DpiScaleX, mWindow.MinHeight * mMonitorDpi.Value.DpiScaleX); lMmi.PointMinTrackSize.X = (int)minSize.X; lMmi.PointMinTrackSize.Y = (int)minSize.Y; // Store new size mScreenSize = new Rect(lCurrentScreenInfo.RCWork.Left, lCurrentScreenInfo.RCWork.Top, lMmi.PointMaxSize.X, lMmi.PointMaxSize.Y); // Now we have the max size, allow the host to tweak as needed Marshal.StructureToPtr(lMmi, lParam, true); }
public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight, DpiScale?dpiScale) { MaxDecodePixelWidth = decodePixelWidth; MaxDecodePixelHeight = decodePixelHeight; DpiScale = dpiScale; }
/// <summary> /// Get the min/max window size for this window /// Correctly accounting for the taskbar size and position /// </summary> /// <param name="hwnd"></param> /// <param name="lParam"></param> private void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { // Get the point position to determine what screen we are on POINT lMousePosition; GetCursorPos(out lMousePosition); // Now get the current screen var lCurrentScreen = _beingMoved ? // If being dragged get it from the mouse position MonitorFromPoint(lMousePosition, MonitorOptions.MONITOR_DEFAULTTONULL) : // Otherwise get it from the window position (for example being moved via Win + Arrow) // in case the mouse is on another monitor MonitorFromWindow(hwnd, MonitorOptions.MONITOR_DEFAULTTONULL); // Try and get the current screen var lCurrentScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lCurrentScreen, lCurrentScreenInfo) == false) { return; } // Get the primary monitor at cursor position 0,0 var lPrimaryScreen = MonitorFromPoint(new POINT(0, 0), MonitorOptions.MONITOR_DEFAULTTOPRIMARY); // Try and get the primary screen information var lPrimaryScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lPrimaryScreen, lPrimaryScreenInfo) == false) { return; } // NOTE: Always update it _monitorDpi = VisualTreeHelper.GetDpi(_window); // Store last know screen _lastScreen = lCurrentScreen; // Get work area sizes and rations var currentX = lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left; var currentY = lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top; var currentWidth = (lCurrentScreenInfo.RCWork.Right - lCurrentScreenInfo.RCWork.Left); var currentHeight = (lCurrentScreenInfo.RCWork.Bottom - lCurrentScreenInfo.RCWork.Top); var currentRatio = (Single)currentWidth / (Single)currentHeight; var primaryX = lPrimaryScreenInfo.RCWork.Left - lPrimaryScreenInfo.RCMonitor.Left; var primaryY = lPrimaryScreenInfo.RCWork.Top - lPrimaryScreenInfo.RCMonitor.Top; var primaryWidth = (lPrimaryScreenInfo.RCWork.Right - lPrimaryScreenInfo.RCWork.Left); var primaryHeight = (lPrimaryScreenInfo.RCWork.Bottom - lPrimaryScreenInfo.RCWork.Top); var primaryRatio = (Single)primaryWidth / (Single)primaryHeight; if (lParam != IntPtr.Zero) { // Get min/max structure to fill with information var lMmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // NOTE: rcMonitor is the monitor size // rcWork is the available screen size (so the area inside the task bar start menu for example) // Size limits (used by Windows when maximized) // relative to 0,0 being the current screens top-left corner // Set to primary monitor size lMmi.PointMaxPosition.X = lPrimaryScreenInfo.RCMonitor.Left; lMmi.PointMaxPosition.Y = lPrimaryScreenInfo.RCMonitor.Top; lMmi.PointMaxSize.X = lPrimaryScreenInfo.RCMonitor.Right; lMmi.PointMaxSize.Y = lPrimaryScreenInfo.RCMonitor.Bottom; // Set min size var minSize = new Point(_window.MinWidth * _monitorDpi.Value.DpiScaleX, _window.MinHeight * _monitorDpi.Value.DpiScaleX); lMmi.PointMinTrackSize.X = (Int32)minSize.X; lMmi.PointMinTrackSize.Y = (Int32)minSize.Y; // Now we have the max size, allow the host to tweak as needed Marshal.StructureToPtr(lMmi, lParam, true); } // Set monitor size CurrentMonitorSize = new Rectangle(currentX, currentY, currentWidth + currentX, currentHeight + currentY); // Get margin around window CurrentMonitorMargin = new Thickness( (lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left) / _monitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top) / _monitorDpi.Value.DpiScaleY, (lCurrentScreenInfo.RCMonitor.Right - lCurrentScreenInfo.RCWork.Right) / _monitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCMonitor.Bottom - lCurrentScreenInfo.RCWork.Bottom) / _monitorDpi.Value.DpiScaleY ); // Store new size CurrentScreenSize = new Rect(lCurrentScreenInfo.RCWork.Left, lCurrentScreenInfo.RCWork.Top, currentWidth, currentHeight); }
private void Window_SizeChanged(object sender, SizeChangedEventArgs e) { WmGetMinMaxInfo(IntPtr.Zero, IntPtr.Zero); _monitorDpi = VisualTreeHelper.GetDpi(_window); if (_monitorDpi == null) { return; } var top = _window.Top; var left = _window.Left; var bottom = top + _window.Height; var right = left + _window.Width; var windowTopLeft = new System.Windows.Point(left * _monitorDpi.Value.DpiScaleX, top * _monitorDpi.Value.DpiScaleX); var windowBottomRight = new System.Windows.Point(right * _monitorDpi.Value.DpiScaleX, bottom * _monitorDpi.Value.DpiScaleX); var edgedTop = windowTopLeft.Y <= (_screenSize.Top + _edgeTolerance) && windowTopLeft.Y >= (_screenSize.Top - _edgeTolerance); var edgedLeft = windowTopLeft.X <= (_screenSize.Left + _edgeTolerance) && windowTopLeft.X >= (_screenSize.Left - _edgeTolerance); var edgedBottom = windowBottomRight.Y >= (_screenSize.Bottom - _edgeTolerance) && windowBottomRight.Y <= (_screenSize.Bottom + _edgeTolerance); var edgedRight = windowBottomRight.X >= (_screenSize.Right - _edgeTolerance) && windowBottomRight.X <= (_screenSize.Right + _edgeTolerance); var dock = WindowDockPosition.Undocked; if (edgedTop && edgedBottom && edgedLeft) { dock = WindowDockPosition.Left; } else if (edgedTop && edgedBottom && edgedRight) { dock = WindowDockPosition.Right; } else if (edgedTop && edgedBottom) { dock = WindowDockPosition.TopBottom; } else if (edgedTop && edgedLeft) { dock = WindowDockPosition.TopLeft; } else if (edgedTop && edgedRight) { dock = WindowDockPosition.TopRight; } else if (edgedBottom && edgedLeft) { dock = WindowDockPosition.BottomLeft; } else if (edgedBottom && edgedRight) { dock = WindowDockPosition.BottomRight; } else { dock = WindowDockPosition.Undocked; } if (dock != _lastDock) { WindowDockChanged(dock); } _lastDock = dock; }
private void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam) { GetCursorPos(out var lMousePosition); var lCurrentScreen = _beingMoved ? MonitorFromPoint(lMousePosition, MonitorOptions.MonitorDefaulttonull) : MonitorFromWindow(hwnd, MonitorOptions.MonitorDefaulttonull); var lPrimaryScreen = MonitorFromPoint(new Point(0, 0), MonitorOptions.MonitorDefaulttoprimary); var lCurrentScreenInfo = new Monitorinfo(); if (GetMonitorInfo(lCurrentScreen, lCurrentScreenInfo) == false) { return; } var lPrimaryScreenInfo = new Monitorinfo(); if (GetMonitorInfo(lPrimaryScreen, lPrimaryScreenInfo) == false) { return; } _monitorDpi = VisualTreeHelper.GetDpi(_window); _lastScreen = lCurrentScreen; var currentX = lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left; var currentY = lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top; var currentWidth = (lCurrentScreenInfo.RCWork.Right - lCurrentScreenInfo.RCWork.Left); var currentHeight = (lCurrentScreenInfo.RCWork.Bottom - lCurrentScreenInfo.RCWork.Top); var currentRatio = (float)currentWidth / currentHeight; var primaryX = lPrimaryScreenInfo.RCWork.Left - lPrimaryScreenInfo.RCMonitor.Left; var primaryY = lPrimaryScreenInfo.RCWork.Top - lPrimaryScreenInfo.RCMonitor.Top; var primaryWidth = (lPrimaryScreenInfo.RCWork.Right - lPrimaryScreenInfo.RCWork.Left); var primaryHeight = (lPrimaryScreenInfo.RCWork.Bottom - lPrimaryScreenInfo.RCWork.Top); var primaryRatio = (float)primaryWidth / primaryHeight; if (lParam != IntPtr.Zero) { var lMmi = (Minmaxinfo)Marshal.PtrToStructure(lParam, typeof(Minmaxinfo)); lMmi.PointMaxPosition.X = lPrimaryScreenInfo.RCMonitor.Left; lMmi.PointMaxPosition.Y = lPrimaryScreenInfo.RCMonitor.Top; lMmi.PointMaxSize.X = lPrimaryScreenInfo.RCMonitor.Right; lMmi.PointMaxSize.Y = lPrimaryScreenInfo.RCMonitor.Bottom; var minSize = new System.Windows.Point(_window.MinWidth * _monitorDpi.Value.DpiScaleX, _window.MinHeight * _monitorDpi.Value.DpiScaleX); lMmi.PointMinTrackSize.X = (int)minSize.X; lMmi.PointMinTrackSize.Y = (int)minSize.Y; Marshal.StructureToPtr(lMmi, lParam, true); } CurrentMonitorSize = new Rectangle(currentX, currentY, currentWidth + currentX, currentHeight + currentY); CurrentMonitorMargin = new Thickness( (lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left) / _monitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top) / _monitorDpi.Value.DpiScaleY, (lCurrentScreenInfo.RCMonitor.Right - lCurrentScreenInfo.RCWork.Right) / _monitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCMonitor.Bottom - lCurrentScreenInfo.RCWork.Bottom) / _monitorDpi.Value.DpiScaleY ); _screenSize = new Rect(lCurrentScreenInfo.RCWork.Left, lCurrentScreenInfo.RCWork.Top, currentWidth, currentHeight); }
public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight, DpiScale?dpiScale, ImageLoadScaling scaling) : this(decodePixelWidth, decodePixelHeight, dpiScale) { Scaling = scaling; }
public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight, DpiScale?dpiScale) : this(decodePixelWidth, decodePixelHeight) { DpiScale = dpiScale; }
/// <summary> /// Pobranie min/max rozmiaru okna dla naszego okna /// </summary> /// <param name="hwnd"></param> /// <param name="lParam"></param> private void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { GetCursorPos(out var lMousePosition); var lCurrentScreen = mBeingMoved ? MonitorFromPoint(lMousePosition, MonitorOptions.MONITOR_DEFAULTTONULL) : MonitorFromWindow(hwnd, MonitorOptions.MONITOR_DEFAULTTONULL); var lPrimaryScreen = MonitorFromPoint(new POINT(0, 0), MonitorOptions.MONITOR_DEFAULTTOPRIMARY); var lCurrentScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lCurrentScreen, lCurrentScreenInfo) == false) { return; } var lPrimaryScreenInfo = new MONITORINFO(); if (GetMonitorInfo(lPrimaryScreen, lPrimaryScreenInfo) == false) { return; } mMonitorDpi = VisualTreeHelper.GetDpi(mWindow); mLastScreen = lCurrentScreen; var currentX = lCurrentScreenInfo.RCWork.Left - lCurrentScreenInfo.RCMonitor.Left; var currentY = lCurrentScreenInfo.RCWork.Top - lCurrentScreenInfo.RCMonitor.Top; var currentWidth = (lCurrentScreenInfo.RCWork.Right - lCurrentScreenInfo.RCWork.Left); var currentHeight = (lCurrentScreenInfo.RCWork.Bottom - lCurrentScreenInfo.RCWork.Top); var currentRatio = (float)currentWidth / (float)currentHeight; var primaryX = lPrimaryScreenInfo.RCWork.Left - lPrimaryScreenInfo.RCMonitor.Left; var primaryY = lPrimaryScreenInfo.RCWork.Top - lPrimaryScreenInfo.RCMonitor.Top; var primaryWidth = (lPrimaryScreenInfo.RCWork.Right - lPrimaryScreenInfo.RCWork.Left); var primaryHeight = (lPrimaryScreenInfo.RCWork.Bottom - lPrimaryScreenInfo.RCWork.Top); var primaryRatio = (float)primaryWidth / (float)primaryHeight; if (lParam != IntPtr.Zero) { var lMmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); lMmi.PointMaxPosition.X = lPrimaryScreenInfo.RCMonitor.Left; lMmi.PointMaxPosition.Y = lPrimaryScreenInfo.RCMonitor.Top; lMmi.PointMaxSize.X = lPrimaryScreenInfo.RCMonitor.Right; lMmi.PointMaxSize.Y = lPrimaryScreenInfo.RCWork.Bottom; var minSize = new Point(mWindow.MinWidth * mMonitorDpi.Value.DpiScaleX, mWindow.MinHeight * mMonitorDpi.Value.DpiScaleX); lMmi.PointMinTrackSize.X = (int)minSize.X; lMmi.PointMinTrackSize.Y = (int)minSize.Y; Marshal.StructureToPtr(lMmi, lParam, true); } CurrentMonitorSize = new Rectangle(currentX, currentY, currentWidth + currentX, currentHeight + currentY); CurrentMonitorMargin = new Thickness( (lCurrentScreenInfo.RCMonitor.Left - lCurrentScreenInfo.RCWork.Left) / mMonitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCMonitor.Top - lCurrentScreenInfo.RCWork.Top) / mMonitorDpi.Value.DpiScaleY, (lCurrentScreenInfo.RCMonitor.Right - lCurrentScreenInfo.RCWork.Right) / mMonitorDpi.Value.DpiScaleX, (lCurrentScreenInfo.RCMonitor.Bottom - lCurrentScreenInfo.RCWork.Bottom) / mMonitorDpi.Value.DpiScaleY ); mScreenSize = new Rect(lCurrentScreenInfo.RCWork.Left, lCurrentScreenInfo.RCWork.Top, currentWidth, currentHeight); }