Додайте прозорість градієнтної сітки XPS

Файли XPS можна використовувати для відображення великої кількості візуальної інформації. Вони підтримують текст, зображення, прозорість об’єктів, сітки, градієнти та багато інших функцій. Ви можете вставляти градієнт, сітку та прозорі об’єкти у файли XPS відповідно до ваших вимог. У цій статті ми детально розглянемо ці функції разом із різними прикладами та випадками використання. Давайте пройдемося по наступних темах:

Встановлення XPS API для C++

Ви можете швидко та легко налаштувати API Aspose.Page for C++ у своїх програмних програмах для роботи з XPS, PS, EPS та іншими підтримуваними форматами файлів. Просто завантажте файл DLL з офіційного Downloads або встановіть його з галереї NuGet за допомогою команди нижче:

PM> Install-Package Aspose.Page.Cpp 

Додавання градієнта у файл XPS за допомогою C++

Іноді потрібно додати градієнт у файли XPS. Ви можете маніпулювати файлом XPS, оскільки API дозволяє додавати лінійний, горизонтальний і вертикальний градієнт. Давайте додамо такі градієнти у файл XPS:

Додайте вертикальний градієнт у файл XPS за допомогою C++

Ви можете легко додати вертикальний градієнт у файли XPS за допомогою кількох простих викликів API. Нижче наведено кроки для додавання вертикального градієнта:

  1. Створіть новий документ XPS
  2. Ініціалізувати список XpsGradientStop
  3. Створіть новий шлях, визначивши геометрію
  4. Збережіть отриманий документ XPS

Наведений нижче код базується на цих кроках і демонструє, як додати вертикальний градієнт у файл XPS за допомогою C++:

// Створіть новий документ XPS
auto doc = System::MakeObject<XpsDocument>();

// Ініціалізувати список XpsGradientStop
auto stops = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>>();
stops->Add(doc->CreateGradientStop(doc->CreateColor(253, 255, 12, 0), 0.f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(252, 255, 154, 0), 0.359375f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(252, 255, 56, 0), 0.424805f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(253, 255, 229, 0), 0.879883f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(252, 255, 255, 234), 1.f));

// Створіть новий шлях, визначивши геометрію у формі абревіатури
System::SharedPtr<XpsPath> path = doc->AddPath(doc->CreatePathGeometry(u"M 10,110 L 228,110 228,200 10,200"));
path->set_RenderTransform(doc->CreateMatrix(1.f, 0.f, 0.f, 1.f, 20.f, 70.f));
path->set_Fill(doc->CreateLinearGradientBrush(System::Drawing::PointF(10.f, 110.f), System::Drawing::PointF(10.f, 200.f)));
(System::DynamicCast<Aspose::Page::Xps::XpsModel::XpsGradientBrush>(path->get_Fill()))->get_GradientStops()->AddRange(stops);

// Збережіть отриманий документ XPS
doc->Save(RunExamples::outDir() + u"AddVerticalGradient_out.xps");

Додайте горизонтальний градієнт у XPS за допомогою C++

Іншим можливим варіантом градієнта у файлах XPS є горизонтальний градієнт. Підхід додавання горизонтального градієнта трохи пов’язаний із випадком використання, який ми обговорювали вище. Нижче наведено кроки, які потрібно виконати, щоб додати горизонтальний градієнт:

  1. Створіть новий документ XPS
  2. Укажіть межі градієнта за допомогою XpsGradientStop
  3. Створіть контур із геометрією
  4. Збережіть вихідний документ XPS

У наступному фрагменті коду пояснюється, як додати горизонтальний градієнт у файли XPS за допомогою C++:

// Створіть новий документ XPS
auto doc = System::MakeObject<XpsDocument>();

// Ініціалізувати список XpsGradientStop
System::SharedPtr<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>> stops = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>>();
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 244, 253, 225), 0.0673828f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 251, 240, 23), 0.314453f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 252, 209, 0), 0.482422f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 241, 254, 161), 0.634766f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 53, 253, 255), 0.915039f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 12, 91, 248), 1.f));

// Створіть новий шлях, визначивши геометрію у формі абревіатури
System::SharedPtr<XpsPath> path = doc->AddPath(doc->CreatePathGeometry(u"M 10,210 L 228,210 228,300 10,300"));
path->set_RenderTransform(doc->CreateMatrix(1.f, 0.f, 0.f, 1.f, 20.f, 70.f));
path->set_Fill(doc->CreateLinearGradientBrush(System::Drawing::PointF(10.f, 0.f), System::Drawing::PointF(228.f, 0.f)));
(System::DynamicCast<Aspose::Page::Xps::XpsModel::XpsGradientBrush>(path->get_Fill()))->get_GradientStops()->AddRange(stops);

// Збережіть отриманий документ XPS
doc->Save(RunExamples::outDir() + u"AddHorizontalGradient_out.xps");

Вставте сітку у файл XPS за допомогою C++

API Aspose.Page for C++ дозволяє відтворювати сітки у файлах XPS із багатьма властивостями для керування відтворенням. Давайте розглянемо приклад вставки сітки у файл XPS у ваших програмах на основі C++. Ви можете працювати з цією функцією, виконавши наведені нижче дії.

  1. Ініціалізація об’єкта класу XpsDocument
  2. Укажіть геометрію для сітки VisualBrush
  3. Створіть Canvas для пурпурової сітки VisualBrush
  4. Створіть візуальний пензель і додайте сітку
  5. Збережіть вихідний файл XPS

Наведений нижче код базується на цих кроках і пояснює, як вставити сітку у файли XPS за допомогою C++:

auto doc = System::MakeObject<XpsDocument>();

// Геометрія для пурпурової сітки VisualBrush
System::SharedPtr<XpsPathGeometry> pathGeometry = doc->CreatePathGeometry();
pathGeometry->AddSegment(doc->CreatePolyLineSegment(System::MakeArray<System::Drawing::PointF>({ System::Drawing::PointF(240.f, 5.f), System::Drawing::PointF(240.f, 310.f), System::Drawing::PointF(0.f, 310.f) })));
pathGeometry->idx_get(0)->set_StartPoint(System::Drawing::PointF(0.f, 5.f));

// Полотно для пурпурової сітки VisualBrush
System::SharedPtr<XpsCanvas> visualCanvas = doc->CreateCanvas();

System::SharedPtr<XpsPath> visualPath = visualCanvas->AddPath(doc->CreatePathGeometry(u"M 0,4 L 4,4 4,0 6,0 6,4 10,4 10,6 6,6 6,10 4,10 4,6 0,6 Z"));
visualPath->set_Fill(doc->CreateSolidColorBrush(doc->CreateColor(1.f, .61f, 0.1f, 0.61f)));

System::SharedPtr<XpsPath> gridPath = doc->CreatePath(pathGeometry);

//Створити візуальний пензель, який визначається деяким фрагментом XPS (векторна графіка та гліфи)
gridPath->set_Fill(doc->CreateVisualBrush(visualCanvas, System::Drawing::RectangleF(0.f, 0.f, 10.f, 10.f), System::Drawing::RectangleF(0.f, 0.f, 10.f, 10.f)));
(System::DynamicCast<Aspose::Page::Xps::XpsModel::XpsVisualBrush>(gridPath->get_Fill()))->set_TileMode(Aspose::Page::Xps::XpsModel::XpsTileMode::Tile);

// Нове полотно
System::SharedPtr<XpsCanvas> canvas = doc->AddCanvas();
canvas->set_RenderTransform(doc->CreateMatrix(1.f, 0.f, 0.f, 1.f, 268.f, 70.f));

// Додайте сітку
canvas->AddPath(gridPath);

// Червоний прозорий прямокутник посередині вгорі
System::SharedPtr<XpsPath> path = canvas->AddPath(doc->CreatePathGeometry(u"M 30,20 l 258.24,0 0,56.64 -258.24,0 Z"));
path = canvas->AddPath(doc->CreatePathGeometry(u"M 10,10 L 228,10 228,100 10,100"));
path->set_Fill(doc->CreateSolidColorBrush(doc->CreateColor(1.0f, 0.0f, 0.0f)));
path->set_Opacity(0.7f);

// Збережіть отриманий документ XPS
doc->Save(RunExamples::outDir() + u"AddGrid_out.xps");

Вставте прозорий об’єкт у файл XPS за допомогою C++

Ще одна цікава функція для роботи з файлами XPS — підтримка прозорості та непрозорості. Вам може знадобитися додати прозорі об’єкти до файлу XPS за різних сценаріїв. Цього можна досягти за допомогою наступних кроків:

  1. Створити новий документ XPS
  2. Створіть контур із замкнутою прямокутною геометрією
  3. Додайте геометрію для різних шляхів
  4. Збережіть вихідний документ XPS

Ці кроки супроводжуються наступним кодом, який демонструє, як додати прозорий об’єкт у файл XPS за допомогою мови програмування C++:

// Створіть новий документ XPS
auto doc = System::MakeObject<XpsDocument>();

// Просто щоб продемонструвати прозорість
doc->AddPath(doc->CreatePathGeometry(u"M120,0 H400 v1000 H120"))->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Gray()));
doc->AddPath(doc->CreatePathGeometry(u"M300,120 h600 V420 h-600"))->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Gray()));

// Створіть контур із замкнутою прямокутною геометрією
System::SharedPtr<XpsPath> path1 = doc->CreatePath(doc->CreatePathGeometry(u"M20,20 h200 v200 h-200 z"));
// Встановіть синю суцільну кисть для заповнення path1
path1->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Blue()));
// Додайте його на поточну сторінку
System::SharedPtr<XpsPath> path2 = doc->Add(path1);

// path1 і path2 однакові, як тільки path1 не було розміщено всередині жодного іншого елемента
// (це означає, що path1 не мав батьківського елемента).
// Через це колір прямокутника на сторінці фактично стає зеленим
path2->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Green()));

// Тепер додайте path2 ще раз. Тепер path2 має батьківський елемент. Отже, path3 не буде таким же, як path2.
// Таким чином на сторінці з'являється новий прямокутник ...
System::SharedPtr<XpsPath> path3 = doc->Add(path2);
// ... і ми переводимо його на 300 одиниць нижче ...
path3->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 300.0f));
// ... і встановіть суцільний червоний пензель, щоб заповнити його
path3->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Red()));

// Створіть новий path4 з геометрією path2 ...
System::SharedPtr<XpsPath> path4 = doc->AddPath(path2->get_Data());
// ... перемістіть його на 300 одиниць вправо ...
path4->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 300.0f, 0.0f));
// ... і встановіть синю суцільну заливку
path4->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Blue()));

// Додайте path4 ще раз.
System::SharedPtr<XpsPath> path5 = doc->Add(path4);
// path4 і path5 знову не однакові ...
// (перемістити path5 на 300 одиниць нижче)
path5->set_RenderTransform(path5->get_RenderTransform()->Clone());
// щоб від’єднати значення RenderTransform від path4 (див. наступний коментар щодо властивості Fill)
path5->get_RenderTransform()->Translate(0.0f, 300.0f);
// ... але якщо ми встановимо непрозорість властивості Fill, це діятиме як для path5, так і для path4
// оскільки пензель — це складне значення властивості, яке залишається незмінним для path5 і path4
path5->get_Fill()->set_Opacity(0.8f);

// Створіть новий шлях6 із геометрією шляху2...
System::SharedPtr<XpsPath> path6 = doc->AddPath(path2->get_Data());
// ... перемістіть його на 600 одиниць вправо ...
path6->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 600.0f, 0.0f));
// ... і встановіть жовту суцільну заливку
path6->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Yellow()));

// Тепер додайте клон path6 ...
System::SharedPtr<XpsPath> path7 = doc->Add(path6->Clone());
// (перемістити path5 на 300 одиниць нижче)
path7->set_RenderTransform(path7->get_RenderTransform()->Clone());
path7->get_RenderTransform()->Translate(0.0f, 300.0f);
// ... і встановити непрозорість для path7
path7->get_Fill()->set_Opacity(0.8f);
// Тепер непрозорість діє незалежно, як тільки значення властивостей клонуються разом з елементом

// Наступний блок коду еквівалентний попередньому.
// Додайте сам path6. path6 і path7 не однакові. Хоча значення властивостей Fill однакові 
//XpsPath path7 = doc.Add(path6);
//path7.RenderTransform = path7.RenderTransform.Clone();
//path7.RenderTransform.Translate(0, 300);
// Щоб «від’єднати» властивість Fill шляху 7 від властивості Fill шляху 6, перепризначте його його клону (або клону Fill шляху 6)
//path7.Fill = ((XpsSolidColorBrush)path7.Fill).Clone();
//path7.Fill.Opacity = 0,8f;

// Збережіть отриманий документ XPS
doc->Save(RunExamples::outDir() + u"WorkingWithTransparency_out.xps");

Висновок

У двох словах, ми дослідили низку функцій для роботи з файлами XPS. У файли XPS можна додати градієнт, лінійний, горизонтальний або вертикальний, а також сітку або прозорі об’єкти. Крім того, ви можете ознайомитися з кількома іншими функціями, завантаживши Приклади проекту. У разі будь-яких неясностей, будь ласка, напишіть нам на безкоштовні форуми підтримки. Ми будемо мати честь вести вас!

Дивись також