Вопросы о шрифтах Windows, часть 2 - PullRequest
0 голосов
/ 01 марта 2011

Перейти к моему предыдущему вопросу ( ссылка )

Что делать, если я хочу назначить шрифт нового пользовательского элемента управления шрифту его создателя. Должен ли я сделать это а):

newControl = new MyControl(...);
...    
newControl.Font = this.Font;

или это б)?

newControl = new MyControl(...);
...
newControl.Font = (Font)this.Font.Clone();

Если ответ а), что произойдет со шрифтом нового пользовательского элемента управления, если будет удален шрифт создателя (например, окно, закрытое пользователем)?

Спасибо

Gilbert

Ответы [ 2 ]

0 голосов
/ 05 декабря 2013

Класс Font фактически инкапсулирует две вещи:

  • Стиль текста

  • дескриптор GDI, который можно использовать для рисования текста с этим стилем

Стиль текста, инкапсулированный классом Font, является неизменным; дескриптор является «одноразовым неизменяемым», это означает, что он никогда не будет инкапсулировать любой дескриптор GDI, кроме того, с которым он был создан, но после удаления Font он перестанет инкапсулировать любой дескриптор шрифта (он становится действительно неизменным, хотя и бесполезно, в этот момент).

Установка свойства Font элементов управления в Framework приведет к захвату двух вещей:

  • Идентификатор объекта Font, который используется для установки свойства, который используется исключительно объектом получения Font свойства

  • Стиль текста, который элемент управления будет использовать для создания своего собственного Font объекта.

Поскольку каждый элемент управления Framework по своей природе клонирует любой экземпляр Font, используемый для установки его свойства Font, обычно пользовательскому коду не нужно клонировать шрифт перед его использованием для установки свойства Font другого элемента управления.

0 голосов
/ 01 марта 2011

Если вы пытаетесь обеспечить постоянный внешний вид вашего приложения ... например, все метки, использующие шрифт X, размер Y, цвет Z во всех ваших формах, я бы определил свой собственный класс из метки и объявилэти элементы с вызовами GETTER только для чтения и без SETTER.Это предотвратит дизайнер даже от сериализации такой информации.Таким образом, вы меняете информацию о шрифте ОДИН РАЗ в своем корневом классе, и все места, где используется ваша метка, будут принудительно применены к шрифту.Возможно, вам придется настроить выравнивания на основе изменений, но все визуальные аспекты останутся.Кроме того, я сделал это с помощью текстового поля, комбинированного списка, многострочного текстового поля, кнопок и флажков.Работает отлично.Поэтому, когда я запускал данные элементы только для чтения, при сборке приложения возникало множество ошибок, связанных со свойствами только для чтения.Итак, я бы быстро просмотрел и удалил сериализованные элементы конструктора и очистил их.Работает как шарм.Если это то, что вы хотите сделать, я могу предложить больше примеров кода о том, как я его реализовал.

...