У меня есть некоторые проблемы со свойством 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);
// ...
}
}
При 96 dpi, Windows XP, форма выглядит правильно, как в примере 96 dpi:
![96 dpi WinForm](https://i.stack.imgur.com/TH0sC.jpg)
При разрешении 120 т / д в Windows XP функция автоматического масштабирования Windows Forms приводит к примеру с разрешением 120 т / д:
![Previous WinForm scaled to 120 dpi](https://i.stack.imgur.com/O8Ao6.jpg)
Как видите, групповые блоки, кнопки, представления списка или дерева масштабируются правильно, многострочные текстовые поля становятся слишком большими по вертикальной оси, а метка фиксированного размера неправильно масштабируется как в вертикальном, так и в горизонтальном направлении. Кажется, ошибка в .NET Framework?
РЕДАКТИРОВАТЬ: некоторые подсказки: изменение шрифта применяется только к вмещающей форме, элементы управления наследуют свой шрифт от формы. Я хотел бы сохранить это, если это возможно.
При использовании шрифта по умолчанию (Microsoft Sans Serif 8.25pt) эта проблема не возникает. Использование AutoScaleMode = Font
(с соответствующими AutoScaleDimensions, конечно) либо не масштабируется вообще, либо масштабируется точно так, как показано выше, в зависимости от того, когда установлен шрифт (до или после изменения AutoScaleMode). Проблема не связана со шрифтом Tahoma, она также возникает с Microsoft Sans Serif, 9.25pt.
И да, я уже читал этот ТАК пост
проблемы с высоким разрешением
но это не очень помогает мне.
Есть предложения, как это обойти?
РЕДАКТИРОВАТЬ 2: Некоторая дополнительная информация о моем намерении: у меня есть около 50 уже работающих диалогов фиксированного размера с несколькими сотнями правильно размещенных элементов управления фиксированного размера. Они были перенесены из более старой графической среды C ++ в C # / Winforms, поэтому все они имеют фиксированный размер. Все они выглядят хорошо с 96 dpi, используя шрифт 9.25pt. При старой структуре масштабирование до 120 dpi работало нормально - все элементы управления фиксированного размера масштабировались одинаково в обоих измерениях. На прошлой неделе мы обнаружили странное поведение масштабирования под WinForms при переключении на 120 dpi. Вы можете себе представить, что большинство наших диалогов теперь выглядят очень плохо при 120 dpi. Я ищу решение, которое позволяет избежать полного перепроектирования всех этих диалогов.
EDIT3: для проверки этого поведения, IMHO, было бы неплохо настроить виртуальную среду Windows XP с разрешением 120 точек на дюйм, в то время как среда разработки поддерживает разрешение 96 точек на дюйм (по крайней мере, так я и сделал). Для переключения между 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());
}