【问题标题】:Windows Forms Graphic Issue on Windows 10 OSWindows 10 操作系统上的 Windows 窗体图形问题
【发布时间】:2015-11-07 21:54:49
【问题描述】:

当我在 Windows 10 中运行任何 Windows 窗体应用程序时,窗口内的图形似乎失真:

在设计时这不会发生:

有没有人经历过这种情况?

(请打开图片查看效果。)

【问题讨论】:

  • 您是否在 Windows 或程序本身中启用了一些辅助功能或缩放相关设置?
  • 我的也有同样的问题,并不是真正的答案,但我认为这与 DPI 缩放有关。如果你有一个高分辨率屏幕。您可以通过编译来测试它,然后运行exe,右键单击并在兼容性中勾选禁用显示缩放。我最终使用了没有同样问题的 WPF。
  • 嗨@cubrr,我刚刚安装了windows,不要更改任何设置。我刚刚检查了是否有任何可访问性配置可能会影响问题,但没有发现任何相关内容:/
  • 没有问题,如果该应用程序只适合您,那么一切都很好,如果您希望其他人使用它,请记住,如果他们有高 dpi 设置,就会发生这种情况。就像 22" 屏幕上的 1080 左右。但公平地说,我仍然必须在大量应用程序上设置该设置!
  • 我在 windows 8.1 上使用了发布的解决方案,该解决方案也可能适用于 windows 10。

标签: c# .net winforms graphics scale


【解决方案1】:

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

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

使用应用程序清单文件

要使应用程序具有 DPI 感知能力,您可以将 应用程序清单文件 添加到您的项目中。然后在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 桌面应用程序开发

SetProcessDPIAwareAPI调用示例

您可以在显示主窗体之前使用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. 您可能会发现这个在 WinForms 中为 .NET Core 3.0 实现的 DpiHelper 类很有用。

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2017-08-10
    相关资源
    最近更新 更多