Масштабирование C# содержание UserControl для соответствия пользовательским точкам на дюйм/размеру шрифта

Единственная реальная альтернатива здесь должна использовать своего рода пользовательский виджет с модальной опцией. Взгляните на jQuery UI для примера диалогового окна с этими функциями. Подобные вещи существуют в примерно каждой платформе JS, которую можно упомянуть.

9
задан 21 February 2009 в 11:20
поделиться

2 ответа

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

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

Цитата из приведенной выше ссылки:

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

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

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

Ответил от: О проблеме с разрешением DPI

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

float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
    dpiX = graphics.DpiX;
    dpiY = graphics.DpiY;
}
3
ответ дан 4 December 2019 в 14:32
поделиться

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

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

11
ответ дан 4 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: