Dodaj przezroczystość siatki gradientu XPS

Pliki XPS mogą służyć do wyświetlania wielu informacji wizualnych. Obsługują tekst, obrazy, przezroczystość obiektów, siatki, gradienty i wiele innych funkcji. Możesz wstawiać gradienty, siatki i przezroczyste obiekty w plikach XPS zgodnie z własnymi wymaganiami. W tym artykule szczegółowo zbadamy te funkcje, wraz z różnymi przykładami i przypadkami użycia. Przejdźmy przez następujące tematy:

Instalowanie XPS API dla C++

Możesz szybko i łatwo skonfigurować interfejs API Aspose.Page for C++ w swoich aplikacjach programistycznych do manipulowania plikami XPS, PS, EPS i innymi obsługiwanymi formatami. Po prostu pobierz plik DLL z oficjalnego Downloads lub zainstaluj go z galerii NuGet za pomocą poniższego polecenia:

PM> Install-Package Aspose.Page.Cpp 

Dodawanie Gradientu w pliku XPS przy użyciu C++

Czasami trzeba dodać gradient w plikach XPS. Możesz manipulować plikiem XPS, ponieważ interfejs API umożliwia dodawanie gradientu liniowego, poziomego i pionowego. Dodajmy następujące gradienty w pliku XPS:

Dodaj pionowy gradient w pliku XPS za pomocą C++

Możesz łatwo dodać pionowy gradient w plikach XPS za pomocą kilku prostych wywołań API. Poniżej przedstawiono kroki dodawania gradientu pionowego:

  1. Utwórz nowy Dokument XPS
  2. Zainicjuj listę XpsGradientStop
  3. Utwórz nową ścieżkę, definiując geometrię
  4. Zapisz wynikowy dokument XPS

Poniższy kod jest oparty na tych krokach i pokazuje, jak dodać pionowy gradient w pliku XPS za pomocą C++:

// Utwórz nowy dokument XPS
auto doc = System::MakeObject<XpsDocument>();

// Zainicjuj listę 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));

// Utwórz nową ścieżkę, definiując geometrię w formie skrótu
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);

// Zapisz wynikowy dokument XPS
doc->Save(RunExamples::outDir() + u"AddVerticalGradient_out.xps");

Dodaj poziomy gradient w XPS przy użyciu C++

Inną możliwą odmianą gradientu w plikach XPS jest gradient poziomy. Podejście polegające na dodawaniu gradientu poziomego jest trochę związane z przypadkiem użycia, który omówiliśmy powyżej. Poniżej przedstawiono kroki, które należy wykonać, aby dodać poziomy gradient:

  1. Utwórz nowy dokument XPS
  2. Określ stopnie gradientu za pomocą XpsGradientStop
  3. Utwórz ścieżkę z geometrią
  4. Zapisz wyjściowy dokument XPS

Poniższy fragment kodu opisuje sposób dodawania gradientu poziomego w plikach XPS przy użyciu języka C++:

// Utwórz nowy dokument XPS
auto doc = System::MakeObject<XpsDocument>();

// Zainicjuj listę 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));

// Utwórz nową ścieżkę, definiując geometrię w formie skrótu
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);

// Zapisz wynikowy dokument XPS
doc->Save(RunExamples::outDir() + u"AddHorizontalGradient_out.xps");

Wstaw siatkę do pliku XPS za pomocą C++

Aspose.Page for C++ API pozwala renderować siatki w plikach XPS z wieloma właściwościami kontrolującymi renderowanie. Rozważmy przykład wstawiania siatki do pliku XPS w aplikacjach opartych na C++. Możesz pracować z tą funkcją, wykonując poniższe czynności:

  1. Zainicjuj obiekt klasy XpsDocument
  2. Określ geometrię siatki VisualBrush
  3. Utwórz Canvas dla purpurowej siatki VisualBrush
  4. Utwórz pędzel wizualny i dodaj siatkę
  5. Zapisz wyjściowy plik XPS

Poniższy kod opiera się na tych krokach, które wyjaśniają, jak wstawić siatkę do plików XPS za pomocą C++:

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

// Geometria dla purpurowej siatki 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));

// Płótno dla purpurowej siatki 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);

//Utwórz Visual Brush, jest to określone przez fragment XPS (grafika wektorowa i glify)
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);

// Nowe płótno
System::SharedPtr<XpsCanvas> canvas = doc->AddCanvas();
canvas->set_RenderTransform(doc->CreateMatrix(1.f, 0.f, 0.f, 1.f, 268.f, 70.f));

// Dodaj siatkę
canvas->AddPath(gridPath);

// Czerwony przezroczysty prostokąt na środku góry
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);

// Zapisz wynikowy dokument XPS
doc->Save(RunExamples::outDir() + u"AddGrid_out.xps");

Wstaw przezroczysty obiekt do pliku XPS za pomocą C++

Kolejną ekscytującą funkcją do pracy z plikami XPS jest obsługa przezroczystości i krycia. Może być konieczne dodanie przezroczystych obiektów do pliku XPS w różnych scenariuszach. Można to osiągnąć za pomocą następujących kroków:

  1. Utwórz nowy Dokument XPS
  2. Utwórz ścieżkę z geometrią zamkniętego prostokąta
  3. Dodaj geometrię dla różnych ścieżek
  4. Zapisz wyjściowy dokument XPS

Po tych krokach następuje następujący kod, który pokazuje, jak dodać przezroczysty obiekt w pliku XPS za pomocą języka programowania C++:

// Utwórz nowy dokument XPS
auto doc = System::MakeObject<XpsDocument>();

// Tylko po to, by wykazać przejrzystość
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()));

// Utwórz ścieżkę z geometrią zamkniętego prostokąta
System::SharedPtr<XpsPath> path1 = doc->CreatePath(doc->CreatePathGeometry(u"M20,20 h200 v200 h-200 z"));
// Ustaw niebieski pełny pędzel, aby wypełnić ścieżkę1
path1->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Blue()));
// Dodaj go do bieżącej strony
System::SharedPtr<XpsPath> path2 = doc->Add(path1);

// ścieżka1 i ścieżka2 są takie same, o ile ścieżka1 nie została umieszczona w żadnym innym elemencie
// (co oznacza, że ścieżka1 nie miała elementu nadrzędnego).
// Z powodu tego prostokąta kolor na stronie faktycznie zmienia się na zielony
path2->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Green()));

// Teraz ponownie dodaj ścieżkę2. Teraz path2 ma rodzica. Więc ścieżka3 nie będzie taka sama jak ścieżka2.
// W ten sposób na stronie malowany jest nowy prostokąt ...
System::SharedPtr<XpsPath> path3 = doc->Add(path2);
// ... i przesuwamy go o 300 jednostek niżej ...
path3->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 300.0f));
// ... i ustaw czerwony stały pędzel, aby go wypełnić
path3->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Red()));

// Utwórz nową ścieżkę 4 z geometrią ścieżki 2 ...
System::SharedPtr<XpsPath> path4 = doc->AddPath(path2->get_Data());
// ... przesuń go o 300 jednostek w prawo ...
path4->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 300.0f, 0.0f));
// ... i ustaw niebieskie wypełnienie
path4->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Blue()));

// Dodaj ścieżkę 4 jeszcze raz.
System::SharedPtr<XpsPath> path5 = doc->Add(path4);
// ścieżka4 i ścieżka5 nie są znowu takie same ...
// (przesuń ścieżkę o 5 300 jednostek niżej)
path5->set_RenderTransform(path5->get_RenderTransform()->Clone());
// aby odłączyć wartość RenderTransform od ścieżki 4 (patrz następny komentarz na temat właściwości Fill)
path5->get_RenderTransform()->Translate(0.0f, 300.0f);
// ... ale jeśli ustawimy krycie właściwości Fill, zadziała to zarówno na ścieżce 5, jak i ścieżce 4
// ponieważ brush jest złożoną wartością właściwości, która pozostaje taka sama dla path5 i path4
path5->get_Fill()->set_Opacity(0.8f);

// Utwórz nową ścieżkę 6 z geometrią ścieżki 2 ...
System::SharedPtr<XpsPath> path6 = doc->AddPath(path2->get_Data());
// ... przesuń go o 600 jednostek w prawo ...
path6->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 600.0f, 0.0f));
// ... i ustaw żółte wypełnienie
path6->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Yellow()));

// Teraz dodaj klon path6 ...
System::SharedPtr<XpsPath> path7 = doc->Add(path6->Clone());
// (przesuń ścieżkę o 5 300 jednostek niżej)
path7->set_RenderTransform(path7->get_RenderTransform()->Clone());
path7->get_RenderTransform()->Translate(0.0f, 300.0f);
// ... i ustaw krycie dla path7
path7->get_Fill()->set_Opacity(0.8f);
// Teraz krycie działa niezależnie, gdy tylko wartości właściwości zostaną sklonowane wraz z elementem

// Poniższy blok kodu jest odpowiednikiem poprzedniego.
// Dodaj samą ścieżkę 6. ścieżka6 i ścieżka7 to nie to samo. Chociaż ich wartości właściwości Fill są takie same 
//XpsPath ścieżka7 = doc.Add(ścieżka6);
//ścieżka7.RenderTransform = ścieżka7.RenderTransform.Clone();
//path7.RenderTransform.Translate(0, 300);
// Aby „odłączyć” właściwość Fill ścieżki 7 od właściwości Fill ścieżki 6, ponownie przypisz ją do jej klona (lub klonu Fill ścieżki 6)
//ścieżka7.Wypełnij = ((XpsSolidColorBrush)ścieżka7.Wypełnij).Clone();
//ścieżka7.Wypełnienie.Nieprzezroczystość = 0,8f;

// Zapisz wynikowy dokument XPS
doc->Save(RunExamples::outDir() + u"WorkingWithTransparency_out.xps");

Wniosek

Krótko mówiąc, zbadaliśmy szereg funkcji do pracy z plikami XPS. Możesz dodać gradient, liniowy, poziomy lub pionowy, a także siatki lub przezroczyste obiekty w plikach XPS. Ponadto możesz zapoznać się z kilkoma innymi funkcjami, pobierając Przykładowy projekt. W przypadku jakichkolwiek niejasności napisz do nas na Bezpłatne fora wsparcia. Będziemy zaszczyceni mogąc Cię poprowadzić!

Zobacz też