因此,这里是这种情况:我试图使我所有的表格(Winforms)在4K和1080p(也称为高DPI或“ dpi感知”)下看起来都不错。我(出于该问题的目的)具有三种形式:frmCompanyMasterEdit继承自frmBaseEdit,frmBaseEdit继承自frmBase,frmBase继承System.Windows.Forms.Form。

我通过在清单中使应用程序能够识别DPI来尝试了旧方法:

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


这样,除了我可以解决的细微锚定问题之外,该表格在4K上看起来很完美,看起来像那样,但在1080p上有点模糊。这是4K:4K both old and new ways

无论如何,所以我要进行尝试并尝试以.NET 4.7中描述的新方法进行操作,以4.7框架为目标并添加以下代码:

到app.config

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


到app.manifest

<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />


并将旧代码从app.manifest中删除,以免覆盖新的.NET 4.7方法。我确保将代码放在适当的位置。
因此,在上面的图像中,该格式在4K中看起来不错,但现在在1080p中,其放大效果非常好,如下所示:
1080p new way

因此,无论哪种方式,除了较小的锚定问题外,该格式在4k上看起来都很棒,并且(旧方法)尺寸合适,但1080p有点模糊,或者1080p并不模糊,但实际上已经放大了。
我还必须在所有designer.vb文件中更改这两行,如下所示:

Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi


我不知道为什么我无法在1080p中让它看起来合适。就像我说的那样,我的目标是4.7 .NET框架。我在Windows 10的适当版本(版本1709 /创作者版本)上运行。 1080p缩放为100%。另外,我们没有资源升级到WPF。

最佳答案

我已经成功为我的两个分别针对.NET 4.5和4.7的Winforms应用程序添加了DPI支持。

过去,我尝试通过清单文件来添加支持,但是运气不好。幸运的是,我找到了以下解决方案:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WinformsApp
{
    static class Program
    {
        [DllImport("Shcore.dll")]
        static extern int SetProcessDpiAwareness(int PROCESS_DPI_AWARENESS);

        // According to https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx
        private enum DpiAwareness
        {
            None = 0,
            SystemAware = 1,
            PerMonitorAware = 2
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            SetProcessDpiAwareness((int)DpiAwareness.PerMonitorAware);

            Application.Run(new MainForm());
        }
    }
}


上面的代码就是Program.cs文件的外观。当然,您必须将此移植到VB,但这应该很容易做到。

这在Windows 10中完美运行,无需任何其他修改。

在两个Winforms应用程序之一中,我使用像素坐标通过Graphics类渲染字符串,这导致我的字符串发生偏移。修复非常简单:

private void DrawString(Graphics g, string text, int x, int y)
{
    using (var font = new Font("Arial", 12))
    using (var brush = new SolidBrush(Color.White))
        g.DrawString(text, font, brush, LogicalToDeviceUnits(x), LogicalToDeviceUnits(y));
}


基本上,我必须使用Control.LogicalToDeviceUnits(int value)来缩放像素坐标。

除此之外,我根本不需要触摸我的代码。

关于.net - WinForms 4K和1080p缩放/高DPI?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49012233/

10-13 07:55