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

And*_*rew 28 c# winforms

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

这甚至可能吗?

ese*_*elk 26

这对我有用...

        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)));
Run Code Online (Sandbox Code Playgroud)

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

  1. 将AutoScaleMode设置为None.

  2. 使用"Pixel"作为所有字体的单位类型,而不是默认的Point值.

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

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

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


Han*_*ant 18

问题是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);
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
Run Code Online (Sandbox Code Playgroud)

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

  • 控件/表单的生命周期中的哪一步是这个设置?在构造函数中?InitializeComponent常规? (4认同)

Gab*_*ana 1

这种违背用户意愿的行为并不是微软所乐见的。

与其解决症状(您的应用程序无法正确缩放),不如解决问题?当用户选择较大的字体时,通常是因为他们需要较大的字母才能阅读;因此,正确缩放比不缩放和用户难以辨认更重要。

  • 我不相信这能回答问题。虽然说“XYZ 不应该做”很有用,但说“你不能做 XYZ”是没有用的,除非你不能做 XYZ。这个答案可以作为对原始问题的评论,但不能作为答案。 (11认同)