- •1. Цель работы
- •2. Краткая теория
- •2.1. Работа с перьями
- •2.2. Работа с кистью
- •2.2.1. Кисть для сплошной закраски
- •2.2.2. Кисти типа HatchBrush
- •2.2.3. Кисти типа TextureBrush
- •2.2.4. Градиентные кисти
- •2.3. Проверка попадания в область изображения
- •2.4. Проверка попадания в область, отличную от прямоугольной
- •2.5. Определение цветовых значений
- •2.6. Стандартное диалоговое окно выбора цвета
- •3. Пример выполнения работы
- •3.1. Визуальное проектирование диалогового окна
- •3.2. Проектирование программного кода
- •3.2.1. Начальное рисование фигуры
- •3.2.2. Реализация движения фигуры
- •3.2.3. Программная реализация «отскакивания от стенок»
- •3.2.4. Изменение скорости движения круга
- •3.2.5. Создание диалоговой панели выбора цвета заливки
- •3.2.6. Создание свойства для получения цвета
- •3.2.7. Проверка попадания курсора мыши внутрь круга
- •If (прямоугольник.Contains(точка_курсора))
- •3.2.8. Изменение цвета круга
- •4. Варианты заданий для самостоятельной работы
2.2.3. Кисти типа TextureBrush
Если представленные выше кисти не подходят, то есть возможность создать собственную кисть на базе TextureBrush в виде произвольного изображения. Такая кисть, называемая текстурной, может иметь любой внешний вид и любой цвет.
Для создания кисти класса TextureBrush приложение может воспользоваться одним из следующих конструкторов:
public TextureBrush(Image);
public TextureBrush(Image, Rectangle);
public TextureBrush(Image, RectangleF);
public TextureBrush(Image, WrapMode);
public TextureBrush(Image, Rectangle, ImageAttributes);
public TextureBrush(Image, WrapMode, Rectangle);
public TextureBrush(Image, WrapMode, RectangleF);
Самому простому из этих конструкторов нужно передать изображение, загруженное из ресурсов приложения или из внешнего файла. Структуры Rectangle и RectangleF позволяют задать границы прямоугольной области, ограничивающие изображение кисти. С помощью констант перечисления WrapMode программа может задать способ размещения текстуры по горизонтали и вертикали. Эти константы приведены в таблице.
Константа |
Описание |
Clamp |
Текстура кисти «прикрепляется» к границе объекта |
Tile |
При закраске текстура кисти повторяется по вертикали и горизонтали |
TileFlipX |
Аналогично предыдущему, но изображение в соседних столбцах заменяется зеркальным, отражаясь по вертикали |
TileFlipY |
Аналогично Tile, но отражение происходит по горизонтали |
TileFlipXY |
Отражение и по вертикали и по горизонтали |
И, наконец, параметр ImageAttributes позволяет задать различные атрибуты изображения, такие, как количество цветов и способ рисования. Описание этого параметра и класса ImageAttributes можно найти в электронной справочной документации системы Microsoft Visual Studio .NET.
Закраску с помощью текстурной продемонстрировано в приведенном ниже коде:
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Image myBrushImage = new Bitmap(GetType(), "L_GREY.GIF");
TextureBrush tb = new TextureBrush(myBrushImage);
g.FillRectangle(tb, 10, 30, 200, 100);
g.DrawRectangle(new Pen(Brushes.DarkBlue,2),10,30,200,100);
}
После получения контекста устройства создается новое изображение класса Image, загружаемое из ресурсов приложения:
Image myBrushImage = new Bitmap(GetType(), "L_GREY.GIF");
Обратите внимание, что мы создаем объект класса Bitmap, а полученную в результате ссылку присваиваем объекту класса Image. Предполагается, что перед трансляцией приложения вы скопировали файл текстуры L_GREY.GIF в ресурсы приложения, а также установили значение свойства Build Action для файла изображения, равное Embedded Resource. Результат закраски прямоугольной области текстурной кистью показан на рисунке 2.2.
Рис. 2.2 – Закрашивание прямоугольника кистью типа TextureBrush
2.2.4. Градиентные кисти
Приложениям GDI+ доступен еще один вид кистей так называемые градиентные кисти. Линейная градиентная кисть LinearGradientBrush позволяет задать в кисти переход от одного цвета к другому. Кисти с множественным градиентом PathGradientBrush позволяют задать внутри кисти область, которая будет закрашена с использованием цветового градиента.
Рассмотрим фрагмент кода, демонстрирующего возможности закрашивания при помощи градиентной кисти:
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Rectangle rect = new Rectangle(10, 10, 50, 50);
LinearGradientBrush gb = new LinearGradientBrush(rect, Color.White, Color.Black, LinearGradientMode.BackwardDiagonal);
g.FillRectangle(gb, 10, 30, 200, 100);
g.DrawRectangle(new Pen(Brushes.DarkBlue, 2),10,30,200,100);
}
Прямоугольная область задает пространство, в котором происходит изменение цвета. Конструктору класса LinearGradientBrush передаются координаты этой области, значения двух цветов, а также режим градиентного закрашивания LinearGradientMode.
Результат работы данного приложения представлен на рисунке 2.3.
Рис. 2.3 – Закрашивание прямоугольника линейной градиентной кистью
В таблице приведены возможные значения перечисления LinearGradientMode.
Константа |
Описание |
Horizontal |
Слева направо |
Vertical |
Сверху вниз |
ForvardDiagonal |
По диагонали из верхнего левого угла в нижний правый угол |
BackwardDiagonal |
По диагонали из верхнего правого угла в нижний левый угол |
