- Заметки из Зазеркалья
- В клиентских приложениях
- Сохранение масштаба
- Масштаб формы в конфигураторе
- Предварительный просмотр формы в масштабе
- Показ картинок
- Автоматическое масштабирование (Windows Forms .NET)
- Потребность в автоматическом масштабировании
- Автоматическое масштабирование в действии
- Автоматическое масштабирование в Windows Forms
- Потребность в автоматическом масштабировании
- Исходная поддержка автоматического масштабирования
- Текущая поддержка автоматического масштабирования
- Автоматическое масштабирование в действии
Заметки из Зазеркалья
Реализовано в версии 8.3.10.2168.
Мы реализовали механизм быстрого масштабирования форм. Большей частью он предназначен, конечно, для пользователей, но и разработчики могут его использовать, если в этом есть необходимость.
Мы считаем, что этот механизм будет удобен и полезен в тех случаях, когда нужно быстро и просто, или ненадолго и временно увеличить или уменьшить масштаб прикладных данных, отображаемых в форме.
Вы наверняка знаете, что можно увеличить шрифт, изменив разрешение экрана. И некоторое время тому назад мы дорабатывали платформенные механизмы для того, чтобы прикладные решения чётко и корректно отображались при разных разрешениях экрана (DPI). Но изменение DPI это относительно сложная и «фундаментальная» операция. Во-первых, не все пользователи обладают достаточными знаниями для её выполнения. А во-вторых, она влияет на все приложения, установленные на компьютере. Если нужно что-то увеличить или уменьшить только «здесь и сейчас», или если пользователи не обладают достаточной квалификацией, они не станут менять DPI.
В такой ситуации механизм быстрого масштабирования форм придётся очень кстати. Если пользователь не обладает хорошим зрением, он может легко сделать себе «покрупнее». А если зрение хорошее, но не вся таблица помещается по ширине в форму, можно сделать «помельче».
В клиентских приложениях
Для изменения масштаба управляемых форм и документов в клиентских приложениях можно использовать либо главное меню, либо команду из области системных команд:
Диалог установки масштаба открывается в правом верхнем углу, но вы можете переместить его в любое удобное вам место экрана:
Масштаб формы можно изменять в диапазоне от 50% до 400%. При этом не просто увеличивается или уменьшается размер шрифта и элементов, а вся форма перестраивается под новые размеры элементов.
Например, вы можете увеличить её до 200%.
Или наоборот, уменьшить до 70%.
Изменение масштаба выполняется на клиенте и не требует вызова сервера.
Масштабирование применяется только к содержимому формы. Системные панели, диалог избранного и диалог истории не масштабируются. Также не масштабируются рамки и полосы прокрутки внутри формы. Изменения размера этих элементов можно добиться путём изменения разрешения экрана (DPI).
Передвигая ползунок, вы изменяете масштаб для одной формы. Но если этот масштаб вы хотите применить ко всем формам, то для этого существует кнопка Установить для всех. Эта же кнопка поможет вам в любое время вернуть масштаб всех форм к 100%.
Несмотря на то, что мы заложили довольно большой диапазон изменения масштаба, мы не считаем, что весь он обязательно будет использоваться. По нашим оценкам пользователи, которые захотят применить эту возможность, слегка уменьшат все формы, до 90-95%, а некоторые формы наоборот слегка увеличат до 105-110%.
Сохранение масштаба
Масштабы хранятся для каждой формы отдельно в локальном хранилище на компьютере пользователя. Кроме этого там хранится общий масштаб для всех форм, который имеет стандартное значение 100%. При установке нового масштаба для всех форм, отдельные значения для каждой формы удаляются.
Масштаб формы в конфигураторе
В конфигураторе вы тоже можете задать масштаб, в котором форма будет показана пользователю. Для этого мы реализовали у формы свойство Масштаб. Это свойство мы рекомендуем использовать в тех случаях, в которых раньше вы использовали ВариантМасштаба: Компактный. Исходить нужно из того, что в компактном режиме масштаб формы равняется примерно 80%.
Предварительный просмотр формы в масштабе
В процессе редактирования формы в конфигураторе вы можете посмотреть, как она будет выглядеть в разных масштабах. В редакторе формы доступен выбор масштаба из нескольких фиксированных значений.
В результате форма, отображаемая в области предварительного просмотра, будет увеличена, например, до 150%.
Показ картинок
Для того чтобы увеличенные формы выглядели хорошо, необходимо иметь несколько вариантов одной и той же картинки, предназначенных для разных разрешений. Поэтому механизм вариантов картинок, который уже существует в мобильной платформе, мы расширили и на платформу для персональных компьютеров.
Теперь для отображения задаётся не одна картинка, а набор вариантов этой картинки в виде архива. В этом архиве есть варианты под разные разрешения и под разные варианты интерфейса. Для показа платформа подбирает вариант, подходящий под текущее DPI и масштаб формы.
Например, теперь картинка флажка это набор нескольких вариантов: для платформы 8.2 (обычный интерфейс), для платформы 8.3 (интерфейс Такси), для компактного режима, для разных масштабов.
Картинки, хранящиеся в конфигурации, тоже могут быть представлены в виде набора. Теперь для картинки вы можете задать не только плотность экрана (масштаб), но и вариант интерфейса, для которого будет использоваться картинка.
Источник
Автоматическое масштабирование (Windows Forms .NET)
Автоматическое масштабирование позволяет форме и ее элементам управления, разработанным на одном компьютере с использованием определенного разрешения или шрифтов, правильно отображаться на другом компьютере с другим разрешением или шрифтом. Оно гарантирует, что размеры формы и ее элементов управления будут изменяться автоматически в соответствии с приложениями Windows и другими приложениями на компьютерах пользователя и разработчика. Автоматическое масштабирование и стили оформления позволяют приложениям Windows Forms сохранять согласованный внешний вид и поведение на различных компьютерах пользователей, так же как в случае с обычными приложениями Windows.
В большинстве случаев автоматическое масштабирование работает должным образом в Windows Forms. Однако внесение изменений в схему шрифтов может быть проблематичным.
Документация для Руководства по рабочему столу по .NET 5 (и .NET Core) находится в разработке.
Потребность в автоматическом масштабировании
Без автоматического масштабирования приложения, разработанные для определенного разрешения экрана или шрифта, будут выглядеть либо слишком маленькими, либо слишком большими при изменении разрешения или шрифта. Например, если приложение разработано с использованием базового шрифта Tahoma размером 9 пунктов, то без коррекции оно будет выглядеть слишком маленьким при запуске на компьютере, на котором в качестве системного шрифта используется Tahoma размером 12 пунктов. Текстовые элементы, такие как заголовки, меню, содержимое текстовых полей и т. д., будут меньше, чем в других приложениях. Более того, размер содержащих текст элементов пользовательского интерфейса, таких как строки заголовков, меню и т. д., зависит от используемого шрифта. В рассматриваемом примере эти элементы также будут выглядеть относительно меньше.
Аналогичная ситуация возникает, когда приложение разработано для определенного разрешения экрана. Наиболее распространенное разрешение экрана — 96 точек на дюйм (DPI), что соответствует 100 % масштабирования экрана, однако все более распространенными становятся более высокие разрешения, включая 125 %, 150 %, 200 % (что соответствует 120, 144 и 192 DPI) и выше. Без коррекции приложение, особенно графическое, разработанное для одного разрешения, будет отображаться либо слишком большим, либо слишком маленьким при запуске с другим разрешением.
Автоматическое масштабирование предназначено для решения таких проблем путем автоматического изменения размеров формы и ее дочерних элементов управления согласно относительному размеру шрифтов и разрешению экрана. Операционная система Windows поддерживает автоматическое масштабирование диалоговых окон с помощью относительной единицы измерения, называемой единицей размера диалогового окна. Единица размера диалогового окна основана на системном шрифте, а ее связь с пикселями можно определить с помощью функции GetDialogBaseUnits пакета Win32 SDK. При изменении темы, используемой Windows, все диалоговые окна автоматически настраиваются соответствующим образом. Кроме того, в Windows Forms поддерживается автоматическое масштабирование в соответствии со стандартным системным шрифтом или разрешением экрана. При необходимости автоматическое масштабирование можно отключить в приложении.
Произвольные сочетания режимов масштабирования на основе разрешения экрана и размера шрифта не поддерживаются. Вы без всяких проблем можете масштабировать пользовательский элемент управления в одном режиме (например, на основе разрешения экрана) и поместить его в форму с помощью другого режима (на основе размера шрифта), но использование базовой формы в одном режиме и производной формы в другом может привести к непредвиденным результатам.
Автоматическое масштабирование в действии
В Windows Forms для автоматического масштабирования формы и ее содержимого используется описанная ниже логика.
Во время разработки каждый объект ContainerControl регистрирует режим масштабирования и его текущее разрешение в свойствах AutoScaleMode и AutoScaleDimensions соответственно.
Во время выполнения фактическое разрешение хранится в свойстве CurrentAutoScaleDimensions. Свойство AutoScaleFactor динамически вычисляет отношение между разрешением во время выполнения и разрешением во время разработки.
Если при загрузке формы значения CurrentAutoScaleDimensions и AutoScaleDimensions различны, то для масштабирования элемента управления и его дочерних элементов вызывается метод PerformAutoScale. Этот метод приостанавливает размещение и вызывает метод Scale для выполнения фактического масштабирования. Впоследствии значение AutoScaleDimensions обновляется во избежание прогрессивного масштабирования.
Метод PerformAutoScale также вызывается автоматически в перечисленных ниже ситуациях.
В ответ на событие OnFontChanged, если используется режим масштабирования Font.
Если при возобновлении размещения элементов управления внутри контейнера обнаруживается изменение свойства AutoScaleDimensions или AutoScaleMode.
При масштабировании родительского объекта ContainerControl, как указанно выше. Каждый контейнерный элемент управления отвечает за масштабирование своих дочерних элементов с помощью своих собственных коэффициентов масштабирования, а не коэффициентов его родительского контейнера.
Поведение дочерних элементов управления при масштабировании может изменяться несколькими способами.
Можно переопределить свойство ScaleChildren, чтобы указать, следует ли масштабировать дочерние элементы управления.
Можно переопределить метод GetScaledBounds для корректировки границ, до которых масштабируется элемент управления, но не логики масштабирования.
Можно переопределить метод ScaleControl для изменения логики масштабирования текущего элемента управления.
Источник
Автоматическое масштабирование в Windows Forms
Автоматическое масштабирование позволяет форме и ее элементам управления, разработанным на одном компьютере с использованием определенного разрешения или системных шрифтов, правильно отображаться на другом компьютере с другим разрешением или системным шрифтом. Оно гарантирует, что размеры формы и ее элементов управления будут изменяться автоматически в соответствии с приложениями Windows и другими приложениями на компьютерах пользователя и разработчика. поддержка платформа .NET Framework для автоматического масштабирования и визуальных стилей позволяет платформа .NET Framework приложениям поддерживать единообразный внешний вид и поведение по сравнению с собственными Windows приложениями на компьютере каждого пользователя.
в большинстве случаев автоматическое масштабирование работает правильно в платформа .NET Framework версии 2,0 и более поздних. Однако внесение изменений в схему шрифтов может быть проблематичным. пример решения этой проблемы см. в разделе как реагировать на изменения шрифтовой схемы в приложении Windows Forms.
Потребность в автоматическом масштабировании
Без автоматического масштабирования приложения, разработанные для определенного разрешения экрана или шрифта, будут выглядеть либо слишком маленькими, либо слишком большими при изменении разрешения или шрифта. Например, если приложение разработано с использованием базового шрифта Tahoma размером 9 пунктов, то без коррекции оно будет выглядеть слишком маленьким при запуске на компьютере, на котором в качестве системного шрифта используется Tahoma размером 12 пунктов. Текстовые элементы, такие как заголовки, меню, содержимое текстовых полей и т. д., будут меньше, чем в других приложениях. Более того, размер содержащих текст элементов пользовательского интерфейса, таких как строки заголовков, меню и т. д., зависит от используемого шрифта. В рассматриваемом примере эти элементы также будут выглядеть относительно меньше.
Аналогичная ситуация возникает, когда приложение разработано для определенного разрешения экрана. Наиболее распространенное разрешение экрана — 96 точек на дюйм (DPI), что соответствует 100 % масштабирования экрана, однако все более распространенными становятся более высокие разрешения, включая 125 %, 150 %, 200 % (что соответствует 120, 144 и 192 DPI) и выше. Без коррекции приложение, особенно графическое, разработанное для одного разрешения, будет отображаться либо слишком большим, либо слишком маленьким при запуске с другим разрешением.
Автоматическое масштабирование предназначено для решения таких проблем путем автоматического изменения размеров формы и ее дочерних элементов управления согласно относительному размеру шрифтов и разрешению экрана. Операционная система Windows поддерживает автоматическое масштабирование диалоговых окон с помощью относительной единицы измерения, называемой единицей размера диалогового окна. Единица размера диалогового окна основана на системном шрифте, а ее связь с пикселями можно определить с помощью функции GetDialogBaseUnits пакета Win32 SDK. При изменении темы, используемой Windows, все диалоговые окна автоматически настраиваются соответствующим образом. кроме того, платформа .NET Framework поддерживает автоматическое масштабирование в соответствии с системным шрифтом по умолчанию или разрешением экрана. При необходимости автоматическое масштабирование можно отключить в приложении.
Исходная поддержка автоматического масштабирования
версии 1,0 и 1,1 платформа .NET Framework поддерживали автоматическое масштабирование простым способом, который зависит от Windows шрифта по умолчанию, используемого для пользовательского интерфейса, представленного значением пакета SDK для Win32 DEFAULT_GUI_FONT. Обычно этот шрифт изменяется только при изменении разрешения экрана. Для реализации автоматического масштабирования применялся описанный ниже механизм.
Во время разработки свойству AutoScaleBaseSize (которое теперь устарело) присваивалась высота и ширина системного шрифта по умолчанию на компьютере разработчика.
Во время выполнения для инициализации свойства Font класса Form использовался стандартный системный шрифт компьютера пользователя.
Перед отображением формы вызывался метод ApplyAutoScaling для ее масштабирования. Этот метод вычислял относительный масштаб с помощью свойств AutoScaleBaseSize и Font, а затем вызывал метод Scale для масштабирования формы и ее дочерних элементов.
Значение свойства AutoScaleBaseSize обновлялось таким образом, чтобы последующие вызовы ApplyAutoScaling не продолжали изменять размер формы.
Этого механизма было достаточно для большинства целей, но он имел ряд ограничений.
Так как AutoScaleBaseSize свойство представляет базовый размер шрифта как целочисленные значения, возникают ошибки округления, которые становятся очевидными, когда форма циклически проходит несколько разрешений.
Автоматическое масштабирование было реализовано только в классе Form, но не в классе ContainerControl. В результате пользовательский элемент управления масштабировался корректно, только если он был разработан с тем же разрешением, что и форма, и был помещен в форму во время разработки.
Несколько разработчиков могли параллельно разрабатывать формы и их дочерние элементы управления, только если разрешение экрана на их компьютерах совпадало. Аналогичным образом наследование форм зависело от разрешения родительской формы.
он несовместим с новыми диспетчерами макетов, появившимися в платформа .NET Framework версии 2,0, например FlowLayoutPanel и TableLayoutPanel .
Он не поддерживал масштабирование непосредственно на основе разрешения экрана, необходимого для обеспечения совместимости с .NET Compact Framework.
хотя этот механизм сохранен в платформа .NET Framework версии 2,0 для обеспечения обратной совместимости, он был заменен более надежным механизмом масштабирования, описанным далее. Как следствие, методы AutoScale, ApplyAutoScaling, AutoScaleBaseSize и некоторые перегрузки Scale помечены как устаревшие.
вы можете безопасно удалить ссылки на эти члены при обновлении устаревшего кода до версии платформа .NET Framework 2,0.
Текущая поддержка автоматического масштабирования
платформа .NET Framework версии 2,0 сурмаунтс предыдущие ограничения путем внесения следующих изменений в автоматическое масштабирование Windows Forms:
Базовая поддержка масштабирования была перемещена в класс ContainerControl, чтобы формы, собственные составные элементы управления и пользовательские элементы управления получали единообразную поддержку масштабирования. Были добавлены новые члены AutoScaleFactor, AutoScaleDimensions, AutoScaleMode и PerformAutoScale.
Класс Control также имеет несколько новых членов, которые позволяют ему участвовать в масштабировании и поддерживать смешанное масштабирование в одной и той же форме. В частности, члены Scale, ScaleChildren и GetScaledBounds поддерживают масштабирование.
В дополнение к поддержке системного шрифта была добавлена поддержка масштабирования на основе разрешения экрана в соответствии со значениями перечисления AutoScaleMode. Этот режим совместим с автоматическим масштабированием, поддерживаемым .NET Compact Framework что позволяет упростить перенос приложений.
В реализацию автоматического масштабирования была добавлена совместимость с диспетчерами макетов, такими как FlowLayoutPanel и TableLayoutPanel.
Коэффициенты масштабирования теперь представляются в виде чисел с плавающей запятой, обычно с помощью структуры SizeF, что позволило практически устранить ошибки округления.
Произвольные сочетания режимов масштабирования на основе разрешения экрана и размера шрифта не поддерживаются. Вы без всяких проблем можете масштабировать пользовательский элемент управления в одном режиме (например, на основе разрешения экрана) и поместить его в форму с помощью другого режима (на основе размера шрифта), но использование базовой формы в одном режиме и производной формы в другом может привести к непредвиденным результатам.
Автоматическое масштабирование в действии
В Windows Forms для автоматического масштабирования формы и ее содержимого теперь используется описанная ниже логика.
Во время разработки каждый объект ContainerControl регистрирует режим масштабирования и его текущее разрешение в свойствах AutoScaleMode и AutoScaleDimensions соответственно.
Во время выполнения фактическое разрешение хранится в свойстве CurrentAutoScaleDimensions. Свойство AutoScaleFactor динамически вычисляет отношение между разрешением во время выполнения и разрешением во время разработки.
Если при загрузке формы значения CurrentAutoScaleDimensions и AutoScaleDimensions различны, то для масштабирования элемента управления и его дочерних элементов вызывается метод PerformAutoScale. Этот метод приостанавливает размещение и вызывает метод Scale для выполнения фактического масштабирования. Впоследствии значение AutoScaleDimensions обновляется во избежание прогрессивного масштабирования.
Метод PerformAutoScale также вызывается автоматически в перечисленных ниже ситуациях.
В ответ на событие OnFontChanged, если используется режим масштабирования Font.
Если при возобновлении размещения элементов управления внутри контейнера обнаруживается изменение свойства AutoScaleDimensions или AutoScaleMode.
При масштабировании родительского объекта ContainerControl, как указанно выше. Каждый контейнерный элемент управления отвечает за масштабирование своих дочерних элементов с помощью своих собственных коэффициентов масштабирования, а не коэффициентов его родительского контейнера.
Поведение дочерних элементов управления при масштабировании может изменяться несколькими способами.
Можно переопределить свойство ScaleChildren, чтобы указать, следует ли масштабировать дочерние элементы управления.
Можно переопределить метод GetScaledBounds для корректировки границ, до которых масштабируется элемент управления, но не логики масштабирования.
Можно переопределить метод ScaleControl для изменения логики масштабирования текущего элемента управления.
Источник