
- •Объекты 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
- •Параметры качества
- •Преобразования
- •Область обрезки
- •Использование вложенных графических контейнеров
- •Преобразования во вложенных контейнерах
- •Обрезка во вложенных контейнерах
- •Параметры качества во вложенных контейнерах
- •Различные уровни вложенных контейнеров
- •Использование областей
- •Проверка нахождения указателя мыши в заданной области
- •Компиляция кода
- •Обрезка изображения по границам области обрезки
- •Компиляция кода
- •Получение списка установленных кодировщиков
- •Компиляция кода
- •Получение списка установленных декодеров
- •Компиляция кода
- •Компиляция кода
Область обрезки
Объект Graphics поддерживает область обрезки, которая применяется для всех объектов, отображаемых объектом Graphics. Для установки границ области обрезки служит метод SetClip.
В следующем примере создается область в форме креста, являющаяся объединением двух прямоугольников. Эта область назначается областью обрезки для объекта Graphics. Затем в коде рисуются две линии, ограниченные внутренней частью области обрезки.
-------
Обрезанные линии показаны на следующем рисунке.
Using Nested Graphics Containers
GDI+ provides containers that you can use to temporarily replace or augment part of the state in a Graphics object. You create a container by calling the BeginContainer method of a Graphics object. You can call BeginContainer repeatedly to form nested containers. Each call to BeginContainer must be paired with a call to EndContainer.
Transformations in Nested Containers
The
following example creates a Graphics object and a container within
that Graphics object. The world transformation of the Graphics object
is a translation 100 units in the x
direction and 80 units in the y
direction. The world transformation of the container is a 30-degree
rotation. The code makes the call
DrawRectangle(pen, -60, -30, 120, 60)
twice.
The first call to DrawRectangle is inside the container; that is, the
call is in between the calls to BeginContainer and EndContainer. The
second call to DrawRectangle is after the call to EndContainer.
Graphics graphics = e.Graphics; Pen pen = new Pen(Color.Red); GraphicsContainer graphicsContainer; graphics.FillRectangle(Brushes.Black, 100, 80, 3, 3);
graphics.TranslateTransform(100, 80);
graphicsContainer = graphics.BeginContainer(); graphics.RotateTransform(30); graphics.DrawRectangle(pen, -60, -30, 120, 60); graphics.EndContainer(graphicsContainer);
graphics.DrawRectangle(pen, -60, -30, 120, 60); |
In the preceding code, the rectangle drawn from inside the container is transformed first by the world transformation of the container (rotation) and then by the world transformation of the Graphics object (translation). The rectangle drawn from outside the container is transformed only by the world transformation of the Graphics object (translation). The following illustration shows the two rectangles.
Использование вложенных графических контейнеров
Интерфейс GDI+ предоставляет контейнеры, которые можно использовать, чтобы временно заменить или дополнить некоторую составляющую состояния объекта Graphics. Чтобы создать контейнер, можно вызвать метод BeginContainer объекта Graphics. Для создания вложенных контейнеров можно многократно вызывать метод BeginContainer. Каждому вызову метода BeginContainer должен соответствовать вызов метода EndContainer.
Преобразования во вложенных контейнерах
В
приведенном ниже примере создаются
объект Graphics и контейнер внутри этого
объекта Graphics. Объемным преобразованием
объекта Graphics является сдвиг на 100 единиц
в направлении оси x
и на 80 единиц в направлении оси y.
Объемным преобразованием контейнера
является поворот на 30 градусов. Код
осуществляет вызов метода DrawRectangle(pen,
-60, -30, 120, 60)
дважды.
Первый вызов DrawRectangle осуществляется
внутри контейнера. Это значит, что он
происходит между вызовами BeginContainer и
EndContainer. Второй вызов DrawRectangle происходит
после вызова EndContainer.
-----
В приведенном выше коде к прямоугольнику, рисуемому внутри контейнера, применяется сначала объемное преобразование контейнера (поворот), а затем объемное преобразование объекта Graphics (сдвиг). К прямоугольнику, рисуемому вне контейнера, применяется только объемное преобразование объекта Graphics (сдвиг). Два нарисованных прямоугольника показаны на следующем рисунке.
Clipping in Nested Containers
The following example demonstrates how nested containers handle clipping regions. The code creates a Graphics object and a container within that Graphics object. The clipping region of the Graphics object is a rectangle, and the clipping region of the container is an ellipse. The code makes two calls to the DrawLine method. The first call to DrawLine is inside the container, and the second call to DrawLine is outside the container (after the call to EndContainer). The first line is clipped by the intersection of the two clipping regions. The second line is clipped only by the rectangular clipping region of the Graphics object.
Graphics graphics = e.Graphics; GraphicsContainer graphicsContainer; Pen redPen = new Pen(Color.Red, 2); Pen bluePen = new Pen(Color.Blue, 2); SolidBrush aquaBrush = new SolidBrush(Color.FromArgb(255, 180, 255, 255)); SolidBrush greenBrush = new SolidBrush(Color.FromArgb(255, 150, 250, 130));
graphics.SetClip(new Rectangle(50, 65, 150, 120)); graphics.FillRectangle(aquaBrush, 50, 65, 150, 120);
graphicsContainer = graphics.BeginContainer(); // Create a path that consists of a single ellipse. GraphicsPath path = new GraphicsPath(); path.AddEllipse(75, 50, 100, 150);
// Construct a region based on the path. Region region = new Region(path); graphics.FillRegion(greenBrush, region);
graphics.SetClip(region, CombineMode.Replace); graphics.DrawLine(redPen, 50, 0, 350, 300); graphics.EndContainer(graphicsContainer);
graphics.DrawLine(bluePen, 70, 0, 370, 300); |
The following illustration shows the two clipped lines.