【发布时间】:2017-03-08 03:30:24
【问题描述】:
我有一个在旧系统上运行良好的 WinForms 应用程序,但我无法让它在 4k 显示器上看起来很好。有多个问题,关于这个主题的文章很多,但这个问题集中在一个特定的问题上。我可以设置不同的控件来使用相同的字体,但是在高 DPI 系统上,控件看起来会有很大不同。我该如何解决这个问题?
显然,我可以更改字体大小、移动控件等。但 Windows 在我的字体大小中添加了一个神秘因素。在不知道 Windows 在做什么的情况下,我很难撤消它!
在旧系统上,我的测试窗口看起来很完美:
在高 DPI 系统上,某些控件的字体大小与其他控件不同:
我尝试了几件事,包括在某些控件上手动设置字体,而不是从表单继承。如您所见,更改字体并不能解决问题:
在互联网上搜索后,我尝试了几种方法来解决此问题,包括:
- 在 PROCESS_DPI_UNAWARE、PROCESS_SYSTEM_DPI_AWARE 和 PROCESS_PER_MONITOR_DPI_AWARE 之间更改应用程序
- 明确changing the font,而不是使用表单的字体。
- 在旧系统上构建与在高 DPI 系统上构建。
- 在设置为 96 DPI / 100% 的显示器上构建与在同一台计算机上设置为 192 DPI / 200% 的显示器上构建。
- 在 Visual Studio 的设计器中构建表单与在纯 C# 代码中构建表单。
- .Net 4.0 与 .Net 4.6.1
- Visual Studio 2010 与 Visual Studio 2015
我只发现一件事解决了我的问题。不幸的是,我必须在目标机器上做,而不是在我正在构建它的机器上。所以这不是一个实际的解决方案。有关详细信息,请参阅“重复步骤”下的第二项。
重复步骤:
- 很多表单上的很多控件都会发生这种情况。请参阅下面的代码示例以获取一个简单的小演示。这就是我得到上面截图的方式。
-
我可以通过一个系统设置使这个问题出现或消失。如果您将主显示器更改为 96 DPI / 100% 缩放,然后重新启动,您将获得所有字体都符合要求的良好结果。如果您将主显示器更改为不同的 DPI 设置,然后重新启动,您会看到不好的结果。
private void newFormButton_Click(object sender, EventArgs e) { Font copyOfFont = new Font(Font, FontStyle.Strikeout); Form form = new Form(); form.Font = Font; string sample = "Abc 123 :)"; int padding = 6; Label label = new Label(); label.Text = sample; label.Top = padding; label.Left = padding; label.Font = copyOfFont; label.Parent = form; Button button = new Button(); button.Text = sample; button.Top = label.Bottom + padding; button.Left = padding; button.Width = label.Width + padding * 2; button.Height = label.Height + padding * 2; button.Parent = form; TextBox textBox = new TextBox(); textBox.Text = sample; textBox.Size = button.Size; textBox.Top = button.Bottom + padding; textBox.Left = padding; textBox.Parent = form; ListBox listBox = new ListBox(); listBox.Items.Add(sample); listBox.Items.Add(sample); listBox.Width = button.Width; listBox.Height = button.Height * 2; listBox.Top = textBox.Bottom + padding; listBox.Left = padding; listBox.Font = copyOfFont; listBox.Parent = form; form.Show(); }
【问题讨论】:
-
您是指文本框中的字体大小与 HiDPI 示例中的标签不同吗?
-
是的,文本框和列表框的字体大小相同,按钮和标签的字体大小不同。它们都应该具有相同的大小。