У меня есть некоторые проблемы с свойством Form.AutoScaleMode вместе с элементами управления фиксированным размером при использовании шрифта, отличного от стандартного. Я отложил его до простого тестового приложения (WinForms 2.0) только с одной формой, некоторыми фиксированными размерами и следующими свойствами:
class Form1 : Form
{
// ...
private void InitializeComponent()
{
// ...
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Font = new System.Drawing.Font("Tahoma", 9.25F);
// ...
}
}
Под 96dpi, Windows XP, форма выглядит правильно, как этот пример с разрешением 96 точек на дюйм:
При 120 dpi, Windows XP, функция автозагрузки Windows Forms создает этот пример с разрешением 120 точек на дюйм:
Как вы видите, групповые боксы, кнопки, список или древовидные представления масштабируются правильно, многострочные текстовые поля становятся слишком большими по вертикальной оси, а метка фиксированного размера не масштабируется правильно как в вертикальном, так и в горизонтальном направлении. Кажется, что ошибка в платформе .NET?
EDIT: некоторые подсказки: изменение шрифта применяется только к содержащейся форме, элементы управления наследуют их шрифт из формы. Я хотел бы сохранить его таким образом, если это возможно.
Использование шрифта по умолчанию (Microsoft Sans Serif 8.25pt), эта проблема не возникает. Использование AutoScaleMode = Font
(с адекватными параметрами AutoScaleDimensions, конечно) либо не масштабируется вообще, либо масштабируется точно так же, как показано выше, в зависимости от того, когда установлен Font (до или после изменения AutoScaleMode). Проблема не связана с шрифтом "Tahoma", это происходит также с Microsoft Sans Serif, 9.25pt.
И да, я уже прочитал это сообщение SO высокие проблемы с DPI но мне это действительно не помогает.
Любые предложения о том, как это сделать?
EDIT2: Некоторая дополнительная информация о моем намерении: у меня около 50 уже работающих диалогов с фиксированным размером с несколькими сотнями правильно установленных элементов управления фиксированным размером. Они были перенесены из старой С++ GUI-структуры в С#/Winforms, поэтому они имеют фиксированный размер. Все они отлично смотрятся с разрешением 96 точек на дюйм, используя шрифт 9.25pt. В старой структуре масштабирование до 120 точек на дюйм работало нормально - все элементы фиксированного размера масштабировались одинаково в обоих измерениях. На прошлой неделе мы обнаружили это странное поведение масштабирования в WinForms при переключении на 120 dpi. Вы можете себе представить, что большинство наших диалогов теперь выглядят очень плохо при 120 dpi. Я ищу решение, которое позволяет полностью переделать все эти диалоги.
EDIT3: Для проверки этого поведения, IMHO, рекомендуется создать виртуальную среду Windows XP с разрешением 120 dpi, в то время как среда разработки находится под 96 dpi (по крайней мере, это то, что я сделал). Изменение между 96 и 120 dpi обычно требует перезагрузки под Win XP, иначе вы не увидите, что действительно происходит.
// As requested: the source code of Form1.cs
namespace DpiChangeTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Font f = this.textBox1.Font;
}
}
}
// here the source of Form1.Designer.cs:
namespace DpiChangeTest
{
partial class Form1
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Forms Designer generated code
private void InitializeComponent()
{
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("A list view control");
System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("A TreeView control");
this.button1 = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.listView1 = new System.Windows.Forms.ListView();
this.treeView1 = new System.Windows.Forms.TreeView();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(12, 107);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(150, 70);
this.button1.TabIndex = 0;
this.button1.Text = "Just a button";
this.button1.UseVisualStyleBackColor = true;
//
// groupBox1
//
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(150, 70);
this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Just a groupbox";
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(180, 12);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(150, 70);
this.textBox1.TabIndex = 2;
this.textBox1.Text = "A multiline text box";
//
// label1
//
this.label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label1.Location = new System.Drawing.Point(179, 107);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(150, 70);
this.label1.TabIndex = 3;
this.label1.Text = "A label with AutoSize=False";
//
// listView1
//
this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
listViewItem2});
this.listView1.Location = new System.Drawing.Point(12, 201);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(150, 70);
this.listView1.TabIndex = 4;
this.listView1.UseCompatibleStateImageBehavior = false;
//
// treeView1
//
this.treeView1.Location = new System.Drawing.Point(179, 201);
this.treeView1.Name = "treeView1";
treeNode2.Name = "Knoten0";
treeNode2.Text = "A TreeView control";
this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode2});
this.treeView1.Size = new System.Drawing.Size(150, 70);
this.treeView1.TabIndex = 5;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(343, 289);
this.Controls.Add(this.treeView1);
this.Controls.Add(this.listView1);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Controls.Add(this.groupBox1);
this.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.25F);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button1;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.TreeView treeView1;
}
}
// and Main.cs
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}