namespace MatrixImageEditor; internal static class ResponsiveLayout { public static void FitAndCenter(Form form, Size preferredLogical, Size minimumLogical, double workingAreaFraction, Screen? screen = null) { screen ??= Screen.FromControl(form); var workingArea = screen.WorkingArea; var scale = Math.Max(form.DeviceDpi, 96) / 96F; var preferred = Scale(preferredLogical, scale); var minimum = Scale(minimumLogical, scale); var maximum = new Size( Math.Max(320, (int)Math.Floor(workingArea.Width * workingAreaFraction)), Math.Max(240, (int)Math.Floor(workingArea.Height * workingAreaFraction))); var width = Math.Min(preferred.Width, maximum.Width); var height = Math.Min(preferred.Height, maximum.Height); form.MinimumSize = new Size(Math.Min(minimum.Width, maximum.Width), Math.Min(minimum.Height, maximum.Height)); form.Size = new Size(Math.Max(width, form.MinimumSize.Width), Math.Max(height, form.MinimumSize.Height)); form.Location = new Point( workingArea.Left + Math.Max(0, (workingArea.Width - form.Width) / 2), workingArea.Top + Math.Max(0, (workingArea.Height - form.Height) / 2)); } private static Size Scale(Size logical, float scale) => new( Math.Max(1, (int)Math.Round(logical.Width * scale)), Math.Max(1, (int)Math.Round(logical.Height * scale))); }