Шаг 61.
Microsoft Visual C++ 2010. Начала.
Программирование. Графика. Кисть (градиентная)

    На этом шаге мы рассмотрим особенности использования кисти этого типа.

    Чтобы закрасить область градиентом, надо создать градиентную кисть. При создании кисти конструктору передаются линия градиента и две константы, определяющие цвет градиента. Например:

  myBrush = gcnew System::Drawing::Drawing2D::LinearGradientBrush
    (Point(10,10),Point(110,10), Color::Red, Color::White);

    После того как градиентная кисть будет создана, ее можно использовать для закраски области:

  e->Graphics->FillRectangle(myBrush,10,10,100,40);

    Результат работы приложения приведен на рисунке 1.


Рис.1. Градиентная кисть

Архив проекта можно взять здесь.

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

    Иногда возникает необходимость, используя один и тот же градиент, закрасить несколько областей разного размера. Если попытаться закрасить область большего размера градиентной кистью меньшего размера, то область большего размера будет выглядеть так, как показано на рисунке 2.


Рис.2. Закраска области градиентной кистью, когда размер градиентной кисти не соответствует размеру области

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

private: System::Void pictureBox1_Paint(System::Object^  sender,
		 System::Windows::Forms::PaintEventArgs^  e) {
	Rectangle myRect = Rectangle(20,10,200,40);
	System::Drawing::Drawing2D::LinearGradientBrush^ myBrush =
		gcnew System::Drawing::Drawing2D::LinearGradientBrush 
	 	 	 (myRect,Color::Red,Color::White,0.0f,true);
	e->Graphics->FillRectangle(myBrush, myRect);

	// изменить цвет
	array<Color>^ nc; // nc - NewColor
	nc = gcnew array<Color>(2);
	nc[0] = Color::Green;
	nc[1] = Color::Yellow;
	myBrush->LinearColors = nc;

	// Так как будем закрашивать область другого размера,
	// то надо изменить размер градиентной кисти
	array<Point>^ transformArray =
		{Point(20,60),Point(420,60),Point(20,100)};
	System::Drawing::Drawing2D::Matrix^ myMatrix = gcnew 
		System::Drawing::Drawing2D::Matrix(myRect,transformArray);
	myBrush->MultiplyTransform(myMatrix, 
		System::Drawing::Drawing2D::MatrixOrder::Prepend);

	// рисуем новой кистью
	e->Graphics->FillRectangle(myBrush, 20, 60, 400, 40);

	// восстановить размер кисти
	myBrush->ResetTransform();

	// рисуем область такого же размера, как и первую
	e->Graphics->FillRectangle(myBrush, 20, 120, 200, 40);
 }
Архив проекта можно взять здесь.

    Результат работы функции приведен на рисунке 3.


Рис.3. Несколько градиентных кистей

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

    Остановимся на четвертом аргументе. Кисть LinearGradientBrush позволяет реализовать плавный переход от одного цвета к другому, причем первый цвет переходит во второй под определенным углом (задается в градусах), который определяется четвертым параметром. Угол, равный 0, означает, что переход от одного цвета к другому осуществляется слева направо. Угол, равный 90 градусам, - что сверху вниз. Существует еще одна разновидность кисти - PathGradientBrush, позволяющая создавать сложный эффект затенения, при котором используется изменение цвета от середины рисуемого пути к его краям.

    Пятый параметр имеет логическое значение. Если он имеет значение true, то это означает, что угол затрагивается преобразованием, связанным с этим объектом LinearGradientBrush; в противном случае, устанавливается значение false.

    После закраски прямоугольника градиентной кистью, определяется массив nc, который содержит новые цвета градиентной кисти. Для переопределения цвета используется свойство LinearColors:

	array<Color>^ nc; // nc - NewColor
	nc = gcnew array<Color>(2);
	nc[0] = Color::Green;
	nc[1] = Color::Yellow;
	myBrush->LinearColors = nc;

    Теперь изменим размер кисти, так как будем закрашивать область другого размера.

    Для преобразования создадим объект класса Matrix, воспользовавшись следующим конструктором:

	System::Drawing::Drawing2D::Matrix^ myMatrix = gcnew 
		System::Drawing::Drawing2D::Matrix(myRect,transformArray);

    Здесь первый параметр определяет преобразовываемый прямоугольник, а второй - как преобразовать этот прямоугольник:

	array<Point>^ transformArray =
		{Point(20,60),Point(420,60),Point(20,100)};
Этот параметр представляет из себя массив из трех структур Point, определяющих точки параллелограмма, в которые преобразуются левый верхний, правый верхний и левый нижний углы прямоугольника. Правый нижний угол параллелограмма выражается из первых трех углов.

    Теперь можно преобразовать кисть. Это выполняется методом:

	myBrush->MultiplyTransform(myMatrix, 
		System::Drawing::Drawing2D::MatrixOrder::Prepend);
Здесь первый параметр определяет собственно преобразование, а второй - порядок выполнения операций матричных преобразований:

    В заключение отметим, что возврат кисти "старого" размера (но не цвета!) осуществляется с помощью метода ResetTransform().

    Со следующего шага мы начнем рассматривать графические примитивы.




Предыдущий шаг Содержание Следующий шаг