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

У меня есть несколько пользовательских элементов управления в форме окна. Интересно

  1. если я установлю свойство Font главной формы, получит ли его дочерний элемент a) копию нового Font, или b) ссылку на новое Font, или c) ничего

  2. Нужно ли удалять шрифт? Например, могу ли я безопасно выполнить следующий код?

    form.Font = новый шрифт (...);

  3. Будет ли шрифт автоматически удаляться при удалении родительского элемента (Form или UserControl)?

Спасибо
Gilbert

Ответы [ 4 ]

4 голосов
/ 01 марта 2011
  1. Оба. Свойство Font является собственным объектом .NET. Winforms, однако, кэшируют родной шрифт Windows, их создание довольно дорого. Объект оболочки .NET довольно маленький.

  2. Да. Код в порядке, установщик свойства Font уже располагает ранее назначенным шрифтом.

  3. Да, он удаляется с помощью UserControl. Который в свою очередь автоматически удаляется своим родителем.

1 голос
/ 21 февраля 2014
  1. Когда установлено свойство Font главной формы, его дочерние элементы управления не получают ни глубокой копии объекта System.Drawing.Font, ни ссылки на него. При назначении родительская форма создает дескриптор неуправляемого объекта шрифта. Все дочерние элементы управления подписаны на событие FontChanged у родителей, поэтому у них есть возможность получить этот дескриптор и использовать его позже для визуализации текста. Font свойство get элемента управления возвращает родительский шрифт, если свойство Font элемента управления не было установлено явно (или шрифт по умолчанию).
  2. Windows Forms делает то, что логически ожидается с любым другим свойством: когда вы присваиваете объект System.Drawing.Font для свойства Font элемента управления, ранее назначенный объект System.Drawing.Font завершается и собирает мусор, если больше нет ссылок на это остается в вашем приложении. Так что да, вы можете сделать это безопасно.
  3. System.Drawing.Font, присвоенный свойству Font элемента управления, НЕ удаляется при удалении элемента управления, или другому свойству System.Drawing.Font назначается свойство Font. Таким образом, вы можете создать один объект System.Drawing.Font и назначить его нескольким элементам управления, которые создаются и удаляются динамически. Вы также можете создавать несколько шрифтов и периодически назначать их элементу управления для создания визуальных эффектов. Внутренние дескрипторы неуправляемых шрифтов управляются Windows Forms.
0 голосов
/ 01 марта 2011

Из того, что я могу сказать, свойство Font элемента управления используется для определения параметров шрифта, используемых при рисовании элемента управления, но шрифт GDI, связанный с этим свойством, не используется для рисования.Элемент управления не будет заботиться о том, что шрифт, назначенный его свойству Font, удаляется после его назначения или даже до его назначения.Элемент управления явно способен использовать некоторые скрытые аспекты объекта Font, доступные даже после его удаления, для определения соответствующих атрибутов шрифта, но я не знаю, использует ли он

  1. предоставленный объект Font, если он не удален, либо создает собственный временный объект шрифта каждый раз, когда ему нужно что-то нарисовать, и сразу же удаляет временный объект.
  2. Использует предоставленный объект Font, если он не удален, или создает свой собственный частный объект шрифта, который он будет удалять при переназначении свойства Font или удалении элемента управления.
  3. Копирует семейство шрифтов, размер и т. Д. Из объекта Font, когда присваивается свойство Font, и выполняет все с его частными временными или постоянными объектами Font, которые он создает сам.
  4. Копирует семейство шрифтов, размер и т. Д. Из назначенного объекта Font всякий раз, когда необходимо что-то нарисовать.

Элемент управления, безусловно, сохраняет ссылку на переданный объект шрифта, если только по какой-либо другой причине, кроме как передать его получателю свойства Font.Однако я понятия не имею, лучше ли располагать шрифт после его присвоения, или лучше сохранить копию шрифта в форме и утилизировать ее при удалении самой формы.

0 голосов
/ 01 марта 2011
  1. Если дочерняя форма уже открыта, нет, она не получит копию.
    • Чтобы немного расширить это, если дочерняя форма наследует родительский шрифт.Не думаю, что изменение родительского шрифта повлияет на дочерний шрифт после того, как окно уже открыто.
  2. Сборщик мусора должен позаботиться об этом..
...