Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a DPI-Aware Application

I have a form application in C#. When I change the monitor's DPI, all the controls move. I used the code this.AutoScaleMode = AutoScaleMode.Dpi, but it didn't avoid the problem.

Does anyone have an idea?

like image 607
RRR Avatar asked Nov 02 '10 07:11

RRR


People also ask

What does it mean to be DPI aware?

System: When an app is system DPI aware, it'll obtain the scaling settings from the primary monitor allowing the app to scale and render correctly, no matter the scaling settings.

How do I make my application DPI aware?

To make your application dpi-aware, you must cancel automatic dpi scaling, and then adjust user interface elements to scale appropriately to the system dpi.

Is WPF DPI aware?

Windows Presentation Foundation (WPF) applications are by default system DPI-aware.

How do you override high DPI scaling behavior for all applications?

Select Display > Change the size of text, apps, and other items, and then adjust the slider for each monitor. Right-click the application, select Properties, select the Compatibility tab, and then select the Disable display scaling on high DPI settings check box.


2 Answers

EDIT: As of .NET 4.7, windows forms has improved support for High DPI. Read more about it on docs.microsoft.com It only works for Win 10 Creators Update and higher though, so it might not be feasible to use this yet depending on your user base.


Difficult, but not impossible. Your best option is to move to WPF of course, but that might not be feasible.

I've spent A LOT of time with this problem. Here are some rules/guidelines to make it work correctly without a FlowLayoutPanel or TableLayoutPanel:

  • Always edit/design your apps in default 96 DPI (100%). If you design in 120DPI (125% f.ex) it will get really bad when you go back to 96 DPI to work with it later.
  • I've used AutoScaleMode.Font with success, I haven't tried AutoScaleMode.DPI much.
  • Make sure you use the default font size on all your containers (forms, panels, tabpage, usercontrols etc). 8,25 px. Preferrably it shouldn't be set in the .Designer.cs file at all for all containers so that it uses the default font from the container class.
  • All containers must use the same AutoScaleMode
  • Make sure all containers have the below line set in the Designer.cs file:

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); // for design in 96 DPI

  • If you need to set different font sizes on labels/textboxes etc. set them per control instead of setting the font on the container class because winforms uses the containers font setting to scale it's contents and having f.ex a panel with a different font size than it's containing form is guaranteed to make problems. It might work if the form and all containers on the form use the same font size, but I haven't tried it.
  • Use another machine or a virtual windows install (VMware, Virtual PC, VirtualBox) with a higher DPI setting to test your design immediatly. Just run the compiled .exe file from the /bin/Debug folder on the DEV machine.

I guarantee that if you follow these guidelines you will be ok, even when you have placed controls with specific anchors and don't use a flowpanel. We have an app built this way deployed on hundreds of machines with different DPI setups and we no longer have any complaints. All forms/containers/grids/buttons/textfield etc sizes are scaled correctly as is the font. Images work too, but they tend to get a little pixellated at high DPI.

EDIT: This link has a lot of good info, especially if you choose to use AutoScaleMode.DPI: link to related stackoverflow question

like image 73
Trygve Avatar answered Sep 19 '22 16:09

Trygve


note: this will not fix the controls moving , when dpi change. this will only fix blurry text!!.


How to fix blurry Windows Forms in high-dpi settings:

  1. Go the the Forms designer, then select your Form (by clicking at its title bar)
  2. Press F4 to open the Properties window,
  3. then locate the AutoScaleMode property
  4. Change it from Font (default) to Dpi.

Now, go to Program.cs (or the file where your Main method is located) and change it to look like:

namespace myApplication {     static class Program     {         [STAThread]         static void Main()         {             // ***this line is added***             if (Environment.OSVersion.Version.Major >= 6)                 SetProcessDPIAware();              Application.EnableVisualStyles();             Application.SetCompatibleTextRenderingDefault(false);             Application.Run(new MainForm());         }          // ***also dllimport of that function***         [System.Runtime.InteropServices.DllImport("user32.dll")]         private static extern bool SetProcessDPIAware();     } } 

Save and compile. Now your form should look crispy again.


source: http://crsouza.com/2015/04/13/how-to-fix-blurry-windows-forms-windows-in-high-dpi-settings/

like image 38
bh_earth0 Avatar answered Sep 21 '22 16:09

bh_earth0