2009-02-21 3 views
9

Как я могу заставить UserControl моего владельцаDrawn уважать dpi пользователей (96/120/xxx) и/или размер шрифта (обычный, большой, очень большой)?C# Масштабирование содержимого UserControl для соответствия пользователям Размер Dpi/Font

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

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

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

ответ

3

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

Отъезд Creating a DPI-Aware Application. Это упоминание о том, почему он всегда может вернуть 96 независимо от фактической настройки DPI.

Цитата выше ссылке:

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

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

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

Ответил от: About DPI Issue

Пример кода переписан с использованием -statement (original source):

float dpiX = 96, dpiY = 96; 
using(Graphics graphics = this.CreateGraphics()) 
{ 
    dpiX = graphics.DpiX; 
    dpiY = graphics.DpiY; 
} 
11

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

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