C # WinForms отключить масштабирование DPI - PullRequest
8 голосов
/ 24 октября 2010

У меня есть приложение WinForm, которое содержит много изображений.Когда я размещаю приложение на машинах Win7 с DPI, равным 120, оно полностью портит внешний вид формы.Есть ли способ отключить масштабирование для моей формы?

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

Ответы [ 3 ]

11 голосов
/ 24 октября 2010

У вас будут большие проблемы при изменении свойства AutoScaleMode. Увеличение DPI также меняет размер системного шрифта. Обязательно, размеры шрифта выражаются в точках, 1/72 дюйма. Шрифты должны быть больше, чтобы получить одинаковый размер точек при увеличении DPI и сохранять текст таким же удобным для чтения при просмотре с одинакового расстояния.

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

Да, фоновые изображения необходимо масштабировать, чтобы они соответствовали большему элементу управления или форме. Пиксель на изображении больше не отображается один на один с пикселем монитора. Значение Graphics.InterpolationMode по умолчанию выполняет довольно приличную работу по фильтрации изображения. Но это зависит от вида изображения, насколько хорошо это получается. Фотография почти всегда очень хорошо масштабируется. Мелко детализированные штриховые рисунки и текст не имеют. Выбор правильного вида изображения помогает избежать необходимости создавать отдельные изображения.

Эта проблема не исчезнет до тех пор, пока мониторы не начнут иметь разрешение, которое есть у принтера. Мы все еще далеки от 600 точек на дюйм для настольных мониторов. Телефоны будут первыми.

5 голосов
/ 02 июля 2014

Добавление одной строки кода до того, как автоматически сгенерированный вызов InitializeComponent в конструкторе Form1 решил это за меня:

public partial class Form1 : Form
{
    public Form1()
    {
        // Make the GUI ignore the DPI setting
        Font = new Font(Font.Name, 8.25f * 96f / CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont);
        InitializeComponent();
    }
}
3 голосов
/ 24 октября 2010

Для свойства AutoScaleMode формы можно установить значение None.

...