当用户选择125%或150%的OS字体大小时,如何强制Windows窗体C#应用程序忽略?

问题描述 投票:26回答:7

当用户在操作系统设置中选择更大或更小的百分比时,我需要一种快速强制我的C#Windows窗体应用程序不缩放字体的方法。

这甚至可能吗?

c# winforms
7个回答
25
投票

这对我有用...

        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
        this.Font = new System.Drawing.Font("Arial", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(0)));

以上两行是从我的BaseForm.Designer.cs文件中复制的,但基本上我找到了两个简单的步骤来获得“无字体缩放”:

  1. 将AutoScaleMode设置为None。
  2. 使用“Pixel”作为所有字体的单位类型,而不是默认的Point值。

至于你是否应该让Windows扩展你的字体,这取决于你。我不喜欢这个设计,所以如果我觉得我的应用程序需要扩展,我会自己做,有我自己的选择和设计。

多年来与实际的最终用户交谈时,我发现大多数人都不知道DPI设置,如果他们有除默认设置以外的任何东西,那不是因为他们想要那样。他们只是从来没有注意到,因为他们使用的只是网络浏览器,可能是Excel和Microsoft Word(使用他们设置的任何字体)。

如果我的应用程序已经尊重系统字体设置,他们就不会喜欢它= =更少的销售额,因为它会像系统对话框那样拥有这个巨大的丑陋字体(并且他们不知道如何更改它,但他们并不关心他们从不使用的系统对话框。


17
投票

问题是Form或控件的Font属性指定Points中的字体大小。当DPI设置改变时,这是一个影响字母高度的测量。一点是1/72英寸。默认DPI,每英寸96点,字体大小为9磅,产生一个9/72 x 96 = 12像素高的字母。

当用户将DPI设置提高到120 DPI(125%)时,则字母变为9/72 x 120 = 15像素高。如果不让控件变大,则文本将不再适合控件。看起来很难看。

Form.AutoScaleMode属性解决了这个问题。它检查表单的设计大小,并将其与运行它的机器上的DPI进行比较。并调整控件的大小和重新定位,以确保不会发生这种裁剪。非常有用,它是完全自动的,你无需做任何事情。

典型的问题是前一段中的“重定位”位。如果您为控件提供自己的字体大小而不是继承表单的大小,或者如果表单的自动布局不是犹太教,那么控件可能会在错误的位置结束,从而破坏表单的有组织的外观。

您需要解决这个问题,从您的问题中不清楚问题的根源是什么。试图阻止这种自动扩展工作是不可持续的。您必须迭代表单中的所有控件并更改其字体,选择较小的字体大小。然而,如果不是这样,这将在几年后让你陷入困境。您的用户将抱怨必须使用邮票。

调试布局问题的最简单方法是避免不断更改DPI大小的痛苦,暂时将此代码粘贴到表单类中:

    protected override void OnLoad(EventArgs e) {
        this.Font = new Font(this.Font.FontFamily, this.Font.SizeInPoints * 125 / 96);
        base.OnLoad(e);
    }

6
投票

我找到了一个非常简单的解决方法。

this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;

无论自动缩放大小如何,这都将使文本大小相同。


2
投票

不可以.GDI和Windows Forms依赖于分辨率。最佳选择是以调整窗口大小时适当缩放的方式设计布局。这往往允许字体大小缩放正常工作,因为布局将根据需要进行调整。

顺便说一句,这是WPF的重大改进之一 - 它的设计独立于分辨率。


2
投票

我怀疑你已经尝试过了

yourform.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;

在您的表单中,这可以防止您的表单缩放,但不能防止您的字体。因此,您需要做的事情(即使不推荐,请参阅其他帖子)将表单中所有控件的字体大小设置为固定大小:

这是一个代码片段,用于获取表单的所有控件:

    public List<Control> FindAllControls(Control container)
    {
        List<Control> controlList = new List<Control>();
        FindAllControls(container, controlList);
        return controlList;
    }

    private void FindAllControls(Control container, IList<Control> ctrlList)
    {
        foreach (Control ctrl in container.Controls)
        {
            if (ctrl.Controls.Count == 0)
                ctrlList.Add(ctrl);
            else
                FindAllControls(ctrl, ctrlList);
        }
    }

http://www.csharp411.com/change-font-size/下,您将找到如何更改控件字体大小的链接,尤其是当您要使用固定像素大小时。我认为使用这些工具,您可以自己连接它们。

编辑:不要忘记说:如果你最终不会忽略操作系统字体大小并按预期使用AutoScaleMode:这有一些怪癖,请参阅my previous post here on SO


1
投票

违背用户的意愿,这不是MS急切适应的。

而不是修复症状(您的应用程序没有正确缩放),它可能不是很快解决问题?当用户选择较大的字体时,通常是因为它们需要较大的字母才能读取它们;所以正确缩放比不缩放和保持用户难以辨认更重要。


1
投票
  • 在Windows 8.0中,即使将字体单位设置为像素,AutoScaling设置为None,也会自动缩放。
  • 在Windows 7中,相同的应用程序不会自动缩放。

因此,在Windows 7上不让文本自动缩放的唯一方法是将字体单位设置为Pixel,将Window的AutoScaling属性设置为None。

在Windows 8.0中,我猜你别无选择,只能将dpi设置为开发者机器的dpi,并要求用户永远不要更改它!

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