
- •Объекты Graphics и Drawing в Windows Forms
- •Обзор графических возможностей
- •Интерфейс управляемых классов
- •Три категории графических служб
- •Двухмерная векторная графика
- •Рисунки
- •Типографская разметка
- •Структура интерфейса Graphics
- •Важные классы
- •Прямые и кривые линии и фигуры
- •Общие сведения о векторной графике
- •Методы рисования с помощью графических объектов
- •Рисование линии
- •Создание объекта Pen
- •Штриховые линии и завершения отрезков
- •Рисование прямоугольника
- •Рисование эллипса
- •Рисование дуги
- •Рисование многоугольника
- •Физические и математические сплайны
- •Рисование сплайнов Безье
- •Применение контуров
- •Сплошные кисти
- •Штриховые кисти
- •Текстурные кисти
- •Градиентные кисти
- •Управляемый интерфейс для кривых
- •Использование областей
- •Задание области обрезки
- •Сглаживание прямых и кривых линий
- •Неровности
- •Сглаживание
- •Работа с растровыми и векторными изображениями с использованием классов Image, Bitmap и Metafile
- •Типы точечных рисунков
- •Форматы графических файлов
- •Форматы метафайлов
- •Типы файлов и клонирование
- •Варианты DrawImage
- •Системы координат и преобразования
- •Типы систем координат
- •Преобразования и системы координат
- •Матричное представление преобразований
- •Составные преобразования
- •Глобальные и локальные преобразования
- •Глобальные преобразования
- •Локальные преобразования
- •Использование управляемых графических классов Приступая к программированию графики
- •Создание объектов Graphics для рисования
- •Создание объекта Graphics
- •PaintEventArgs в обработчике события Paint
- •Получение ссылки на объект Graphics из объекта PaintEventArgs в событии Paint
- •Рисование фигур и изображений и управление ими
- •Создание фигурной формы Windows Forms
- •Компиляция кода
- •Копирование пикселов для уменьшения эффекта дрожания изображения в Windows Forms
- •Компиляция кода
- •Рисование линий и фигур с помощью пера
- •Рисование линий с помощью пера
- •Компиляция кода
- •Рисование прямоугольников с помощью пера
- •Компиляция кода
- •Задание толщины и выравнивания пера
- •Изменение толщины пера
- •Изменение выравнивания пера
- •Создание вложенного пера
- •Рисование линий с наконечниками
- •Компиляция кода
- •Соединение линий
- •Компиляция кода
- •Рисование пользовательских пунктирных линий
- •Компиляция кода
- •Рисование линии с текстурным заполнением
- •Компиляция кода
- •Использование кисти для заливки фигур
- •Заливка фигуры сплошным цветом
- •Компиляция кода
- •Штриховая заливка фигуры
- •Компиляция кода
- •Заливка фигуры текстурой, созданной на основе изображения
- •Компиляция кода
- •Мозаичное заполнение фигуры заданным изображением
- •Мозаичное заполнение изображением
- •Горизонтальное зеркальное преобразование изображения при мозаичном заполнении
- •Вертикальное зеркальное преобразование изображения при мозаичном заполнении
- •Мозаичное заполнение с зеркальным отображением изображения по горизонтали и вертикали
- •Заливка фигур с помощью градиентной кисти
- •Создание линейного градиента
- •Использование горизонтальных линейных градиентов
- •Настройка линейных градиентов
- •Создание диагональных линейных градиентов
- •Создание градиента вдоль контура
- •Заливка эллипса с использованием градиента контура
- •Указание точек на границе
- •Настройка градиента контура
- •Настройка с интерполяцией
- •Задание центральной точки
- •Применение гамма-коррекции к градиенту
- •Компиляция кода
- •Загрузка и отображение метафайлов
- •Компиляция кода
- •Обрезка и масштабирование изображений
- •Компиляция кода
- •Поворот, отражение и наклон изображений
- •Компиляция кода
- •Использование режима интерполяции для управления качеством изображений при масштабировании
- •Компиляция кода
- •Создание эскизов изображений
- •Компиляция кода
- •Повышение производительности за счет отключения автоматического масштабирования
- •Компиляция кода
- •Чтение метаданных изображения
- •Значение
- •Пример Описание
- •Компиляция кода
- •Создание растрового изображения во время выполнения
- •Компиляция кода
- •Извлечение связанного с файлом значка в Windows Forms
- •Компиляция кода
- •Альфа-смешение цвета для линий и заливок
- •Рисование непрозрачных и полупрозрачных линий
- •Компиляция кода
- •Рисование непрозрачными и полупрозрачными кистями
- •Компиляция кода
- •Использование режима комбинирования для управления альфа-смешением
- •Компиляция кода
- •Использование матрицы цветов для задания значений прозрачности в изображениях
- •Компиляция кода
- •Шрифты и текст
- •Разработка шрифтов и их семейств
- •Компиляция кода
- •Рисование текста в указанной позиции
- •Рисование строки текста с использованием gdi
- •Компиляция кода
- •Многострочный вывод текста в прямоугольнике
- •Рисование текста с переносом по словам в прямоугольнике с помощью gdi
- •Компиляция кода
- •Рисование текста с использованием gdi
- •Компиляция кода
- •Выравнивание рисуемого текста
- •Рисование центрированного текста с использованием gdi (DrawText)
- •Компиляция кода
- •Вывод текста по вертикали
- •Компиляция кода
- •Установка позиций табуляции для выводимого текста
- •Компиляция кода
- •Перебор установленных шрифтов
- •Компиляция кода
- •Получение метрик шрифтов
- •Компиляция кода
- •Сглаживание текста
- •Компиляция кода
- •Построение и рисование кривых
- •Рисование фундаментальных сплайнов
- •Рисование фундаментального сплайна в форме колокола
- •Рисование замкнутого фундаментального сплайна
- •Изменение изгиба фундаментального сплайна
- •Компиляция кода
- •Рисование отдельного сплайна Безье
- •Компиляция кода
- •Рисование последовательности сплайнов Безье
- •Компиляция кода
- •Построение и рисование контуров
- •Создание изображений из прямых и кривых линий и геометрических фигур
- •Компиляция кода
- •Заливка открытых фигур
- •Компиляция кода
- •Спрямление участков кривой
- •Спрямление контура
- •Использование объемного преобразования
- •Различные типы преобразований
- •Значение порядка преобразований
- •Примеры составных преобразований
- •Использование графических контейнеров
- •Управление состоянием объекта Graphics
- •Состояние объекта Graphics
- •Параметры качества
- •Преобразования
- •Область обрезки
- •Использование вложенных графических контейнеров
- •Преобразования во вложенных контейнерах
- •Обрезка во вложенных контейнерах
- •Параметры качества во вложенных контейнерах
- •Различные уровни вложенных контейнеров
- •Использование областей
- •Проверка нахождения указателя мыши в заданной области
- •Компиляция кода
- •Обрезка изображения по границам области обрезки
- •Компиляция кода
- •Получение списка установленных кодировщиков
- •Компиляция кода
- •Получение списка установленных декодеров
- •Компиляция кода
- •Компиляция кода
Спрямление участков кривой
В объекте GraphicsPath хранятся последовательности линий и сплайнов Безье. К контуру можно добавлять различные типы кривых (эллипсы, дуги и фундаментальные сплайны), но перед сохранением в контуре каждая кривая преобразуется в сплайн Безье. Спрямление контура заключается в преобразовании всех сплайнов Безье в последовательность отрезков прямых линий. На приведенном ниже рисунке изображен контур до и после спрямления.
Спрямление контура
Вызовите метод Flatten объекта GraphicsPath. Метод Flatten получает в качестве параметра аргумент спрямления, задающий максимально допустимое расстояние между спрямленным и исходным контуром.
Использование преобразований в управляемом GDI+
Аффинные преобразования — это поворот, масштабирование, отражение, наклон и сдвиг. В интерфейсе GDI+ класс Matrix предоставляет основные средства для осуществления аффинных преобразований над векторными рисунками, изображениями и текстом.
Использование объемного преобразования
Объемное преобразование является свойством класса Graphics. Числа, определяющие объемное преобразование, хранятся в объекте Matrix, представляющем собой матрицу размером 3×3. Классы Matrix и Graphics содержат различные методы для установки элементов матрицы объемного преобразования.
Different Types of Transformations
In the following example, the code first creates a 50×50 rectangle and locates it at the origin (0, 0). The origin is at the upper-left corner of the client area.
Rectangle rect = new Rectangle(0, 0, 50, 50); Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2); e.Graphics.DrawRectangle(pen, rect); |
The following code applies a scaling transformation that expands the rectangle by a factor of 1.75 in the x direction and shrinks the rectangle by a factor of 0.5 in the y direction:
e.Graphics.ScaleTransform(1.75f, 0.5f); e.Graphics.DrawRectangle(pen, rect); |
The result is a rectangle that is longer in the x direction and shorter in the y direction than the original.
To rotate the rectangle instead of scaling it, use the following code:
e.Graphics.ResetTransform(); e.Graphics.RotateTransform(28); // 28 degrees e.Graphics.DrawRectangle(pen, rect); |
To translate the rectangle, use the following code:
e.Graphics.ResetTransform(); e.Graphics.TranslateTransform(150, 150); e.Graphics.DrawRectangle(pen, rect); |
Различные типы преобразований
В следующем примере код создает прямоугольник 50×50 и помещает его в точку начала координат (0, 0). Начало координат располагается в верхнем левом углу клиентской области.
---------
В следующем коде к прямоугольнику применяется масштабирование; коэффициент для оси x равен 1,75, а для оси y — 0,5.
--
Результатом преобразования является прямоугольник, который длиннее исходного по оси x и короче его по оси y.
Чтобы вместо масштабирования прямоугольника осуществить его поворот, используйте следующий код:
---
Чтобы преобразовать прямоугольник, можно использовать следующий код:
---------
Why Transformation Order Is Significant
A single Matrix object can store a single transformation or a sequence of transformations. The latter is called a composite transformation. The matrix of a composite transformation is obtained by multiplying the matrices of individual transformations.
Composite Transform Examples
In a composite transformation, the order of individual transformations is important. For example, if you first rotate, then scale, then translate, you get a different result than if you first translate, then rotate, then scale. In GDI+, composite transformations are built from left to right. If S, R, and T are scale, rotation, and translation matrices respectively, then the product SRT (in that order) is the matrix of the composite transformation that first scales, then rotates, then translates. The matrix produced by the product SRT is different from the matrix produced by the product TRS.
One reason order is significant is that transformations like rotation and scaling are done with respect to the origin of the coordinate system. Scaling an object that is centered at the origin produces a different result than scaling an object that has been moved away from the origin. Similarly, rotating an object that is centered at the origin produces a different result than rotating an object that has been moved away from the origin.
The following example combines scaling, rotation and translation (in that order) to form a composite transformation. The argument Append passed to the RotateTransform method indicates that the rotation will follow the scaling. Likewise, the argument Append passed to the TranslateTransform method indicates that the translation will follow the rotation. Append and Prepend are members of the MatrixOrder enumeration.
Rectangle rect = new Rectangle(0, 0, 50, 50); Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2); e.Graphics.ResetTransform(); e.Graphics.ScaleTransform(1.75f, 0.5f); e.Graphics.RotateTransform(28, MatrixOrder.Append); e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append); e.Graphics.DrawRectangle(pen, rect); |