Windows 10操作系统上的Windows窗体图形问题

Vin*_*ves 5 .net c# graphics scale winforms

当我在Windows 10中运行任何Windows窗体应用程序时,窗口内的图形看起来是扭曲的:

坏图像

在设计时,这不会发生:

好的形象

有没有人经历过这个?

(请打开图片看看会更好.)

Rez*_*aei 7

要解决此问题,您可以使用以下任一选项使应用程序DPI-Aware:

  • 使用应用程序清单文件
  • 使用SetProcessDPIAware

使用应用程序清单文件

要使应用程序具有DPI-Aware,您可以将Application Manifest文件添加到项目中.然后在该SetProcessDPIAware文件中,取消注释与DPI-Awareness相关的部分:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
 <windowsSettings>
   <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
 </windowsSettings>
</application>
Run Code Online (Sandbox Code Playgroud)

然后在app.config文件中,将SetProcessDpiAwareness其值设置为true:

<appSettings>
  <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看高DPI MSDN页面.

使用SetProcessDPIAware

您可以SetProcessDpiAwarenessContext在显示主窗体之前使用方法来设置应用程序dpi,并防止窗口缩放应用程序.您还应检查Windows版本是否大于或等于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());
    }
}
Run Code Online (Sandbox Code Playgroud)

注意

虽然我之前使用该app.manifest方法来解决问题,但在使用之前阅读了注意事项:

EnableWindowsFormsHighDpiAutoResizing如果DLL在初始化期间缓存dpi设置,则受可能的竞争条件限制.因此,建议通过应用程序(.exe)清单而不是通过调用来设置dpi-aware SetProcessDPIAware.

SetProcessDPIAware()仅可在"要求"部分中指定的操作系统中使用.此方法在后续版本的操作系统中可能具有意外行为.请DpiHelper改用.

DLL应该接受主机进程的dpi设置而不是SetProcessDPIAware自己调用.要正确设置,应将dpiAware指定为应用程序(.exe)清单的一部分.