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

时间:2015-11-07 21:54:49

标签: c# .net winforms graphics scale

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

Bad Image

在设计时,这不会发生:

Good Image

有没有人经历过这个?

(请打开图片以便更好看。)

1 个答案:

答案 0 :(得分:5)

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

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

使用Application Manifest File

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

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

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

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

有关详细信息,请查看High DPI MSDN页面。

使用SetProcessDPIAware

您可以在显示主表单之前使用SetProcessDPIAware()方法来设置应用程序dpi,并防止Windows扩展应用程序。此外,您应该检查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());
    }
}

注意

虽然我之前使用SetProcessDPIAware方法来解决问题,但在使用前阅读了说明:

  如果DLL在初始化期间缓存dpi设置,则

SetProcessDPIAware会受到可能的竞争条件的影响。因此,建议通过应用程序(.exe)清单设置dpi-aware,而不是通过调用SetProcessDPIAware

     

SetProcessDPIAware仅适用于。{   “要求”部分中指定的操作系统。这种方法   在后续版本的操作中可能会出现意外行为   系统。请改用SetProcessDpiAwareness

     

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