Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Способы задания цвета



Во всех примерах, приводимых ранее, был использован единственный способ задания цвета - получение цвета, определённого системой. Между тем, тип Color позволяет представлять цвета не только с помощью предопределённых констант, но и в терминах каналов: альфа (прозрачность), зелёного, синего и красного. Метод FromArgb, создающий структуру Color из заданных значений четырёх указанных компонентов, может быть вызван любым из описанных ниже способов.

· Зависящее от порядка байтов 32-разрядное значение ARGB представлено в виде AARRGGBB. Самый старший байт, представленный в виде AA, является значением альфа-компонента. Второй, третий и четвертый байты, представленные в виде RR, GG и BB, являются, соответственно, красным, зеленым и синим компонентами цвета. Таким образом, все следующие строки кода определяют перо красного цвета, но эти перья имеют разную прозрачность.

Pen^ light_red_pen1 = gcnew Pen(Color::FromArgb(0x78FF0000));

Pen^ light_red_pen2 = gcnew Pen(Color::FromArgb(0x178FF0000));

Pen^ light_red_pen3 = gcnew Pen(Color::FromArgb(0x25FF0000));

· Определение цвета через сочетание трех компонентов (красный, зелёный, синий). Значение альфа неявно задаётся как 255 - перо полностью непрозрачно.

Pen^ green_pen = gcnew Pen(Color::FromArgb(0, 255, 0));

· Создание структуры Color из четырёх значений компонентов ARGB.

Pen^ light_blue_pen = gcnew Pen(Color::FromArgb(135, 0, 0, 255));

3.3 Graphics: методы заливки

Разумеется, хотелось бы уметь рисовать фигуры со сплошной заливкой, а не только их контуры. Конечно, есть простой способ, на котором было основано построение графиков: зададим достаточно маленький шаг приращения, и будем рисовать концентрические фигуры нужной нам формы. Но без этого можно обойтись: в GDI+ существует класс Brush, который определяет объекты, служащие для заливки внутренней области замкнутых фигур. Доступные стили заливки достаточно разнообразны: сплошной цвет, штриховка (более пятидесяти шаблонов), текстура с изображением, цветовой градиент.

Чтобы нарисовать сплошную фигуру, нужно создать объект SolidBrush, LinearGradientBrush или TextureBrush, и передать его в качестве параметра одному из методов заливки класса Graphics. Эти методы перечислены в таблице. От соответствующих методов рисования контурных фигур они отличаются всего одним параметром: вместо пера Pen, определяющего стиль контура фигуры, передаётся кисть Brush, указывающая способ его заполнения.

3.4 Brush: кисточка для заливки

Класс Brush представляет собой абстрактный базовый класс, который не может быть реализован. Для получения объекта «кисть» используются производные от него классы: SolidBrush, LinearGradientBrush, TextureBrush.

· Сплошная заливка фигуры.

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

System::Drawing::Graphics ^g=my_form::CreateGraphics();

// Инициализация одноцветной кисти.

SolidBrush^ green_brush = gcnew SolidBrush(Color::Green);

// Определение границ эллипса.

Rectangle rect = Rectangle(30,20,150,140);

// Вывод фигуры на экран.

g->FillPie(green_brush, rect, 15, 245);

· Использование шаблона штриховки.

Шаблон штриховки содержит два цвета: цвет фона и цвет линий. Для штриховой заливки фигуры используется объект HatchBrush. Его конструктор принимает три параметра: цвет фона, цвет линий и стиль штриховки - любое значение из перечисления HatchStyle, указывающего около 50 различных шаблонов. В приведённом ниже коде, выполняющем рисование нескольких заштрихованных фигур, использованы некоторые из них.

System::Drawing::Graphics ^g=my_form::CreateGraphics();

/* Инициализация кисти. Стиль штриховки - сетка из вертикальных и горизонтальных линий.*/

System::Drawing::Drawing2D::HatchBrush^ funny_brush

= gcnew System::Drawing::Drawing2D::HatchBrush

(System::Drawing::Drawing2D::HatchStyle::Cross/*стиль штриховки*/,\

Color::Yellow/*цвет штриховки*/,Color::Green/*цвет фона*/);

Rectangle rect = Rectangle(30,20,50,40);

// Заштрихованный эллипс.

g->FillEllipse(funny_brush, rect, 15, 245);

/*Зададим 40-процентную штриховку. Отношение цвета переднего плана к цвету фона равно 40:100.*/

funny_brush = gcnew System::Drawing::Drawing2D::HatchBrush

(System::Drawing::Drawing2D::HatchStyle::Persent40/*стиль штриховки*/,\

Color::Yellow/*цвет штриховки*/,Color::Red/*цвет фона*/);

rect=Rectangle(100, 20, 160, 60);

// Заштрихованный прямоугольник.

g->FillRectangle(funny_brush, rect, 15, 245);

/*Определим штриховку, выглядящую как шары, расположенные рядом друг с другом.*/

shadowBrush= gcnew System::Drawing::Drawing2D::HatchBrush

(System::Drawing::Drawing2D::HatchStyle::Sphere,\

Color::Yellow, Color::CornflowerBlue);

array<Point>^ points ={Point(300,100),Point(250,250),Point(50,50)};

// Заштрихованный треугольник.

grr->FillPolygon(shadowBrush, control_points);

Описанные выше способы заливки демонстрируются в окне «примеры» по нажатию на кнопку «сплошная заливка, штриховка».

· Текстура с изображением.

Для заливки замкнутой фигуры текстурой используются объекты и методы классов Image и TextureBrush. Объект Image передаётся конструктору класса TextureBrush в качестве параметра и определяет текстуру, которая будет использоваться для заливки. При использовании текстурной кисти происходит заполнение внутренней части фигуры повторяющимися копиями данного изображения.

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

Результат выполнения подобного кода можно увидеть, нажав на кнопку «заливка текстурой» в окне «примеры».

void texture_fill()

{

System::Drawing::Graphics ^g=my_example_form::CreateGraphics();

g->Clear(Color::GreenYellow);

System::Drawing::Image^ element =System::Drawing::\

Image::FromFile("bee.jpg");

//определение текстурной кисти

TextureBrush^ bee_brush = gcnew TextureBrush(element);

//заполнение немасштабированным избражением

g->FillRectangle(bee_brush,50,20,170,95);

//заполнение масштабированным избражением

bee_brush->ScaleTransform(.5/*сжатие по оси х*/,.5/*сжатие по оси y*/);

g->FillRectangle(bee_brush,240,20,170,95);

//отражение по вертикали

bee_brush->WrapMode=System::Drawing::Drawing2D::\

WrapMode::TileFlipY;

g->FillRectangle(bee_brush,50,140,170,95);

//отражение по горизонтали

bee_brush->WrapMode=System::Drawing::Drawing2D::\

WrapMode::TileFlipX;

g->FillRectangle(bee_brush,240,140,170,95);

//отражение в двух направлениях

bee_brush->WrapMode=System::Drawing::Drawing2D::\

WrapMode::TileFlipXY;

g->FillRectangle(bee_brush,50,260,170,95);

/*поворот шаблона текстуры на 30 градусов, отсчёт по часовой стрелке от оси х; настройки отражения сохранены.*/

bee_brush->RotateTransform(30.0);

g->FillRectangle(bee_brush,240,260,170,95);

delete bee_brush;

delete g;

}

· Цветовой градиент.

Градиентная кисть используется для заливки фигуры плавно изменяющимся цветом. Цвет может изменяться по мере движения вдоль какой-либо прямой (линейный градиент) или по мере движения вдоль контура закрашиваемой фигуры (градиент контура). Для использования градиентной кисти необходимо указать в начале файла пространство имён System::Drawing::Drawing2D.

using namespace System::Drawing::Drawing2D;

void draw_gradient ()

{

System::Drawing::Graphics ^g= example_form::CreateGraphics();

g->Clear(Color::White);

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

LinearGradientBrush^ grad_br = gcnew LinearGradientBrush(

Point(0, 10),/*начальная точка*/

Point(200, 34),/*конечная точка*/

Color::FromArgb(65, 255, 0, 0), /*цвет в начальной точке*/

Color::FromArgb(45, 0, 0, 255)); /*цвет в конечной точке*/

//Пример создания пера на основе имеющейся кисти.

Pen^ pen = gcnew Pen(grad_br,6.0);

/*По умолчанию градиент меняется равномерно при переходе от одного цвета к другому. Настроим неравномерный переход.*/

array<float>^ mix = { 0.0f, 0.5f, 1.0f };

/*Массив коэффициентов смешения, определяющих соотношение начального и конечного цветов в некоторых точках траектории.*/

array<float>^ pos = { 0.0f, 0.2f, 1.0f };

/*массив коэффициентов позиций*/

/*Объект Blend содержит соответствующие массивы коэффициентов смешения и позиций. Коэффициенты смешения определяют процентные отношения начального и конечного цветов, используемые для соответствующей позиции. Позиции задаются в виде долей расстояния по линии градиента.*/

Blend^ blend = gcnew Blend();

blend->Factors = mix;

blend->Positions = pos;

grad_br->Blend = blend;

//определение градиента контура

g->DrawLine(pen, 0, 10, 400, 88);

g->FillEllipse(grad_br, 0, 30, 200, 100);

g->FillRectangle(grad_br, 0, 155, 500, 30);

//определение пути для создания градиента контура

GraphicsPath^ path = gcnew GraphicsPath();

path->AddEllipse(20, 20, 140, 70);

//создание кисти

PathGradientBrush^ p_grad_br = gcnew PathGradientBrush(path);

//цвет в центре контура

p_grad_br->CenterColor = Color::FromArgb(255, 0, 0, 255);

//цвет кисти на границе контура

array<Color>^ colors = { Color::FromArgb(255, 0, 255, 255) };

p_grad_br->SurroundColors = colors;

/*По умолчанию центральной точкой кисти градиента контура является центр контура, используемого при создании этой кисти. Его можно изменить, установив значение свойства CenterPoint.*/

p_grad_br->CenterPoint = PointF(120, 40);

/*По умолчанию кисть градиента контура не расширяется на области вне границы этого контура. Если кисть градиента контура используется для заливки фигуры, которая заходит за границу данного контура, области вне границы контура не заливаются. Поэтому на экране будет отбражён не прямоугольник, а эллипс.*/

g->FillRectangle(p_grad_br, 20, 20, 140, 70);

}





Дата публикования: 2015-04-10; Прочитано: 817 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.013 с)...