- •Пространство имен System.Drawing
- •7 Сеансы вывода графики
- •8 Перехват события Paint
- •9 Метод Invalidate
- •11 Вывод графических объектов без события Paint
- •14Система координат. Альтернативные единицы измерения
- •Перенос начала координат
- •15 Цвет
- •19 Перечисления Drawing.Drawing2d
- •18 Пространство имен System.Drawing.Drawing2d
- •Кисти и краски
- •Паутина Безье
- •Событие Paint
Кисти и краски
Создадим в нашем проекте новую форму RandomShapes, в которой будем рисовать и закрашивать геометрические фигуры трех разных типов - эллипсы, сектора, прямоугольники. Для каждого типа фигуры будем использовать свой тип кисти: эллипсы будем закрашивать градиентной кистью, сектора - сплошной, а прямоугольники - узорной. Цвет фигуры, ее размеры и положение будем выбирать случайным образом. Рисование фигур будет инициироваться в обработчике события Click. При каждом щелчке кнопкой мыши на форме будут рисоваться три новых экземпляра фигур каждого типа. В отличие от кривых Безье, старые фигуры стираться не будут.
На рис. 24.15 показана форма после нескольких щелчков кнопки мыши. Конечно, черно-белый рисунок в книге не может передать цвета, особенно смену оттенков для градиентной кисти. На экране дисплея или цветном рисунке все выглядит красивее.
А теперь приведем программный код, реализующий рисование. Начнем, как обычно, с полей класса:
//fields
int cx,cy;
Graphics graph;
Brush brush;
Color color;
Random rnd;
Инициализация полей производится в методе MyInit, вызываемом конструктором класса:
Рис. 24.15. Рисование кистями разного типа
void MyInit()
{
cx = ClientSize.Width;
cy = ClientSize.Height;
graph = CreateGraphics();
rnd = new Random();
}
Рассмотрим теперь основной метод, реализующий рисование фигур различными кистями:
void DrawShapes()
{
for(int i=0; i<3; i++)
{
//выбирается цвет - красный, желтый, голубой
int numcolor = rnd.Next(3);
switch (numcolor)
{
case 0:
color = Color.Blue; break;
case 1:
color = Color.Yellow; break;
case 2:
color = Color.Red; break;
}
//градиентной кистью рисуется эллипс,
//местоположение случайно
Point top = new Point(rnd.Next(cx), rnd.Next(cy));
Size sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));
Rectangle rct = new Rectangle(top, sz);
Point bottom = top + sz;
brush = new LinearGradientBrush(top, bottom,
Color.White,color);
graph.FillEllipse(brush,rct);
//сплошной кистью рисуется сектор,
//местоположение случайно
top = new Point(rnd.Next(cx), rnd.Next(cy));
sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));
rct = new Rectangle(top, sz);
brush = new SolidBrush(color);
graph.FillPie(brush,rct,30f,60f);
//узорной кистью рисуется прямоугольник,
//местоположение случайно
top = new Point(rnd.Next(cx), rnd.Next(cy));
sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));
rct = new Rectangle(top, sz);
HatchStyle hs = (HatchStyle)rnd.Next(52);
brush = new HatchBrush(hs,Color.White, Color.Black);
graph.FillRectangle(brush,rct);
}
}
Приведу некоторые комментарии в дополнение к тем, что встроены в текст метода. Здесь многое построено на работе со случайными числами. Случайным образом выбирается один из возможных цветов для рисования фигуры, ее размеры и положение. Наиболее интересно рассмотреть создание кистей разного типа. Когда создается градиентная кисть.
brush = new LinearGradientBrush(top, bottom, Color.White,color);
то нужно в конструкторе кисти задать две точки и два цвета. Точки определяют интервал изменения оттенков цвета от первого до второго. В начальной точке имеет место первый цвет, в конечной - второй, в остальных точках - их комбинация. Разумно, как это сделано у нас, в качестве точек выбирать противоположные углы прямоугольника, ограничивающего рисуемую фигуру.
Наиболее просто задается сплошная кисть:
brush = new SolidBrush(color);
Для нее достаточно указать только цвет. Для узорной кисти нужно задать предопределенный тип узора, всего их возможно 52. В нашем примере тип узора выбирается случайным образом:
HatchStyle hs = (HatchStyle)rnd.Next(52);
brush = new HatchBrush(hs,Color.White, Color.Black);
Помимо первого аргумента, задающего тип узора, указываются еще два цвета - первый определяет цвет повторяющегося элемента, второй - цвет границы между элементами узора.
Непосредственное рисование кистью осуществляют методы группы Fill:
graph.FillEllipse(brush,rct);
graph.FillPie(brush,rct,30f,60f);
graph.FillRectangle(brush,rct);
Первый аргумент всегда задает кисть, а остальные зависят от типа рисуемой фигуры. Как правило, всегда задается прямоугольник, ограничивающий данную фигуру.
Вызов метода DrawShapes, как уже говорилось, встроен в обработчик события Click формы RandomShapes:
private void RandomShapes_Click(object sender, System.EventArgs e)
{
DrawShapes();
}
