Компьютерная графика, мультимедиа и игры на Visual C#

       

Методика анимации градиентного заполнения текста цветом 


Листинг 60.1. Объявление и инициализация глобальных переменных.

//Задаем ширину и высоту прямоугольника,

//внутри которого будет размещаться текст:

int width_of_rectangle = 700;

int height_of_rectangle = 300;

//Верхняя горизонтальная линия прямоугольника отстоит

//от оси 'x' на расстоянии boundary_of_rectangle_у:

int boundary_of_rectangle_у = 15;

//Левая вертикальная линия прямоугольника отстоит

//от оси 'y' на расстоянии boundary_of_rectangle_x:

int boundary_of_rectangle_x = 15;

//Объявляем целочисленные переменные

//и задаем значения:



int Shift_of_Gradient = 10;

int Step_of_Gradient = 5;

Дважды щелкаем по диалоговой панели Form1 в режиме проектирования и в появившийся шаблон записываем наш код, после чего метод принимает такой вид.

Листинг 60.2. Метод Form1_Load.

private void Form1_Load(object sender, EventArgs e)

{

      //Создаем объект myGraphics класса Graphics

      //и стираем (Clear) другие изображения:

      Graphics myGraphics = CreateGraphics();

      myGraphics.Clear(BackColor);

}

Чтобы подключить к работе таймер, дважды щелкаем значок для компонента Timer (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.

Листинг 60.3. Метод для компонента Timer.

private void timer1_Tick(object sender, EventArgs e)

{

        //Создаем объект myGraphics класса Graphics:

        Graphics myGraphics = CreateGraphics();

        //Рисуем четыре граничные линии прямоугольника,

        //внутри которого будет размещаться текст:

        myGraphics.DrawLine(new Pen(Color.Red, 3),

        boundary_of_rectangle_x, boundary_of_rectangle_у,

        width_of_rectangle, boundary_of_rectangle_у);

        myGraphics.DrawLine(new Pen(Color.Red, 3),

        boundary_of_rectangle_x, boundary_of_rectangle_у,

        boundary_of_rectangle_x, height_of_rectangle);

        myGraphics.DrawLine(new Pen(Color.Red, 3),

        boundary_of_rectangle_x, height_of_rectangle,


        width_of_rectangle, height_of_rectangle);
        myGraphics.DrawLine(new Pen(Color.Red, 3),
        width_of_rectangle, boundary_of_rectangle_у,
        width_of_rectangle, height_of_rectangle);
        // Задаем тип шрифта, размер текста и стиль
        //шрифта:
        Font drawFont = new Font("Times New Roman", 100,
                        FontStyle.Bold, GraphicsUnit.Point);
        //Записываем текст, цвет которого будет изменяться:
        string drawText = "Visual";
        //Задаем меру строки текста
        //при помощи метода MeasureString:
        SizeF SizeF_of_Text = new
        SizeF(myGraphics.MeasureString(drawText, drawFont));
        //Задаем точку, от которой
        //будет рисоваться текст,
        //сцентрированный внутри прямоугольника:
        PointF Start_of_drawPointF =
            new PointF(Convert.ToSingle((width_of_rectangle
                              - SizeF_of_Text.Width) / 2),
                       Convert.ToSingle((height_of_rectangle
                              - SizeF_of_Text.Height) / 2));
        //Задаем координаты начальной и конечной точек
        //градиентной заливки текста; изменяя эти координаты,
        //мы изменяем и анимационный эффект:
        PointF Start_of_Gradient_of_drawPointF =
                                           new PointF(0, 0);
        PointF End_of_Gradient_of_drawPointF =
                         new PointF(Shift_of_Gradient, 200);
        //Создаем объект drawBrush класса LinearGradientBrush
        //и задаем его параметры
        //для градиентной заливки текста:
        LinearGradientBrush drawBrush = new
        LinearGradientBrush(Start_of_Gradient_of_drawPointF,
        End_of_Gradient_of_drawPointF, Color.Red, BackColor);
        //Рисуем текст в центре прямоугольника:
        myGraphics.DrawString(drawText, drawFont,
        drawBrush, Start_of_drawPointF);


        //Высвобождаем ресурсы, выделенные объекту
        //myGraphics:
        myGraphics.Dispose();
        //Сдвигаем градиент заливки текста
        //на шаг Shift_of_Gradient;
        // заново начинаем цикл градиентной заливки текста,
        //когда величина Shift_of_Gradient
        //достигнет заданного значения:
        Shift_of_Gradient = Shift_of_Gradient +
        Step_of_Gradient;
        if (Shift_of_Gradient == 500)
            {
                  Step_of_Gradient = -5;
            }
            else if (Shift_of_Gradient == -50)
            {
                  Step_of_Gradient = 5;
            }
}
В этом коде главным является вызов перегруженного метода DrawString (класса Graphics) вида: Overloads Public Sub DrawString(String, Font, Brush, PointF).
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 60.4. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender,
                                         EventArgs e)
{
      timer1.Enabled = true;
      timer1.Interval = trackBar1.Value;
}
Согласно разработанной выше методике, чтобы иметь возможность приостановить (и запустить вновь) процесс анимации при помощи кнопки Stop Animation, дважды щелкаем эту кнопку в режиме проектирования (рис. 60.1). Появляется файл Form1.cs с шаблоном, выше которого объявляем переменную OffOn и присваиваем ей значение false:
//Объявляем булеву переменную OffOn
//и задаем ей значение, например, false:
bool OffOn = false;
После записи нашего кода шаблон принимает вид следующего метода.
Листинг 60.5. Метод для кнопки Stop Animation.
private void button1_Click(object sender, EventArgs e)
{
      //Задаем чередование остановки и возобновления анимации
      //после каждого щелчка кнопки button:


      if (OffOn == false)
      {
            //Приостанавливаем анимацию:
            timer1.Enabled = false;
            //Изменяем значение OffOn на противоположное:
            OffOn = true;
      }
      else
      {
            //Возобновляем анимацию:
            timer1.Enabled = true;
            //Изменяем значение OffOn на противоположное:
            OffOn = false;
      }
}
Листинг 60.6. Метод для компонента PrintDocument.
private void printDocument1_PrintPage(object sender,
               System.Drawing.Printing.PrintPageEventArgs e)
{
        //Создаем объект myGraphics класса Graphics:
        Graphics myGraphics = CreateGraphics();
        //Связываем объект myGraphics с текущим принтером:
        myGraphics = e.Graphics;
        //Рисуем четыре граничные линии прямоугольника,
        //внутри которого будет размещаться текст:
        myGraphics.DrawLine(new Pen(Color.Red, 3),
        boundary_of_rectangle_x, boundary_of_rectangle_у,
        width_of_rectangle, boundary_of_rectangle_у);
        myGraphics.DrawLine(new Pen(Color.Red, 3),
        boundary_of_rectangle_x, boundary_of_rectangle_у,
        boundary_of_rectangle_x, height_of_rectangle);
        myGraphics.DrawLine(new Pen(Color.Red, 3),
        boundary_of_rectangle_x, height_of_rectangle,
        width_of_rectangle, height_of_rectangle);
        myGraphics.DrawLine(new Pen(Color.Red, 3),
        width_of_rectangle, boundary_of_rectangle_у,
        width_of_rectangle, height_of_rectangle);
        // Задаем тип шрифта, размер текста и стиль
        //шрифта:
        Font drawFont = new Font("Times New Roman", 100,
                        FontStyle.Bold, GraphicsUnit.Point);
        //Записываем текст, цвет которого будет изменяться:
        string drawText = "Visual";
        //Задаем меру строки текста
        //при помощи метода MeasureString:
        SizeF SizeF_of_Text = new
        SizeF(myGraphics.MeasureString(drawText, drawFont));


        //Задаем точку, от которой
        //будет рисоваться текст,
        //сцентрированный внутри прямоугольника:
        PointF Start_of_drawPointF =
            new PointF(Convert.ToSingle((width_of_rectangle
                              - SizeF_of_Text.Width) / 2),
                       Convert.ToSingle((height_of_rectangle
                              - SizeF_of_Text.Height) / 2));
        //Задаем координаты начальной и конечной точек
        // градиентной заливки текста; изменяя эти координаты,
        //мы изменяем и анимационный эффект:
        PointF Start_of_Gradient_of_drawPointF =
                                           new PointF(0, 0);
        PointF End_of_Gradient_of_drawPointF =
                         new PointF(Shift_of_Gradient, 200);
        //Создаем объект drawBrush класса LinearGradientBrush
        //и задаем его параметры
        //для градиентной заливки текста:
        LinearGradientBrush drawBrush = new
        LinearGradientBrush(Start_of_Gradient_of_drawPointF,
        End_of_Gradient_of_drawPointF, Color.Red, BackColor);
        //Рисуем текст в центре прямоугольника:
        myGraphics.DrawString(drawText, drawFont,
        drawBrush, Start_of_drawPointF);
        //Высвобождаем ресурсы, выделенные объекту
        //myGraphics:
     myGraphics.Dispose();
}
Теперь дважды щелкаем кнопку Print (рис. 60.1). Открывается файл Form1.cs с шаблоном, в который записываем код из предыдущей главы. В режиме выполнения (можно, но не обязательно это делать, остановить градиентную заливку текста в интересующий нас момент при помощи кнопки Stop Animation) после щелчка кнопки Print появляется стандартная панель Print, на которой мы оставляем по умолчанию принтер и параметры печати. После щелчка кнопки OK на панели Print принтер печатает прямоугольник и анимационный текст в том положении, который был на экране монитора в момент щелчка кнопки Print. Если печатается не весь прямоугольник с текстом, то в панели Print вместо включенного по умолчанию переключателя Портрет (Portrait)
выбираем переключатель Ландшафт (Landscape), так как Form1 вытянута слева – направо, рис. 60.2.
Щелкая кнопку Print в различные моменты изменения (анимации) изображения, мы получим на принтере распечатки различных (во времени) положений анимационного текста внутри прямоугольника.
Таким образом, по разработанной в данной главе методике можно спроектировать анимацию на экране монитора и печать текущего положения анимации на принтере для любого текста внутри любого элемента управления для приложений различных типов.

Содержание раздела