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

Листинг 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 в различные моменты изменения (анимации) изображения, мы получим на принтере распечатки различных (во времени) положений анимационного текста внутри прямоугольника.

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


Наши рекомендации