Как заставить приложение Windows Forms C # игнорировать, когда пользователь выбирает 125% или 150% для размера шрифта ОС? - PullRequest
27 голосов
/ 03 ноября 2010

Мне нужен быстрый способ заставить приложение C # Windows Forms не масштабировать шрифты, когда пользователь выбирает больший или меньший процент в настройках ОС.

Возможно ли это вообще?

Ответы [ 7 ]

26 голосов
/ 18 мая 2012

Вот что сработало для меня ...

        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 значение Нет.

  2. Используйте «Пиксель» в качестве Типа единицы измерения для всех шрифтов вместо значения точки по умолчанию.

Насколько вы должны позволить Windows масштабировать ваши шрифты или нет, это ваше дело.Мне, например, не нравится дизайн, поэтому, если я чувствую, что мое приложение нуждается в масштабировании, я сделаю это сам, с моими собственными опциями и дизайном.

За годы разговоров с фактическимпользователи, я также обнаружил, что большинство из них не имеют представления о настройках DPI, и если у них есть что-то кроме набора по умолчанию, это было не потому, что они этого хотели ... и они просто никогда не замечали, потому что все онииспользуется веб-браузер и, возможно, Excel и Microsoft Word (которые используют любой установленный им шрифт).

Если бы мое приложение соблюдало настройки системного шрифта, оно бы им не понравилось так же == меньшепродажи, потому что у него был бы такой огромный уродливый шрифт, как это делают системные диалоги (и они не знают, как его изменить, но им нет дела до системных диалогов, которые они никогда не используют).

17 голосов
/ 03 ноября 2010

Проблема в том, что свойство Font формы или элемента управления определяет размер шрифта в точках.Это измерение, которое влияет на высоту букв при изменении настройки DPI.Одна точка составляет 1/72 дюйма.DPI по умолчанию, 96 точек на дюйм и размер шрифта 9 точек, дает букву 9/72 x 96 = 12 пикселей в высоту.

Когда пользователь увеличивает настройку DPI, скажем, до 120 DPI(125%), тогда буква становится 9/72 x 120 = 15 пикселей в высоту.Если вы не позволите элементу управления увеличиваться, текст больше не будет помещаться в элемент управления.Очень некрасиво смотреть.

Свойство Form.AutoScaleMode решает эту проблему.Он проверяет, в каком размере была разработана форма, и сравнивает ее с DPI на компьютере, на котором она работает.И изменяет размеры и перемещает элементы управления, чтобы такого рода отсечение не происходило.Очень полезно, оно полностью автоматическое, без необходимости что-либо с этим делать.

Типичная проблема - бит "relocates" в предыдущем абзаце.Если вы присваиваете элементам управления собственный размер шрифта вместо того, чтобы наследовать размер формы, или если автоматическое расположение формы не кошерное, тогда элементы управления могут оказаться в неправильном месте, разрушая организованный вид формы.

Вам нужно это исправить, из вашего вопроса не ясно, каков источник проблемы.Попытка не допустить, чтобы это автоматическое масштабирование выполняло свою работу, не является устойчивым.Вам нужно будет перебрать все элементы управления в форме и изменить их шрифт, выбрав меньший размер шрифта.Это, однако, может привести к неприятностям через пару лет, если не раньше.Ваш пользователь будет жаловаться на то, что ему нужно работать с почтовой маркой.

Самый простой способ отладить проблему с макетом, избегая необходимости постоянного изменения размера DPI, - это временно вставить этот код в класс формы.:

    protected override void OnLoad(EventArgs e) {
        this.Font = new Font(this.Font.FontFamily, this.Font.SizeInPoints * 125 / 96);
        base.OnLoad(e);
    }
6 голосов
/ 22 апреля 2014

Я нашел довольно легкий обходной путь.

this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;

Это сделает текст одинакового размера независимо от размера автомасштабирования.

2 голосов
/ 03 ноября 2010

Я подозреваю, что вы уже пытались

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, как задумано: в этом есть некоторые странности, см. мой предыдущий пост здесь на SO .

2 голосов
/ 03 ноября 2010

Нет.GDI и Windows Forms зависят от разрешения.Наилучшим вариантом является создание макетов таким образом, чтобы они соответствующим образом масштабировались при изменении размера окна.Это также позволяет корректно работать с масштабированием размера шрифта, так как макеты будут корректироваться по мере необходимости.

Это, между прочим, одно из больших улучшений в WPF - оно разработано, чтобы быть независимым от разрешения.

1 голос
/ 04 июня 2014
  • В Windows 8.0, даже если для параметра «Шрифт» задано значение «Пиксель», а для параметра «Масштабирование» задано значение «Нет», автоматически масштабируется .
  • В Windows 7 это же приложение не имеет автоматического масштабирования.

Таким образом, единственный способ не разрешить автоматическое масштабирование текста в Windows 7 - это установить единицу шрифта как пиксель, а свойство автоматического масштабирования окна - как ноль.

А в Windows 8.0, я полагаю, у вас нет другого выбора, кроме как установить dpi на dpi компьютера разработчика и попросить пользователя никогда его не изменять!

1 голос
/ 03 ноября 2010

Идти вразрез с пожеланиями пользователя, как это не то, что MS охотно приспосабливает.

Вместо того, чтобы исправить симптом (ваше приложение не масштабируется правильно), разве не будет так быстро решить проблему?Когда пользователь выбирает более крупные шрифты, обычно это происходит потому, что им нужны большие буквы, чтобы их можно было прочитать;поэтому правильное масштабирование важнее, чем отсутствие масштабирования и его неразборчивость для пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...