代码之家  ›  专栏  ›  技术社区  ›  ScottishTapWater

要设计的Winforms大小不同[重复]

  •  0
  • ScottishTapWater  · 技术社区  · 6 年前

    我用C#创建了一个简单的Winforms应用程序。当我在具有高DPI设置(例如150%)的计算机上运行应用程序时,应用程序将被放大。到现在为止,一直都还不错! 但是,所有文本都只是放大,而不是用更大的字体来呈现字体。当然,这会导致文本非常模糊(在所有控件上,如按钮等)。

    windows不应该正确地呈现文本吗?例如,我的应用程序的标题栏将显示为清晰。

    0 回复  |  直到 6 年前
        1
  •  121
  •   Hans Passant    7 年前

    一旦超过100%(或者勾选“XP-style DPI scaling”复选框时超过125%),Windows默认接管UI的缩放。它通过让你的应用程序将其输出渲染为位图并将该位图绘制到屏幕来实现。位图的重新缩放不可避免地使文本看起来模糊。一个称为“DPI虚拟化”的功能,它使旧程序在高分辨率监视器上保持可用。

    您必须明确地让它知道您可以通过添加 <dpiAware> 元素到您的清单。MSDN页面 is here 但它并没有完成,因为它忽略了UAC设置。项目+添加新项目,选择“应用程序清单文件”。编辑清单文本或复制/粘贴:

    <?xml version="1.0" encoding="utf-8"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
        <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
            <security>
                <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                    <requestedExecutionLevel level="asInvoker" uiAccess="false" />
                </requestedPrivileges>
            </security>
        </trustInfo>
        <asmv3:application>
            <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
                <dpiAware>true</dpiAware>
            </asmv3:windowsSettings>
        </asmv3:application>
    </assembly>
    

    您还可以在Main()方法中使用pinvoke SetProcessDPIAware(),例如,如果使用ClickOnce进行部署,则需要:

        [STAThread]
        static void Main() {
            if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());             // Edit as needed
        }
    
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool SetProcessDPIAware();
    

    更新,如果您使用VS2015更新1或更高版本,这一常见需求最终会简单一些。添加的清单已经有相关指令,只需删除注释。


    搜索关键字,以便我可以找到这篇文章回来:dpiAware

        2
  •  15
  •   Community T.Woody    7 年前

    应用程序可以以两种不同的模式开发。

    第一种方法是声明我们的应用程序不支持DPI(不声明任何内容都将默认为DPI)。在这种情况下,操作系统将在 预期96 DPI 然后对我们之前讨论过的位图缩放进行调整。结果将是一个模糊的应用程序,但有一个正确的布局。

    第二个选项是将应用程序声明为DPI感知。在这种情况下,操作系统不会进行任何缩放,而是让应用程序根据屏幕的原始DPI进行渲染。对于每个监视器的DPI环境,应用程序将使用所有屏幕中最高的DPI进行渲染,然后将此位图缩小到每个监视器的适当大小。缩小尺寸会比增大尺寸带来更好的观看体验,但您可能仍然会注意到一些模糊。

    如果要避免这种情况,必须根据监视器DPI aware声明应用程序。然后,必须检测应用程序何时被拖到不同的监视器上,并根据当前监视器的DPI进行渲染。

    声明DPI感知是在清单文件中完成的。

    请参阅以下链接 stackoverflow

        3
  •  3
  •   Xantium    6 年前

    这些建议对我都不起作用,但是,在我删除 Form.Font = new ... 从 Form.Design.cs ,窗体开始正确地重新缩放,如果在构造函数中定义了字体或根本没有定义字体,则可以工作。为什么?其他人也许可以解释,我只是可以谈谈我所做的改变,花了我几分钟的时间来找出这是我正在工作的表单的根本原因。希望有帮助。

        4
  •  1
  •   Wollmich    6 年前

    使用.NET Framework 4.7和Windows 10 Creators更新或更新版本,必须执行以下操作才能为Windows窗体应用程序配置高DPI支持:

    声明与Windows 10兼容。

    为此,请在 manifest 文件:

    <compatibility xmlns="urn:schemas-microsoft.com:compatibility.v1">
      <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      </application>
    </compatibility>
    

    在中启用每个监视器的DPI感知 app.config 文件。

    Windows窗体引入了一个新的 System.Windows.Forms.ApplicationConfigurationSection 元素以支持从.NETFramework4.7开始添加的新功能和自定义。要利用支持高DPI的新功能,请将以下内容添加到应用程序配置文件中。

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

    重要的

    在.NET框架的早期版本中,您使用清单来添加高DPI支持。不再建议使用此方法,因为它会覆盖app.config文件中定义的设置。

    调用静态EnableVisualStyles方法。

    这应该是应用程序入口点中的第一个方法调用。例如:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form2());   
    }
    

    这样做的好处是支持动态DPI场景,用户在启动Windows窗体应用程序后更改DPI或比例因子。

    资料来源: High DPI support in Windows Forms

        5
  •  0
  •   Aranxo    5 年前

    至少从Visual Studio 2017开始,您只需添加一个清单文件并取消注释此部分:

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