Windows Forms Graphic Issue on Windows 10 OS

后端 未结 1 1004
北荒
北荒 2020-11-28 12:57

When I run any Windows Forms application in Windows 10, the graphics inside the window appear to be distorted:

At design time this does not happen:

相关标签:
1条回答
  • 2020-11-28 13:29

    To solve the problem, you can make your application DPI-Aware using either of these options:

    • Application Manifest
    • API calls to SetProcessDPIAware, SetProcessDpiAwareness or SetProcessDpiAwarenessContext

    Important Note: It is recommended that you set the process-default DPI awareness via application manifest, not an API call.

    Using Application Manifest File

    To make the application DPI-Aware, you can add an Application Manifest File to your project. Then in the app.manifest file, uncomment the part that is related to DPI-Awareness:

    <application xmlns="urn:schemas-microsoft-com:asm.v3">
     <windowsSettings>
       <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
     </windowsSettings>
    </application>
    

    Then in your app.config file, add EnableWindowsFormsHighDpiAutoResizing setting its value to true:

    <appSettings>
      <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </appSettings>
    

    For more information take a look at the following topic in Microsoft docs:

    • High DPI Desktop Application Development on Windows

    SetProcessDPIAware API call Example

    You can use SetProcessDPIAware() method before showing your main form to set your application dpi aware and prevent windows from scaling the application. Also you should check the windows version to be greater than or equals to vista:

    static class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool SetProcessDPIAware();
    
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (Environment.OSVersion.Version.Major >= 6)
                SetProcessDPIAware();
    
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(true);
            Application.Run(new Form1());
        }
    }
    

    Notes

    1. As it's already mentioned above, it is recommended that you set the process-default DPI awareness via application manifest, not an API call.

    2. Before using API calls, read the documentations to know about supported OS and also possible race condition if a DLL caches dpi settings during initialization. Also keep in mind, DLLs should accept the dpi setting of the host process rather than API call themselves.

    3. You may find this DpiHelper class implemented in WinForms for .NET Core 3.0 useful.
    0 讨论(0)
提交回复
热议问题