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

问题描述 投票:0回答:1

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

在设计时这不会发生:

有人经历过吗?

(请打开图片看得更清楚。)

c# .net winforms graphics scale
1个回答
7
投票

.NET Framework >= 4.7 的更新答案

打开 app.config 并添加以下部分:

<System.Windows.Forms.ApplicationConfigurationSection>
    <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>

有关详细信息,请参阅:Windows 窗体中的高 DPI 支持

.NET 框架 < 4.7

要解决此问题,您可以使用以下任一选项使您的应用程序具有 DPI 感知能力:

重要提示: 建议您设置进程默认 DPI 通过应用程序清单而不是 API 调用来感知。

使用应用清单文件

要使应用程序具有 DPI 感知能力,您可以将 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>

有关更多信息,请查看 Microsoft 文档中的以下主题:

  • Windows 上的高 DPI 桌面应用程序开发

SetProcessDPIAware
API 调用示例

您可以在显示主窗体之前使用

SetProcessDPIAware()
方法来设置您的应用程序 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());
    }
}

注意事项

  1. 正如上面已经提到的,建议您通过应用程序清单设置进程默认 DPI 感知,而不是 API 调用。

  2. 在使用 API 调用之前,请阅读文档以了解支持的操作系统以及 DLL 在初始化期间缓存 dpi 设置时可能出现的竞争条件。还要记住,DLL 应该接受主机进程的 dpi 设置,而不是 API 调用本身。

  3. 您可能会发现在 .NET Core 3.0 的 WinForms 中实现的这个

    DpiHelper
    类很有用。

© www.soinside.com 2019 - 2024. All rights reserved.