Подтвердить что ты не робот

Как заставить приложение winform С# игнорировать, когда пользователь выбирает 125% или 150% для размера шрифта ОС?

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

Возможно ли это?

4b9b3361

Ответ 1

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

        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)));

Вышеуказанные 2 строки копируются из моего файла BaseForm.Designer.cs, но в основном я нашел 2 простых шага, чтобы получить "масштабирование шрифтов":

  • Установите AutoScaleMode в None

  • Используйте "Pixel" в качестве типа блока для всех шрифтов вместо значения по умолчанию

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

Ответ 2

Проблема заключается в том, что свойство Font формы или элемента управления задает размер шрифта в точках. Это измерение, которое влияет на высоту букв при изменении настройки 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);
    }

Ответ 3

Я нашел довольно легкое решение.

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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/ вы найдете ссылку, как изменить размер шрифта элемента управления, особенно если вы хотите использовать фиксированный пиксель размер. Я думаю, что с помощью этих инструментов вы можете подключить их самостоятельно.

EDIT: не забудьте сказать: если вы, наконец, не будете игнорировать размер шрифта ОС и использовать AutoScaleMode, как предполагалось: у этого есть некоторые причуды, см. мой предыдущий пост здесь на SO.

Ответ 7

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

  • В Windows 8.0, даже если вы установите Font Unit как Pixel, при установке AutoScaling на None, это автоматическое масштабирование.
  • В Windows 7 это приложение не является автоматическим масштабированием.

Таким образом, единственный способ не позволить вашему автоматическому масштабированию текста в Windows 7 установить значение Font Unit как Pixel и свойство AutoScaling Window как None. И в Windows 8.0, я думаю, у вас нет другого выбора, кроме как установить dpi на dpi на машине разработчика и попросить пользователя никогда не изменять его!