因此,这里是这种情况:我试图使我所有的表格(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/