В пространстве имен System.Drawing.Drawing2D определен производный от Brush тип с именем HatchBrush. Этот тип позволяет закрасить регион, используя один из (очень большого) набора встроенных видов узоров, представленных перечнем HatchStyle. Вот часть соответствующего списка имен.
public enum HatchStyle {
Horizontal, Vertical, ForwardDiagonal,
BackwardDiagonal, Cross, DiagonalCross,
LightUpwardDiagonal, DarkDownwardDiagonal,
DarkUpwardDiagonal, LightVertical,
NarrowHorizontal, DashedDownwardDiagonal,
SmallConfetti, LargeConfetti, ZigZag,
Wave, DiagonalВrick, Divot, DottedGrid, Sphere,
OutlinedDiamond, SolidDiamond,
…
}
При конструировании HatchBrush вы должны указать цвет для переднего плана и цвет для фона, которые будут использоваться при выполнении операции закрашивания. Для примера давайте немного подкорректируем программную логику из приведенного выше примера PenCapApp.
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
int yOffSet = 10;
// Получение всех членов перечня HatchStyle.
Array obj = Enum.GetValues(typeof(HatchStyle));
// Отображение овалов для первых 5 значений из HatchStyle.
for (int x = 0; x ‹ 5; x++) {
// Конфигурация кисти.
HatchStyle temp = (HatchStyle)obj.GetValue(x);
HatchBrush theBrush = new HatchBrush(temp, Color.White, Color.Black);
// Вывод имени из перечня HatchStyle.
g.DrawString(temp.ToString(), new Font (''Times New Roman", 10), Brushes.Black, 0, yOffSet);
// Закраска объекта подходящей кистью.
g.FillEllipse(theBrush, 150, yOffSet, 200, 25);
yOffSet += 40;
}
}
В окне вывода будут показаны заполненные овалы для первых пяти значений видов штриховки (рис. 20.15).
Рис. 20.15. Некоторые стили штриховки
Исходный код.Проект BrushStyles размещен в подкаталоге, соответствующем главе 20.
Тип TextureBrush позволяет связать с кистью точечное изображение, чтобы затем использовать ее в операциях закрашивания. Чуть позже будет подробно обсуждаться класс image (изображение) GDI+. Типу TextureBrush предоставляется ссылка на image, используемая этим типом в течение всего цикла его существования. Само изображение обычно хранится в некотором локальном файле (*.bmp. *.gif, *.jpg) или же встроено в компоновочный блок .NET.
Давайте построим пример приложения, использующего тип TextureBrush. Одна кисть будет использоваться дня закраски области клиента изображением из файла clouds.bmp, в то время как другая кисть будет выводить текст с помощью изображения, находящегося в файле Soap bubbles.bmp. Соответствующий вывод показан на рис. 20.16.
Рис. 20.16. Точечные рисунки в качестве кисти
Ваш производный от Form класс должен поддерживать два члена типа Brush, которым присваивается новый объект TextureBrush в конструкторе. Обратите внимание на то, что конструктору типа TextureBrush требуется предоставить на вход тип, производный от Image.
public partial class MainForm: Form {
// Данные для кисти с изображением.
private Brush texturedTextBrush; private Brush texturedBGroundBrush;
public MainForm() {
…
// Загрузка изображения для кисти фона.
Image bGroundBrushImage = new Bitmap("Clouds.bmp");
texturedBGroundBrush = new TextureBrush(bGroundBrushImage);
// Загрузка изображения для кисти текста.
Image textBrushImage = new Bitmap("Soap Bubbles.bmp");
texturedTextBrush = new TextureBrush(textBrushImage);
}
}
Замечание.Файлы *.bmp, которые используются в этом примере, должны находиться в той же папке, где находится само приложение (или должны быть "жестко" указаны пути, по которым эти изображения можно найти). Соответствующая проблема будет обсуждаться в этой главе чуть позже.
Теперь, когда у вас есть два типа TextureBrush, способные выполнить визуализацию, создать обработчик события Paint очень просто.
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
Rectangle r = ClientRectangle;
// Рисование облаков в области клиента.
g.FillRectangle(texturedBGroundBrush, r);
// Отображение текста кистью с текстурой.
g.DrawString("Изображения в качестве кисти. Стильно!", new Font("Arial", 30, FontStyle.Bold | FontStyle.Italic), texturedTextBrush, r);
}
Исходный код. Проект TexturedBrushes размещен в подкаталоге, соответствующем главе 20.
Работа с LinearGradientBrush
Последним из рассматриваемых в этом разделе типов будет тип LinearGradientBrush, который можно использовать тогда, когда нужно смешать два цвета в градиентной закраске. Работать с этим типом так же просто, как и с остальными типами кисти. Важным моментом здесь Является то, что при создании LinearGradientBrush нужно указать пару типов Color и значение для направления смешивания из перечня LinearGradientMode.
Читать дальше