C # Масштабирование содержимого UserControl в соответствии с размерами шрифта / размера пользователя - PullRequest
9 голосов
/ 21 февраля 2009

Как я могу заставить свой OwnerDrawn UserControl учитывать dpi пользователей (96/120 / xxx) и / или размер шрифта (обычный, большой, очень большой)?

Некоторые люди предлагают использовать свойства DpiX и DpiY для графического объекта, но это не похоже ни на что в моем контроле (т.е. они всегда установлены на 96, независимо от того, какой размер шрифта или dpi я выберу) .

Здесь, в StackOverflow, есть еще один аналогичный вопрос, в котором предлагается использовать свойства AutoScale, но предлагаемые решения на самом деле тоже ничего не делают.

Нет ли способа сделать это в .NET, кроме как полагаться на WPF?

Ответы [ 2 ]

11 голосов
/ 19 августа 2009

Вам необходимо установить для свойства AutoScaleMode элемента UserControl значение AutoScaleMode.Dpi, а для not установить для свойства AutoScale значение true. Если вы это сделаете, он сбросит AutoScaleMode обратно на None. Свойство AutoScale устарело и используется только для обратной совместимости (см. Важное примечание в этой статье MSDN ).

Кроме того, в Windows Vista / 7, если вы явно не укажете, что ваше приложение поддерживает DPI, Windows будет эмулировать среду DPI по умолчанию, чтобы ваше приложение отображало с разрешением 96 DPI, а затем масштабировать результирующее растровое изображение до соответствующего размера. Чтобы избежать этого, вы можете изменить манифест своего приложения, чтобы сообщить Windows, что вы на самом деле осведомлены о DPI - см. Использование манифеста для объявления о DPI DPI в этой статье .

3 голосов
/ 04 августа 2009

У меня та же проблема, я пытался использовать GetDC + GetDeviceCaps + ReleaseDC, за исключением использования Графика работала, по крайней мере на Vista32. У меня пока нет опыта работы с DPI, но никто не ответил на это, и, по крайней мере, это может быть полезно для других.

Извлечение Создание приложения с поддержкой DPI . Это упоминание, почему оно всегда может возвращать 96 независимо от фактической настройки DPI.

Цитата сверху ссылка:

Масштабирование DPI в приложении Win32

В приложениях Win32 выполните следующие действия:

  • Используйте функцию SetProcessDPIAware для отмены масштабирования точек на дюйм.
  • При определении размеров нарисованных элементов интерфейса используйте физические измерения, например, сантиметры. Используя физические размеры, а не пиксели, вы обеспечиваете единообразный размер для всех типов дисплеев.
  • Чтобы получить настройку dpi системы, используйте функцию CDC :: GetDeviceCaps с флагом LOGPIXELSX. Если вы не отмените масштабирование точек на дюйм, этот вызов возвращает значение по умолчанию 96 точек на дюйм.
  • Используйте функцию GetSystemMetrics для получения предпочтительных размеров элементов пользовательского интерфейса, таких как границы окна. Когда масштабирование dpi отключено, значения измерений, которые возвращаются для элементов интерфейса, масштабируются до выбранной настройки dpi. Если активно масштабирование точек на дюйм, функция возвращает измерения на основе 96 точек на дюйм, независимо от настройки системного разрешения.

Ответ от: О проблеме DPI

Пример кода, переписанный с с использованием -статем ( исходный источник ):

float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
    dpiX = graphics.DpiX;
    dpiY = graphics.DpiY;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...