当用户在操作系统设置中选择较大或较小的百分比时,我需要一种快速强制我的C#Windows窗体应用程序不缩放字体的方法。
这甚至可能吗?
答案 0 :(得分: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)));
以上两行是从我的BaseForm.Designer.cs文件中复制的,但基本上我找到了两个简单的步骤来获得“无字体缩放”:
将AutoScaleMode设置为无。
使用“Pixel”作为所有字体的单位类型,而不是默认的Point值。
至于你是否应该让Windows扩展你的字体,这取决于你。我不喜欢这个设计,所以如果我觉得我的应用程序需要缩放,我会自己做,有我自己的选择和设计。
多年来与实际的最终用户交谈时,我发现他们中的大多数人都不知道DPI设置,如果他们有除默认设置以外的任何东西,那不是因为他们想要它方式...他们只是从来没有注意到,因为他们使用的只是网页浏览器,可能是Excel和Microsoft Word(使用他们设置的任何字体)。
如果我的应用程序已经尊重系统字体设置,他们就不会喜欢它= =更少的销售额,因为它会像系统对话框那样拥有这个巨大的丑陋字体(并且他们不知道如何改变它,但他们不关心他们从不使用的系统对话框。
答案 1 :(得分: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);
}
答案 2 :(得分:6)
我找到了一个非常简单的解决方法。
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
无论自动缩放大小如何,这都会使文本大小相同。
答案 3 :(得分:2)
没有。 GDI和Windows Forms依赖于分辨率。最佳选择是以调整窗口大小时适当缩放的方式设计布局。这往往允许字体大小缩放正常工作,因为布局将根据需要进行调整。
顺便说一句,这是WPF的重大改进之一 - 它的设计独立于分辨率。
答案 4 :(得分: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。
答案 5 :(得分:1)
违背用户的意愿,这不是MS热切关注的事情。
而不是修复症状(您的应用程序无法正确缩放),是否可能只是快速解决问题?当用户选择较大的字体时,通常是因为它们需要较大的字母才能读取它们;因此,正确缩放比不缩放和保持用户难以辨认更重要。
答案 6 :(得分:1)
因此,在Windows 7上不让文本自动缩放的唯一方法是将字体单位设置为Pixel,将Window的AutoScaling属性设置为None。
在Windows 8.0中,我猜你别无选择,只能将dpi设置为开发者机器的dpi,并要求用户永远不要更改它!