Выбрать главу

На рис. 24.15 показана форма после нескольких щелчков кнопки мыши. Конечно, черно-белый рисунок в книге не может передать цвета, особенно смену оттенков для градиентной кисти. На экране дисплея или цветном рисунке все выглядит красивее.

А теперь приведем программный код, реализующий рисование. Начнем, как обычно, с полей класса:

//fields int сх, су;

    Graphics graph;

    Brush brush;

    Color color;

    Random rnd;

Инициализация полей производится в методе MyInit, вызываемом конструктором класса:

Рис. 24.15. Рисование кистями разного типа

void MyInit()

   {

       сх = ClientSize.Width;

       су = 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 ret = new Rectangle (top, sz);

         Point bottom = top + sz;

         brush = new LinearGradientBrush(top, bottom,

         Color.White,color);

         graph.FillEllipse(brush,ret);

         //сплошной кистью рисуется сектор,

         //местоположение случайно

         top = new Point(rnd.Next(cx), rnd.Next(cy));

         sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));

         ret = new Rectangle(top, sz);

         brush = new SolidBrush(color);

         graph.FillPie(brush,ret,30 f,60 f);

         //узорной кистью рисуется прямоугольник,

         //местоположение случайно

         top = new Point(rnd.Next(cx), rnd.Next(cy));

         sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));

         ret = new Rectangle(top, sz);

         HatchStyle hs = (HatchStyle)rnd.Next(52);

         brush = new HatchBrush(hs,Color.White, Color.Black);

         graph.FillRectangle (brush,ret);

    }

}

Приведу некоторые комментарии в дополнение к тем, что встроены в текст метода. Здесь многое построено на работе со случайными числами. Случайным образом выбирается один из возможных цветов для рисования фигуры, ее размеры и положение. Наиболее интересно рассмотреть создание кистей разного типа. Когда создается градиентная кисть.

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,ret);

graph.FillPie(brush, ret,30f,60f);

graph.FillRectangle(brush,ret);

Первый аргумент всегда задает кисть, а остальные зависят от типа рисуемой фигуры. Как правило, всегда задается прямоугольник, ограничивающий данную фигуру.

Вызов метода DrawShapes, как уже говорилось, встроен в обработчик события Click формы RandomShapes:

private void RandomShapes_Click(object sender, System.EventArgs e)

{

   DrawShapes();

}

На этом поставим точку в рассмотрении данной темы. По сути, этим завершается и наш учебный курс. В последней лекции будет рассмотрен некоторый заключительный проект.

25. Финальный проект

В этой заключительной лекции новый материал появляться не будет, не будет и традиционных вопросов в конце лекции. Лекция особенная — она посвящена описанию финального проекта, в котором объединены многие, надеюсь, уже хорошо знакомые элементы.