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

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

这有可能吗?

这对我有用…

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(使用他们设置的任何字体)。

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

问题是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进行比较。 并调整控件的大小和重新定位,以确保不会发生这种裁剪。 非常有用,它是完全自动的,你不必对它做任何事情。

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

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

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

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

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

 this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 

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

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

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

我怀疑你已经尝试过了

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

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

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

  public List FindAllControls(Control container) { List controlList = new List(); FindAllControls(container, controlList); return controlList; } private void FindAllControls(Control container, IList 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:这有一些怪癖,请参阅我之前在SO上的post 。

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

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

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

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

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