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

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

Урок 1.2: Основы графического программирования

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

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

  • GUI (графический интерфейс) — основной способ взаимодействия пользователя с приложением
  • Растровая графика использует пиксели, векторная — математические формулы
  • Система координат начинается с (0,0) в левом верхнем углу и растет вправо и вниз
  • RGB модель описывает цвет как комбинацию красного, зеленого и синего компонентов
  • ARGB добавляет компонент прозрачности (alfa channel) для специальных эффектов

Что такое GUI

GUI (Graphical User Interface) — графический пользовательский интерфейс. Это способ взаимодействия пользователя с программой через визуальные элементы: окна, кнопки, меню и т.д. Вместо набора текстовых команд в консоли, пользователь видит и нажимает на знакомые элементы.

GUI vs Консоль — в чем разница?

GUI vs Консоль

Сравнение консольного и графического интерфейса

Преимущества GUI для графического программирования:

  • Интуитивно понятный интерфейс — пользователь сразу видит, что нужно делать без инструкций
  • Визуальная обратная связь — цвета, анимации, движение показывают результат действия
  • Возможность создания красивых приложений — своя палитра цветов, шрифты, изображения
  • Одновременное отображение информации — на экране может быть много элементов сразу
  • Интерактивность — приложение реагирует на клики, движения мыши, нажатия клавиш

Примеры GUI приложений

  • Microsoft Word — текстовый редактор с меню, кнопками, форматированием
  • Photoshop — графический редактор с палитрой, инструментами, слоями
  • VLC Player — видеоплеер с кнопками управления и слайдером видео
  • Visual Studio — среда разработки с множеством окон и инструментов

Растровая vs векторная графика

Это два принципиально разных подхода к хранению и отображению изображений. Понимание разницы критично для графического программирования.

Растровая графика:

Растровое изображение состоит из пикселей (маленьких квадратиков), каждый из которых имеет свой цвет. Как мозаика, составленная из цветных плиток.

  • Структура — изображение состоит из пикселей в сетке (матрице)
  • Каждый пиксель имеет свой цвет — RGB или RGBA значение
  • При увеличении теряется качество — видны отдельные квадратики (пиксельность)
  • Большой размер файла — для каждого пикселя нужно хранить информацию
  • Идеально для фотографий — много деталей и оттенков
  • Примеры форматов — PNG, JPG, BMP, GIF

ASCII диаграмма растровой графики:

Растровая графика

Принцип работы растровой графики

Векторная графика:

Векторное изображение описывается математическими формулами — координатами и уравнениями линий, кривых, фигур. Как чертеж, нарисованный с помощью геометрии.

  • Основаны на формулах — линии описываются уравнениями (y = mx + b)
  • Масштабируется без потери качества — можно увеличить в любой раз, переформулировав математику
  • Меньший размер файла — нужно хранить только формулы, не каждый пиксель
  • Идеально для логотипов, иконок, графиков — четкие линии и простые формы
  • Сложно для фотографий — нельзя описать миллионы оттенков формулами
  • Примеры форматов — SVG, PDF, шрифты (TTF)

Сравнение таблица:

Сравнение растровой и векторной графики

Сравнительная таблица растровой и векторной графики

Пиксели и система координат

Пиксель — это атомарная единица (минимальный неделимый элемент) на экране. Каждый пиксель имеет одноцветное значение. Система координат в компьютерной графике отличается от школьной математики!

Система координат в графике:

Система координат в графике

Система координат в Windows Forms

Работа с координатами в Visual Studio:

При работе с компонентами в дизайнере форм Visual Studio показывает координаты и размеры в окне Properties:

Окно Properties в Visual Studio

Окно свойств компонента в Visual Studio

Примеры:

  • Location = (100, 50) → компонент находится на 100 пикселей слева и 50 пикселей сверху
  • Size = (200, 100) → компонент имеет ширину 200 и высоту 100

Практический пример работы с координатами:

// Если форма имеет размер 800x600

// Получаем размеры формы
int formWidth = this.ClientSize.Width;   // 800
int formHeight = this.ClientSize.Height; // 600

// Вычисляем центр формы
int centerX = formWidth / 2;   // 400
int centerY = formHeight / 2;  // 300

// Рисуем точку в левом верхнем углу
g.FillEllipse(Brushes.Red, 0, 0, 5, 5);

// Рисуем точку в центре
g.FillEllipse(Brushes.Green, centerX, centerY, 5, 5);

// Рисуем точку в правом нижнем углу
g.FillEllipse(Brushes.Blue, formWidth - 5, formHeight - 5, 5, 5);

// Горизонтальная линия в середине по Y
g.DrawLine(Pens.Gray, 0, centerY, formWidth, centerY);

// Вертикальная линия в середине по X
g.DrawLine(Pens.Gray, centerX, 0, centerX, formHeight);

// Рисуем прямоугольник по центру
int rectWidth = 200;
int rectHeight = 100;
int rectX = centerX - rectWidth / 2;   // Центрирование по X
int rectY = centerY - rectHeight / 2;  // Центрирование по Y
g.DrawRectangle(Pens.Black, rectX, rectY, rectWidth, rectHeight);

Координаты компонента относительно формы:

Координаты компонента относительно формы

Расположение компонента на форме

Вычисление координат:

  • Левый верхний угол: (button.Location.X, button.Location.Y)
  • Правый верхний угол: (button.Right, button.Location.Y)
  • Левый нижний угол: (button.Location.X, button.Bottom)
  • Правый нижний угол: (button.Right, button.Bottom)

Пример кода:

Button btn = new Button();
btn.Location = new Point(100, 100);
btn.Size = new Size(75, 23);

// Получаем координаты
int left = btn.Location.X;      // 100
int top = btn.Location.Y;       // 100
int right = btn.Right;          // 175 (100 + 75)
int bottom = btn.Bottom;        // 123 (100 + 23)

Цветовые модели

Цвет на экране создается различными моделями смешивания света. В компьютерной графике главная модель — RGB.

RGB (Red, Green, Blue):

Монитор создает цвет смешиванием трех цветов света — красного, зеленого и синего. Каждый компонент имеет интенсивность от 0 до 255.

  • 0 = свет выключен
  • 255 = свет на максимальной яркости
  • Смешивание — RGB(255,255,255) = белый (все свечают), RGB(0,0,0) = черный (ничего не светит)

RGB примеры:

// Основные цвета
Color red = Color.FromArgb(255, 0, 0);       // Красный (R=255, G=0, B=0)
Color green = Color.FromArgb(0, 255, 0);     // Зеленый
Color blue = Color.FromArgb(0, 0, 255);      // Синий

// Вторичные цвета (смешивание двух основных)
Color yellow = Color.FromArgb(255, 255, 0);  // Красный + Зеленый
Color cyan = Color.FromArgb(0, 255, 255);    // Зеленый + Синий  (бирюзовый)
Color magenta = Color.FromArgb(255, 0, 255); // Красный + Синий  (малиновый)

// Ахроматические цвета
Color white = Color.FromArgb(255, 255, 255); // Все максимум
Color black = Color.FromArgb(0, 0, 0);       // Все минимум
Color gray = Color.FromArgb(128, 128, 128);  // Половина
Color darkGray = Color.FromArgb(64, 64, 64); // Четверть
Color lightGray = Color.FromArgb(192, 192, 192); // Три четверти

// Оттенки красного (меняя интенсивность)
Color brightRed = Color.FromArgb(255, 0, 0);    // Яркий красный
Color darkRed = Color.FromArgb(128, 0, 0);      // Темный красный
Color paleRed = Color.FromArgb(255, 128, 128);  // Бледный красный (добавили G и B)

Цветовой куб (визуализация RGB модели):

Цветовой куб RGB

Визуализация цветовой модели RGB

ARGB — прозрачность (Alpha):

ARGB добавляет четвертый компонент — Alpha, который контролирует прозрачность. Это мощная техника для наложения изображений и создания эффектов.

  • Alpha = 0 — полностью прозрачный (невидимый)
  • Alpha = 255 — полностью непрозрачный (видимый)
  • Alpha = 128 — полупрозрачный (50% видимый, 50% прозрачный)
// Примеры ARGB цветов с прозрачностью

// Полностью видимый красный
Color opaqueRed = Color.FromArgb(255, 255, 0, 0);
//                              A    R    G   B

// Полупрозрачный красный (50% видимости)
Color semiTransparentRed = Color.FromArgb(128, 255, 0, 0);

// Почти невидимый синий (10% видимости)
Color almostInvisibleBlue = Color.FromArgb(25, 0, 0, 255);

// Полностью прозрачный черный (невидимый, не используется)
Color fullyTransparent = Color.FromArgb(0, 0, 0, 0);

// Применение в рисовании с прозрачностью
Brush semiTransparentBrush = new SolidBrush(semiTransparentRed);
g.FillEllipse(semiTransparentBrush, 50, 50, 100, 100);
// Эллипс будет полупрозрачным, сквозь него будут видны элементы позади

Частые ошибки с ARGB:

// ❌ НЕПРАВИЛЬНО: забыли указать Alpha
// Color transparentRed = Color.FromArgb(255, 0, 0); 
// This is RGB, not ARGB! (Alpha по умолчанию = 255)

// ✅ ПРАВИЛЬНО: используйте 4 параметра для ARGB
Color semiTransparentRed = Color.FromArgb(128, 255, 0, 0);
//                                          ↑ обязательно Alpha

// ✅ Или используйте встроенный конструктор
Color simpleColor = Color.FromArgb(255, 128, 0); // RGB (3 параметра)
Color withAlpha = Color.FromArgb(128, Color.Red); // ARGB (Alpha, Color)

Практическое применение цветов в графике:

  • Выделение элемента — более яркий цвет для активного элемента
  • Отключенные кнопки — серый цвет вместо яркого
  • Полупрозрачные слои — рисовать поверх друг друга с видимостью через них
  • Градиенты — плавный переход от одного цвета к другому
  • Чередование цветов — для шахматных доск или визуализации данных

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

Задание 1: Изучение системы координат

  1. Создайте новый проект Windows Forms
  2. Установите размер формы: 800x600 пикселей
  3. В дизайнере форм добавьте несколько компонентов:
    • Button — установите Location = (100, 100), Size = (75, 23)
    • Label — установите Location = (200, 150), Size = (100, 20)
    • TextBox — установите Location = (50, 200), Size = (150, 20)
  4. Наблюдайте, как меняются координаты при перетаскивании компонентов
  5. Попробуйте изменить размер формы и посмотрите, как меняются координаты

Задание 2: Рисование координатной сетки

  1. Перейдите к коду формы (F7)
  2. Добавьте обработчик события Paint:
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Pen gridPen = new Pen(Color.LightGray, 1);
    
        // Рисуем вертикальные линии
        for (int x = 0; x < this.ClientSize.Width; x += 50)
        {
            g.DrawLine(gridPen, x, 0, x, this.ClientSize.Height);
        }
    
        // Рисуем горизонтальные линии
        for (int y = 0; y < this.ClientSize.Height; y += 50)
        {
            g.DrawLine(gridPen, 0, y, this.ClientSize.Width, y);
        }
    
        // Отмечаем центр формы красным кругом
        int centerX = this.ClientSize.Width / 2;
        int centerY = this.ClientSize.Height / 2;
        g.FillEllipse(Brushes.Red, centerX - 5, centerY - 5, 10, 10);
    }
  3. Перейдите в дизайнер форм и выберите форму
  4. В окне Properties перейдите на вкладку Events
  5. Дважды кликните по событию Paint
  6. Запустите приложение (F5) и проверьте результат

Задание 3: Работа с цветами

  1. Добавьте в обработчик Paint код для рисования цветов:
    // Основные цвета RGB
    g.FillRectangle(Brushes.Red, 10, 10, 50, 50);
    g.FillRectangle(Brushes.Green, 70, 10, 50, 50);
    g.FillRectangle(Brushes.Blue, 130, 10, 50, 50);
    
    // Вторичные цвета
    Color yellow = Color.FromArgb(255, 255, 0);
    Color cyan = Color.FromArgb(0, 255, 255);
    Color magenta = Color.FromArgb(255, 0, 255);
    
    g.FillRectangle(new SolidBrush(yellow), 10, 70, 50, 50);
    g.FillRectangle(new SolidBrush(cyan), 70, 70, 50, 50);
    g.FillRectangle(new SolidBrush(magenta), 130, 70, 50, 50);
    
    // Цвета с прозрачностью (ARGB)
    Color semiTransparentRed = Color.FromArgb(128, 255, 0, 0);
    g.FillEllipse(new SolidBrush(semiTransparentRed), 200, 30, 80, 80);
    
    // Градиент
    LinearGradientBrush gradient = new LinearGradientBrush(
        new Point(10, 130), new Point(200, 130),
        Color.White, Color.Black);
    g.FillRectangle(gradient, 10, 130, 190, 50);
  2. Запустите приложение и изучите полученные цвета
  3. Попробуйте создать свои цвета, меняя RGB значения

Задание 4: Центрирование компонентов

  1. В дизайнере форм добавьте кнопку
  2. В коде формы центрируйте кнопку:
    public Form1()
    {
        InitializeComponent();
    
        // Центрируем кнопку
        int buttonWidth = button1.Width;
        int buttonHeight = button1.Height;
        int centerX = this.ClientSize.Width / 2;
        int centerY = this.ClientSize.Height / 2;
    
        button1.Location = new Point(
            centerX - buttonWidth / 2,
            centerY - buttonHeight / 2
        );
    }
  3. Запустите приложение и проверьте, что кнопка находится по центру
  4. Попробуйте изменить размер формы и посмотрите, что произойдет
💡 Совет: Используйте IntelliSense (Ctrl+Space) для автодополнения кода при работе с координатами и цветами.

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

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

1. Что такое GUI?
  • Графический процессор
  • Графический пользовательский интерфейс
  • Графическая утилита
  • Графический редактор
2. В растровой графике изображение состоит из:
  • Пикселей
  • Векторов
  • Кривых
  • Формул
3. Где находится начало координат в Windows Forms?
  • В центре формы
  • В правом нижнем углу
  • В левом верхнем углу
  • В правом верхнем углу
4. Какие компоненты входят в RGB?
  • Red, Green, Yellow
  • Red, Blue, Yellow
  • Red, Green, Yellow, Blue
  • Red, Green, Blue
5. Какое значение Alpha в ARGB означает полную прозрачность?
  • 255
  • 0
  • 128
  • 100
6. Какой цвет получается при смешивании красного и зеленого?
  • Желтый
  • Бирюзовый
  • Малиновый
  • Белый
7. Какое свойство компонента задает его позицию на форме?
  • Size
  • Bounds
  • Location
  • Position
8. Как вычислить центр формы размером 800x600?
  • (800, 600)
  • (0, 0)
  • (799, 599)
  • (400, 300)