🎨 Графическое программирование на C#

← Вернуться к модулю 2

Урок 2.7: Текст и шрифты

Модуль 2 ⏱️ ~1.5 часа

📌 Ключевые моменты этого урока:

  • Font определяет шрифт (название, размер, стиль)
  • Размер шрифта указывается в пунктах (points) = 1/72 дюйма
  • DrawString рисует текст (вместо других примитивов)
  • StringFormat контролирует форматирование текста
  • MeasureString показывает размер текста перед рисованием
  • TextAlign влияет на то, как выравнивается текст
  • Нужно вызывать Dispose() на созданных Font'ах

Font — определение внешнего вида текста

Font определяет шрифт для рисования текста. Включает название, размер, стиль (жирный, курсив и т.д.).

Создание шрифта:

// Простой шрифт (семейство и размер)
Font font1 = new Font("Arial", 12);

// Со стилем (Bold, Italic и т.д.)
Font font2 = new Font("Times New Roman", 16, FontStyle.Bold);
Font font3 = new Font("Courier New", 14, FontStyle.Italic);

// Комбинирование стилей
Font font4 = new Font("Arial", 12, FontStyle.Bold | FontStyle.Underline);

// Системный шрифт (берет из Windows)
Font systemFont = SystemFonts.DefaultFont;
Font messageBoxFont = SystemFonts.MessageBoxFont;

Доступные семейства шрифтов:

Некоторые стандартные шрифты, которые есть почти на каждом Windows:

  • Arial — читаемый, без засечек (Sans-Serif)
  • Times New Roman — классический, с засечками (Serif)
  • Courier New — моноширинный (для кода)
  • Calibri, Segoe UI — современные Windows шрифты
  • Comic Sans MS — забавный, неформальный

FontStyle (стили):

// Отдельные стили
FontStyle.Regular;                                    // Обычный текст
FontStyle.Bold;                                       // Толстый (жирный)
FontStyle.Italic;                                     // Наклонный
FontStyle.Underline;                                 // Подчеркнутый
FontStyle.Strikeout;                                 // Зачеркнутый

// Комбинирование (используйте |)
var boldItalic = FontStyle.Bold | FontStyle.Italic;
var boldUnderline = FontStyle.Bold | FontStyle.Underline;
var allThree = FontStyle.Bold | FontStyle.Italic | FontStyle.Underline;

Размер шрифта (в пунктах):

Размер указывается в типографических пунктах, где 1 дюйм = 72 пункта:

Размеры шрифтов

Размеры шрифтов в пунктах

DrawString — рисование текста

Простое рисование:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Font font = new Font("Arial", 12);
    
    // Рисование текста в поинте (10, 10)
    g.DrawString("Привет, мир!", font, Brushes.Black, 10, 10);
    
    // С использованием Point
    g.DrawString("Еще текст", font, Brushes.Blue, new PointF(50, 50));
}

Рисование в прямоугольнике (ограничение):

Текст может быть ограничен прямоугольником и автоматически переноситься на новую строку:

Rectangle textBox = new Rectangle(10, 10, 200, 100);

// Текст будет переноситься внутри этого прямоугольника
string longText = "Это длинный текст, который будет автоматически перенесен на новую строку внутри прямоугольника.";

g.DrawString(longText, font, Brushes.Black, textBox);

// Рисуем границу прямоугольника для наглядности
g.DrawRectangle(Pens.Gray, textBox);

StringFormat — форматирование текста

Выравнивание по горизонтали:

StringFormat format = new StringFormat();

// Слева (по умолчанию)
format.Alignment = StringAlignment.Near;    // ←──────────────
g.DrawString("Слева", font, Brushes.Black, rect, format);

// По центру
format.Alignment = StringAlignment.Center;  // ────←────────
g.DrawString("По центру", font, Brushes.Black, rect, format);

// Справа
format.Alignment = StringAlignment.Far;     // ──────────────→
g.DrawString("Слева", font, Brushes.Black, rect, format);

Выравнивание по вертикали:

StringFormat format = new StringFormat();

// Сверху (по умолчанию)
format.LineAlignment = StringAlignment.Near;    // ↓───────────
g.DrawString("Сверху", font, Brushes.Black, rect, format);

// По центру
format.LineAlignment = StringAlignment.Center;  // ────↓──────
g.DrawString("Центр", font, Brushes.Black, rect, format);

// Внизу
format.LineAlignment = StringAlignment.Far;     // ───────↓───
g.DrawString("Иззу", font, Brushes.Black, rect, format);

Перенос строк и другие опции:

StringFormat format = new StringFormat();

// Без переноса (текст обрезается если не помещается)
format.FormatFlags = StringFormatFlags.NoWrap;

// С переносом (по умолчанию)
// (just don't set NoWrap)

// Другие флаги
StringFormatFlags.DirectionRightToLeft;     // Для арабского/иврита
StringFormatFlags.NoClip;                   // Рисовать за пределами прямоугольника
StringFormatFlags.MeasureTrailingSpaces;    // При MeasureString считать пробелы

Практический пример — центрирование текста в прямоугольнике:

Rectangle rect = new Rectangle(10, 10, 300, 200);
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;

g.DrawString("Цетрированный текст", font, Brushes.Black, rect, format);
g.DrawRectangle(Pens.Gray, rect);  // Граница для наглядности

MeasureString — измерение размера текста

Нужно знать размер текста ДО рисования, чтобы его правильно разместить:

Базовое использование:

string text = "Мой текст";
Font font = new Font("Arial", 12);

// Измеряем размер
SizeF textSize = g.MeasureString(text, font);

float width = textSize.Width;    // Ширина в пикселях
float height = textSize.Height;  // Высота в пикселях

Центрирование текста в форме:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    string text = "Центрированный текст";
    Font font = new Font("Arial", 14);
    
    // Измеряем текст
    SizeF textSize = g.MeasureString(text, font);

    // Считаем координаты для центра
    float x = (this.Width - textSize.Width) / 2;
    float y = (this.Height - textSize.Height) / 2;
    
    // Рисуем в центре
    g.DrawString(text, font, Brushes.Black, x, y);
}

С ограничениями ширины:

string longText = "Это длинный текст, который может быть вычислен с ограничением ширины.";
Font font = new Font("Arial", 12);

// Измеряем, если текст помещается в 200 пикселей ширины
SizeF size = g.MeasureString(longText, font, 200);  // Учитывает перенос

float requiredHeight = size.Height;  // Реальная высота с переносом

Работа со шрифтами

FontDialog — выбор шрифта пользователем:

FontDialog fontDialog = new FontDialog();
fontDialog.Font = currentFont;  // Начальный шрифт

if (fontDialog.ShowDialog() == DialogResult.OK)
{
    currentFont = fontDialog.Font;
    this.Invalidate();  // Перерисовать форму с новым шрифтом
}

Получение списка доступных шрифтов:

// Все установленные шрифты
foreach (FontFamily fontFamily in FontFamily.Families)
{
    string fontName = fontFamily.Name;
    // Использование fontName для создания Font
}

Best Practices работы с текстом

  • ✅ Всегда вызывайте Dispose() на созданных Font'ах
  • ✅ Используйте MeasureString перед рисованием текста
  • ✅ Для многострочного текста указывайте максимальную ширину
  • ✅ Выбирайте размер шрифта в зависимости от расстояния чтения
  • ✅ Обеспечьте контраст между текстом и фоном
  • ✅ Проверяйте читаемость на разных DPI мониторов
  • 🚫 Не используйте слишком много разных шрифтов в одном приложении
  • 🚫 Избегайте очень мелких шрифтов (сложно читать, не печатается хорошо)

Практическое задание

Задание 1: Рисование текста

  1. Создайте обработчик события Paint
  2. Нарисуйте текст с разными шрифтами:
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
    
        // Разные размеры шрифта
        Font font12 = new Font("Arial", 12);
        Font font16 = new Font("Arial", 16);
        Font font24 = new Font("Arial", 24);
    
        g.DrawString("Шрифт 12", font12, Brushes.Black, 10, 10);
        g.DrawString("Шрифт 16", font16, Brushes.Blue, 10, 40);
        g.DrawString("Шрифт 24", font24, Brushes.Red, 10, 80);
    
        font12.Dispose();
        font16.Dispose();
        font24.Dispose();
    }
  3. Используйте IntelliSense для изучения свойств Font (напишите "new Font(")
  4. Запустите приложение

Задание 2: Стили шрифтов

  1. Нарисуйте текст с разными стилями:
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
    
        // Разные стили
        Font boldFont = new Font("Arial", 16, FontStyle.Bold);
        Font italicFont = new Font("Arial", 16, FontStyle.Italic);
        Font underlineFont = new Font("Arial", 16, FontStyle.Underline);
        Font strikeoutFont = new Font("Arial", 16, FontStyle.Strikeout);
    
        g.DrawString("Bold", boldFont, Brushes.Black, 10, 120);
        g.DrawString("Italic", italicFont, Brushes.Blue, 10, 150);
        g.DrawString("Underline", underlineFont, Brushes.Red, 10, 180);
        g.DrawString("Strikeout", strikeoutFont, Brushes.Green, 10, 210);
    
        boldFont.Dispose();
        italicFont.Dispose();
        underlineFont.Dispose();
        strikeoutFont.Dispose();
    }
  2. Запустите приложение

Задание 3: StringFormat — выравнивание

  1. Нарисуйте текст с разным выравниванием:
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Font font = new Font("Arial", 12);
        Rectangle rect = new Rectangle(10, 250, 200, 80);
                
        // По левому краю
        StringFormat leftFormat = new StringFormat();
        leftFormat.Alignment = StringAlignment.Near;
        g.DrawString("Слева", font, Brushes.Black, rect, leftFormat);
    
        // По центру
        StringFormat centerFormat = new StringFormat();
        centerFormat.Alignment = StringAlignment.Center;
        g.DrawString("По центру", font, Brushes.Blue, rect, centerFormat);
    
        // По правому краю
        StringFormat rightFormat = new StringFormat();
        rightFormat.Alignment = StringAlignment.Far;
        g.DrawString("Справа", font, Brushes.Red, rect, rightFormat);
    
        font.Dispose();
    }
  2. Запустите приложение

Задание 4: MeasureString — центрирование

  1. Центрируйте текст на форме:
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        string text = "Центрированный текст";
        Font font = new Font("Arial", 20);
    
        // Измеряем текст
        SizeF textSize = g.MeasureString(text, font);
    
        // Вычисляем координаты для центра
        float x = (this.ClientSize.Width - textSize.Width) / 2;
        float y = (this.ClientSize.Height - textSize.Height) / 2;
    
        // Рисуем в центре
        g.DrawString(text, font, Brushes.Black, x, y);
    
        font.Dispose();
    }
  2. Запустите приложение — текст должен быть по центру

Задание 5: FontDialog

  1. Добавьте на форму кнопку
  2. В конструкторе создайте поле для хранения шрифта:
    private Font currentFont = new Font("Arial", 12);
  3. В обработчике Click кнопки добавьте:
    private void button1_Click(object sender, EventArgs e)
    {
        FontDialog fontDialog = new FontDialog();
        fontDialog.Font = currentFont;
    
        if (fontDialog.ShowDialog() == DialogResult.OK)
        {
            currentFont = fontDialog.Font;
            this.Invalidate();
        }
    }
  4. В обработчике Paint используйте currentFont для рисования текста
  5. Запустите приложение и попробуйте выбрать другой шрифт
💡 Совет: Используйте IntelliSense для изучения всех свойств StringFormat. Начните вводить "StringAlignment." — вы увидите все варианты выравнивания.

Проверка знаний

Ответьте на вопросы, чтобы проверить, насколько хорошо вы усвоили материал:

1. Какой метод используется для рисования текста?
  • DrawText
  • WriteText
  • DrawString
  • PrintText
2. Какой метод используется для измерения размера текста?
  • MeasureText
  • MeasureString
  • GetTextSize
  • CalculateText
3. Как создать шрифт с жирным начертанием?
  • new Font("Arial", 12, FontStyle.Bold)
  • new Font("Arial", 12, FontStyle.Italic)
  • new Font("Arial", 12, FontStyle.Underline)
  • new Font("Arial", 12, FontStyle.Regular)
4. Какой класс используется для форматирования текста?
  • TextFormat
  • FormatString
  • TextAlignment
  • StringFormat
5. Какое свойство StringAlignment выравнивает текст по центру?
  • StringAlignment.Near
  • StringAlignment.Center
  • StringAlignment.Far
  • StringAlignment.Middle
6. Какой диалог используется для выбора шрифта?
  • FontDialog
  • ColorDialog
  • TextDialog
  • StyleDialog
7. Какое свойство Font задает размер шрифта?
  • Font.Size
  • Font.Height
  • Font.SizeInPoints
  • Font.Scale
8. Какой тип возвращает MeasureString?
  • Size
  • Dimension
  • Point
  • SizeF