From 5f330ddb827075b044c7db58e1115d9838246cba Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Fri, 15 May 2020 16:57:45 -0700 Subject: [PATCH] adding support for high res monitors (dpi awareness) --- .../ApplicationSettingsPage.cs | 25 ++++++++++++++++++- .../SettingsManagement/UserSettings.cs | 1 + Program.cs | 17 +++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/MatterControlLib/SettingsManagement/ApplicationSettingsPage.cs b/MatterControlLib/SettingsManagement/ApplicationSettingsPage.cs index dc433e810..5f99900e8 100644 --- a/MatterControlLib/SettingsManagement/ApplicationSettingsPage.cs +++ b/MatterControlLib/SettingsManagement/ApplicationSettingsPage.cs @@ -246,7 +246,7 @@ namespace MatterHackers.MatterControl double sliderThumbWidth = 10 * GuiWidget.DeviceScale; double sliderWidth = 100 * GuiWidget.DeviceScale; - var textSizeSlider = new SolidSlider(new Vector2(), sliderThumbWidth, theme, .7, 1.4) + var textSizeSlider = new SolidSlider(new Vector2(), sliderThumbWidth, theme, .7, 2.5) { Name = "Text Size Slider", Margin = new BorderDouble(5, 0), @@ -334,6 +334,29 @@ namespace MatterHackers.MatterControl }), advancedPanel); + // Touch Screen Mode + this.AddSettingsRow( + new SettingsItem( + "Utilize High Res Monitors".Localize(), + theme, + new SettingsItem.ToggleSwitchConfig() + { + Checked = UserSettings.Instance.get(UserSettingsKey.ApplicationDpiAwareness) == "PerMonitorAware", + ToggleAction = (itemChecked) => + { + string dpiAwareness = itemChecked ? "PerMonitorAware" : "None"; + if (dpiAwareness != UserSettings.Instance.get(UserSettingsKey.ApplicationDpiAwareness)) + { + UserSettings.Instance.set(UserSettingsKey.ApplicationDpiAwareness, dpiAwareness); + StyledMessageBox.ShowMessageBox( + "To finish changing your monitor settings you need to restart MatterControl. If after changing your fonts are too small you can adjust Text Size.".Localize(), + "Restart Required".Localize()); + UiThread.RunOnIdle(() => ApplicationController.Instance.ReloadAll().ConfigureAwait(false)); + } + } + }), + advancedPanel); + var openCacheButton = new IconButton(AggContext.StaticData.LoadIcon("fa-link_16.png", 16, 16, theme.InvertIcons), theme) { ToolTipText = "Open Folder".Localize(), diff --git a/MatterControlLib/SettingsManagement/UserSettings.cs b/MatterControlLib/SettingsManagement/UserSettings.cs index 5022f113c..dfdda5ea5 100644 --- a/MatterControlLib/SettingsManagement/UserSettings.cs +++ b/MatterControlLib/SettingsManagement/UserSettings.cs @@ -17,6 +17,7 @@ namespace MatterHackers.MatterControl public const string AfterPrintFinishedSendEmail = nameof(AfterPrintFinishedSendEmail); public const string AfterPrintFinishedSendTextMessage = nameof(AfterPrintFinishedSendTextMessage); public const string ApplicationDisplayMode = nameof(ApplicationDisplayMode); + public const string ApplicationDpiAwareness = nameof(ApplicationDpiAwareness); public const string ApplicationTextSize = nameof(ApplicationTextSize); public const string ColorPanelExpanded = nameof(ColorPanelExpanded); public const string ConfigurePrinter_CurrentTab = nameof(ConfigurePrinter_CurrentTab); diff --git a/Program.cs b/Program.cs index 311a7b562..8c9cdb182 100644 --- a/Program.cs +++ b/Program.cs @@ -31,6 +31,7 @@ using System; using System.Globalization; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.ServiceModel; using System.ServiceModel.Description; using System.Threading; @@ -59,6 +60,17 @@ namespace MatterHackers.MatterControl private const string ServiceBaseUri = "net.pipe://localhost/mattercontrol"; + [DllImport("Shcore.dll")] + static extern int SetProcessDpiAwareness(int PROCESS_DPI_AWARENESS); + + // According to https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx + private enum DpiAwareness + { + None = 0, + SystemAware = 1, + PerMonitorAware = 2 + } + [STAThread] public static void Main(string[] args) { @@ -155,6 +167,11 @@ namespace MatterHackers.MatterControl Directory.SetCurrentDirectory(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)); Datastore.Instance.Initialize(DesktopSqlite.CreateInstance()); + + if (UserSettings.Instance.get(UserSettingsKey.ApplicationDpiAwareness) == "PerMonitorAware") + { + SetProcessDpiAwareness((int)DpiAwareness.PerMonitorAware); + } #if !DEBUG // Conditionally spin up error reporting if not on the Stable channel string channel = UserSettings.Instance.get(UserSettingsKey.UpdateFeedType);