Автоматическое масштабирование в Windows FormsAutomatic scaling in Windows Forms

Автоматическое масштабирование позволяет форме и ее элементам управления, разработанным на одном компьютере с использованием определенного разрешения или системных шрифтов, правильно отображаться на другом компьютере с другим разрешением или системным шрифтом.Automatic scaling enables a form and its controls, designed on one machine with a certain display resolution or system font, to be displayed appropriately on another machine with a different display resolution or system font. Оно гарантирует, что размеры формы и ее элементов управления будут изменяться автоматически в соответствии с приложениями Windows и другими приложениями на компьютерах пользователя и разработчика.It assures that the form and its controls will intelligently resize to be consistent with native windows and other applications on both the users' and other developers' machines. Поддержка платформы .NET Framework для автоматического масштабирования и стили оформления позволяет приложениям .NET Framework для обеспечения согласованного внешнего вида и поведения по сравнению с обычными приложениями Windows на компьютере каждого пользователя.The support of the .NET Framework for automatic scaling and visual styles enables .NET Framework applications to maintain a consistent look and feel when compared to native Windows applications on each user's machine.

В большинстве случаев автоматического масштабирования работает как ожидалось в .NET Framework версии 2.0 и более поздних.For the most part, automatic scaling works as expected in .NET Framework version 2.0 and later. Однако внесение изменений в схему шрифтов может быть проблематичным.However, font scheme changes can be problematic. Пример того, как устранить эту проблему, см. в разделе как: Реагирование на изменения схемы шрифтов в приложении Windows Forms.For an example of how to resolve this, see How to: Respond to Font Scheme Changes in a Windows Forms Application.

Необходимость автоматического масштабированияNeed for automatic scaling

Без автоматического масштабирования приложения, разработанные для определенного разрешения экрана или шрифта, будут выглядеть либо слишком маленькими, либо слишком большими при изменении разрешения или шрифта.Without automatic scaling, an application designed for one display resolution or font will either appear too small or too large when that resolution or font is changed. Например, если приложение разработано с использованием базового шрифта Tahoma размером 9 пунктов, то без коррекции оно будет выглядеть слишком маленьким при запуске на компьютере, на котором в качестве системного шрифта используется Tahoma размером 12 пунктов.For example, if the application is designed using Tahoma 9 point as a baseline, without adjustment it will appear too small if run on a machine where the system font is Tahoma 12 point. Текстовые элементы, такие как заголовки, меню, содержимое текстовых полей и т. д., будут меньше, чем в других приложениях.Text elements, such as titles, menus, text box contents, and so on will render smaller than other applications. Более того, размер содержащих текст элементов пользовательского интерфейса, таких как строки заголовков, меню и т. д., зависит от используемого шрифта.Furthermore, the size of user interface (UI) elements that contain text, such as the title bar, menus, and many controls are dependent on the font used. В рассматриваемом примере эти элементы также будут выглядеть относительно меньше.In this example, these elements will also appear relatively smaller.

Аналогичная ситуация возникает, когда приложение разработано для определенного разрешения экрана.An analogous situation occurs when an application is designed for a certain display resolution. Наиболее частое разрешение экрана — 96 точек на дюйм (DPI), который равен 100% масштаб отображения, но выше отображает разрешение поддержкой 125%, 150%, 200% (какие соответственно равен 120, 144 и 192 DPI) и более поздних версий более распространенными становятся.The most common display resolution is 96 dots per inch (DPI), which equals 100% display scaling, but higher resolution displays supporting 125%, 150%, 200% (which respectively equal 120, 144 and 192 DPI) and above are becoming more common. Без коррекции приложение, особенно графическое, разработанное для одного разрешения, будет отображаться либо слишком большим, либо слишком маленьким при запуске с другим разрешением.Without adjustment, an application, especially a graphics-based one, designed for one resolution will appear either too large or too small when run at another resolution.

Автоматическое масштабирование предназначено для решения таких проблем путем автоматического изменения размеров формы и ее дочерних элементов управления согласно относительному размеру шрифтов и разрешению экрана.Automatic scaling seeks to ameliorate these problems by automatically resizing the form and its child controls according to the relative font size or display resolution. Операционная система Windows поддерживает автоматическое масштабирование диалоговых окон с помощью относительной единицы измерения, называемой единицей размера диалогового окна.The Windows operating system supports automatic scaling of dialog boxes using a relative unit of measurement called dialog units. Единица размера диалогового окна основана на системном шрифте, а ее связь с пикселями можно определить с помощью функции GetDialogBaseUnits пакета Win32 SDK.A dialog unit is based on the system font and its relationship to pixels can be determined though the Win32 SDK function GetDialogBaseUnits. При изменении темы, используемой Windows, все диалоговые окна автоматически настраиваются соответствующим образом.When a user changes the theme used by Windows, all dialog boxes are automatically adjusted accordingly. Кроме того платформа .NET Framework поддерживает автоматическое масштабирование в соответствии со стандартным системным шрифтом или разрешением экрана.In addition, the .NET Framework supports automatic scaling either according to the default system font or the display resolution. При необходимости автоматическое масштабирование можно отключить в приложении.Optionally, automatic scaling can be disabled in an application.

Исходная поддержка автоматического масштабированияOriginal support for automatic scaling

Версии 1.0 и 1.1 в .NET Framework поддерживается автоматическое масштабирование простым способом и зависело от шрифта Windows по умолчанию для интерфейса пользователя, представленного в Win32 SDK значением DEFAULT_GUI_FONT.Versions 1.0 and 1.1 of the .NET Framework supported automatic scaling in a straightforward manner that was dependent on the Windows default font used for the UI, represented by the Win32 SDK value DEFAULT_GUI_FONT. Обычно этот шрифт изменяется только при изменении разрешения экрана.This font is typically only changed when the display resolution changes. Для реализации автоматического масштабирования применялся описанный ниже механизм.The following mechanism was used to implement automatic scaling:

  1. Во время разработки свойству AutoScaleBaseSize (которое теперь устарело) присваивалась высота и ширина системного шрифта по умолчанию на компьютере разработчика.At design time, the AutoScaleBaseSize property (which is now deprecated) was set to the height and width of the default system font on the developer's machine.

  2. Во время выполнения для инициализации свойства Font класса Form использовался стандартный системный шрифт компьютера пользователя.At runtime, the default system font of the user's machine was used to initialize the Font property of the Form class.

  3. Перед отображением формы вызывался метод ApplyAutoScaling для ее масштабирования.Before displaying the form, the ApplyAutoScaling method was called to scale the form. Этот метод вычислял относительный масштаб с помощью свойств AutoScaleBaseSize и Font, а затем вызывал метод Scale для масштабирования формы и ее дочерних элементов.This method calculated the relative scale sizes from AutoScaleBaseSize and Font then called the Scale method to actually scale the form and its children.

  4. Значение свойства AutoScaleBaseSize обновлялось таким образом, чтобы последующие вызовы ApplyAutoScaling не продолжали изменять размер формы.The value of AutoScaleBaseSize was updated so that subsequent calls to ApplyAutoScaling did not progressively resize the form.

Этого механизма было достаточно для большинства целей, но он имел ряд ограничений.While this mechanism was sufficient for most purposes, it suffered from the following limitations:

  • Так как AutoScaleBaseSize свойство представляет базовый размер шрифта в виде целочисленные значения, погрешности округления становились заметны, когда форма проходила через ряд разрешений.Since the AutoScaleBaseSize property represents the baseline font size as integer values, rounding errors occur that become evident when a form is cycled through multiple resolutions.

  • Автоматическое масштабирование было реализовано только в классе Form, но не в классе ContainerControl.Automatic scaling was implemented in only the Form class, not in the ContainerControl class. В результате пользовательский элемент управления масштабировался корректно, только если он был разработан с тем же разрешением, что и форма, и был помещен в форму во время разработки.As a result, user controls would scale correctly only when the user control was designed at the same resolution as the form, and it was placed in the form at design time.

  • Несколько разработчиков могли параллельно разрабатывать формы и их дочерние элементы управления, только если разрешение экрана на их компьютерах совпадало.Forms and their child controls could only be concurrently designed by multiple developers if their machine resolutions were the same. Аналогичным образом наследование форм зависело от разрешения родительской формы.Likewise it also made inheritance of a form dependent on the resolution associated with the parent form.

  • Он не совместим с новыми диспетчерами макетов, появившиеся в .NET Framework версии 2.0, такие как FlowLayoutPanel и TableLayoutPanel.It is not compatible with the newer layout managers introduced with the .NET Framework version 2.0, such as FlowLayoutPanel and TableLayoutPanel.

  • Он не поддерживает масштабирование непосредственно на основе разрешения отображения, которая необходима для совместимости с .NET Compact Framework.It did not support scaling based directly on the display resolution that is required for compatibility to the .NET Compact Framework.

Несмотря на то, что этот механизм сохранился в .NET Framework версии 2.0 для обеспечения обратной совместимости, он был заменен более надежный механизм масштабирования, описанным далее.Although this mechanism is preserved in the .NET Framework version 2.0 to maintain backward compatibility, it has been superseded by the more robust scaling mechanism described next. Как следствие, методы AutoScale, ApplyAutoScaling, AutoScaleBaseSize и некоторые перегрузки Scale помечены как устаревшие.As a consequence, the AutoScale, ApplyAutoScaling, AutoScaleBaseSize, and certain Scale overloads are marked as obsolete.

Примечание

Можно безопасно удалить ссылки на эти элементы, при обновлении старого кода в .NET Framework версии 2.0.You can safely delete references to these members when you upgrade your legacy code to the .NET Framework version 2.0.

Текущая поддержка автоматического масштабированияCurrent support for automatic scaling

В .NET Framework версии 2.0 обходит предыдущие ограничения путем введения следующих изменений в автоматическое масштабирование форм Windows:The .NET Framework version 2.0 surmounts previous limitations by introducing the following changes to the automatic scaling of Windows Forms:

  • Базовая поддержка масштабирования была перемещена в класс ContainerControl, чтобы формы, собственные составные элементы управления и пользовательские элементы управления получали единообразную поддержку масштабирования.Base support for scaling has been moved to the ContainerControl class so that forms, native composite controls and user controls all receive uniform scaling support. Были добавлены новые члены AutoScaleFactor, AutoScaleDimensions, AutoScaleMode и PerformAutoScale.The new members AutoScaleFactor, AutoScaleDimensions, AutoScaleMode and PerformAutoScale have been added.

  • Класс Control также имеет несколько новых членов, которые позволяют ему участвовать в масштабировании и поддерживать смешанное масштабирование в одной и той же форме.The Control class also has several new members that allow it to participate in scaling and to support mixed scaling on the same form. В частности, члены Scale, ScaleChildren и GetScaledBounds поддерживают масштабирование.Specifically the Scale, ScaleChildren, and GetScaledBounds members support scaling.

  • В дополнение к поддержке системного шрифта была добавлена поддержка масштабирования на основе разрешения экрана в соответствии со значениями перечисления AutoScaleMode.Support for scaling based upon the screen resolution has been added to complement system font support, as defined by the AutoScaleMode enumeration. Этот режим обеспечивает совместимость с автоматическим масштабированием, поддерживаемые платформой .NET Compact Framework, что упрощает миграцию приложений.This mode is compatible with automatic scaling supported by the .NET Compact Framework enabling easier application migration.

  • В реализацию автоматического масштабирования была добавлена совместимость с диспетчерами макетов, такими как FlowLayoutPanel и TableLayoutPanel.Compatibility with layout managers such as FlowLayoutPanel and TableLayoutPanel has been added to the implementation of automatic scaling.

  • Коэффициенты масштабирования теперь представляются в виде чисел с плавающей запятой, обычно с помощью структуры SizeF, что позволило практически устранить ошибки округления.Scaling factors are now represented as floating point values, typically using the SizeF structure, so that rounding errors have been practically eliminated.

Внимание!

Произвольные сочетания режимов масштабирования на основе разрешения экрана и размера шрифта не поддерживаются.Arbitrary mixtures of DPI and font scaling modes are not supported. Вы без всяких проблем можете масштабировать пользовательский элемент управления в одном режиме (например, на основе разрешения экрана) и поместить его в форму с помощью другого режима (на основе размера шрифта), но использование базовой формы в одном режиме и производной формы в другом может привести к непредвиденным результатам.Although you may scale a user control using one mode (for example, DPI) and place it on a form using another mode (Font) with no issues, but mixing a base form in one mode and a derived form in another can lead to unexpected results.

Автоматическое масштабирование в действииAutomatic scaling in action

В Windows Forms для автоматического масштабирования формы и ее содержимого теперь используется описанная ниже логика.Windows Forms now uses the following logic to automatically scale forms and their contents:

  1. Во время разработки каждый объект ContainerControl регистрирует режим масштабирования и его текущее разрешение в свойствах AutoScaleMode и AutoScaleDimensions соответственно.At design time, each ContainerControl records the scaling mode and it current resolution in the AutoScaleMode and AutoScaleDimensions, respectively.

  2. Во время выполнения фактическое разрешение хранится в свойстве CurrentAutoScaleDimensions.At run time, the actual resolution is stored in the CurrentAutoScaleDimensions property. Свойство AutoScaleFactor динамически вычисляет отношение между разрешением во время выполнения и разрешением во время разработки.The AutoScaleFactor property dynamically calculates the ratio between the run-time and design-time scaling resolution.

  3. Если при загрузке формы значения CurrentAutoScaleDimensions и AutoScaleDimensions различны, то для масштабирования элемента управления и его дочерних элементов вызывается метод PerformAutoScale.When the form loads, if the values of CurrentAutoScaleDimensions and AutoScaleDimensions are different, then the PerformAutoScale method is called to scale the control and its children. Этот метод приостанавливает размещение и вызывает метод Scale для выполнения фактического масштабирования.This method suspends layout and calls the Scale method to perform the actual scaling. Впоследствии значение AutoScaleDimensions обновляется во избежание прогрессивного масштабирования.Afterwards, the value of AutoScaleDimensions is updated to avoid progressive scaling.

  4. Метод PerformAutoScale также вызывается автоматически в перечисленных ниже ситуациях.PerformAutoScale is also automatically invoked in the following situations:

    • В ответ на событие OnFontChanged, если используется режим масштабирования Font.In response to the OnFontChanged event if the scaling mode is Font.

    • Если при возобновлении размещения элементов управления внутри контейнера обнаруживается изменение свойства AutoScaleDimensions или AutoScaleMode.When the layout of the container control resumes and a change is detected in the AutoScaleDimensions or AutoScaleMode properties.

    • При масштабировании родительского объекта ContainerControl, как указанно выше.As implied above, when a parent ContainerControl is being scaled. Каждый контейнерный элемент управления отвечает за масштабирование своих дочерних элементов с помощью своих собственных коэффициентов масштабирования, а не коэффициентов его родительского контейнера.Each container control is responsible for scaling its children using its own scaling factors and not the one from its parent container.

  5. Поведение дочерних элементов управления при масштабировании может изменяться несколькими способами.Child controls can modify their scaling behavior through several means:

    • Можно переопределить свойство ScaleChildren, чтобы указать, следует ли масштабировать дочерние элементы управления.The ScaleChildren property can be overridden to determine if their child controls should be scaled or not.

    • Можно переопределить метод GetScaledBounds для корректировки границ, до которых масштабируется элемент управления, но не логики масштабирования.The GetScaledBounds method can be overridden to adjust the bounds that the control is scaled to, but not the scaling logic.

    • Можно переопределить метод ScaleControl для изменения логики масштабирования текущего элемента управления.The ScaleControl method can be overridden to change the scaling logic for the current control.

См. такжеSee also