Работа с гарнитурами и размерами шрифтов

We use cookies. Read the Privacy and Cookie Policy

Работа с гарнитурами и размерами шрифтов

Давайте теперь построим более сложное приложение. Позволяющее пользователю манипулировать объектом Font, поддерживаемым формой. Это приложение предоставит пользователю возможность указать гарнитуру шрифта, используя встроенный набор гарнитур, доступный путем выбора Сервис?Гарнитура из меню. Пользователю также будет позволено косвенно управлять размером объекта Font с помощью объекта Timer Windows Forms. Если пользователь активизирует Timer, выбрав из меню Сервис?Рост?, то размер объекта Font начнет увеличиваться (до максимального верхнего предела) через регулярные интервалы времени. При этом отображаемый текст будет постепенно увеличиваться, что обеспечит анимационный эффект "живого текста". Наконец, третий элемент меню Сервис будет называтъся Список шрифтов и показывать список всех шрифтов, установленных на машине конечного пользователя. На рис. 20.9 демонстрируется логика меню, о котором идет речь.

Рис. 20.9. Меню проекта FontApp

Чтобы начать реализацию приложения, добавьте в форму член Timer (с именем swellTimer), строку (strFontFace) для представления текущего названия гарнитуры шрифта и целое число (swellValue) для представления величины корректировки для размера шрифта. В окне проектирования формы сконфигурируйте Timer так, чтобы он генерировал событие Tick каждые 100 миллисекунд.

public partial class MainForm: Form {

 private Timer swellTimer = new Timer();

 private int swellValue;

 private string strFontFace = "WingDings";

 public MainForm() {

  InitializeComponent();

  BackColor = Color.Honeydew;

  CenterToScreen();

  // Конфигурация таймера.

  swellTimer.Enabled = true;

  swellTimer.Interval = 100;

  swellTimer.Tick += new EventHandler(swellTimerTick);

 }

}

В обработчике события Tick увеличьте значение члена swellValue на 5. Напомним, что целое число swellValue будет добавляться к текущему размеру шрифта, чтобы обеспечивался простой эффект анимации (предполагается, что swellValue будет ограничено сверху максимальным значением 50). Чтобы не допустить мерцания, которое может происходить при перерисовке всей области клиента, при вызове Invalidate() будет обновляться только верхняя прямоугольная область формы.

private void swellTimer Tick(object sender, EventArgs e) {

 // Увеличение текущего значения swellValue на 5.

 swellValue += 5;

 // Если значение больше или равно 50, сбросить его в ноль.

 if (swellValue ›= 50) swellValue = 0;

 // Обновление минимальной области для уменьшения мерцания.

 Invalidate(new Rectangle(0, 0, ClientRectangle.Width, 100));

}

Теперь, когда с каждым циклом Timer обновляются верхние 100 пикселей области клиента, нужно найти что-нибудь подходящее для визуализации. В обработчике Paint формы создайте объект Font на основе выбранной пользователем гарнитуры шрифта (она выбирается с помощью соответствующего пункта меню) и текущего значения swellValue (оно задается таймером Timer), Настроив объект Font, поместите сообщение в центр соответствующего прямоугольника.

private void MainForm Paint(object sender, PaintEventArgs e) {

 Graphics g = e.Graphics;

 // Размер шрифта должен находиться в диапазоне от 12 до 62,

 // в зависимости от swellValue.

 Font theFont = new Font(strFontFace, 12 + swellValue);

 string message = "Привет GDI+";

 // Вывод сообщения в центре прямоугольника.

 float windowCenter = this.DisplayRectangle.Width/2;

 SizeF stringSize = g.Measure.String(message, theFont);

 float startPos = windowCenter – (stringSize.Width/2);

 g.Drawstring(message, theFont, new SolidBrush(Color.Blue), startPos, 10);

}

Легко догадаться, что при выборе пользователем конкретной гарнитуры шрифта обработчик Clicked для соответствующего варианта выбора из меню должен обновить строковую переменную fontFace и перерисовать область клиента, например:

private void arialToolStripMenuItem_Click(object sender, EventArgs e) {

 strFontFace = "Arial";

 Invalidate();

}

Обработчик Click для пункта меню Рост? будет использоваться для запуска и остановки процесса увеличения текста (т.е. для разрешения и отключения анимаций). Здесь используйте свойство Enabled объекта Timer так, как показано ниже.

private void swellToolStripMenuItem_Click(object sender, EventArgs e) {

 swellTimer.Enabled = !swellTimer.Enabled;

}