Zarządzanie kontrolkami ActiveX w prezentacjach przy użyciu C++
Wprowadzenie
Kontrolki ActiveX są używane w prezentacjach. Aspose.Slides dla C++ umożliwia zarządzanie kontrolkami ActiveX, ale ich obsługa jest nieco trudniejsza i inna niż w przypadku zwykłych kształtów prezentacji. Od wersji Aspose.Slides dla C++ 18.1 komponent obsługuje zarządzanie kontrolkami ActiveX. Obecnie możesz uzyskać dostęp do już dodanej kontrolki ActiveX w swojej prezentacji oraz modyfikować ją lub usuwać, korzystając z różnych jej właściwości. Pamiętaj, że kontrolki ActiveX nie są kształtami i nie należą do IShapeCollection prezentacji, lecz do osobnego IControlCollection. Ten artykuł pokazuje, jak z nimi pracować.
Modyfikacja kontrolki ActiveX
Aby zarządzać prostą kontrolką ActiveX, taką jak pole tekstowe i prosty przycisk polecenia na slajdzie:
- Utwórz instancję klasy Presentation i wczytaj prezentację zawierającą kontrolki ActiveX.
- Uzyskaj referencję do slajdu na podstawie jego indeksu.
- Uzyskaj dostęp do kontrolek ActiveX na slajdzie, odwołując się do IControlCollection.
- Uzyskaj dostęp do kontrolki ActiveX TextBox1 przy użyciu obiektu ControlEx.
- Zmień różne właściwości kontrolki ActiveX TextBox1, w tym tekst, czcionkę, wysokość czcionki oraz położenie ramki.
- Uzyskaj dostęp do drugiej kontrolki o nazwie CommandButton1.
- Zmień podpis przycisku, czcionkę i położenie.
- Przesuń położenie ramek kontrolek ActiveX.
- Zapisz zmodyfikowaną prezentację do pliku PPTX.
Poniższy fragment kodu aktualizuje kontrolki ActiveX na slajdach prezentacji, jak pokazano poniżej.
// Uzyskiwanie dostępu do prezentacji z kontrolkami ActiveX
auto presentation = System::MakeObject<Presentation>(u"ActiveX.pptm");
// Uzyskiwanie dostępu do pierwszego slajdu w prezentacji
auto slide = presentation->get_Slides()->idx_get(0);
// zmiana tekstu TextBox
auto control = slide->get_Controls()->idx_get(0);
if (control->get_Name() == u"TextBox1" && control->get_Properties() != nullptr)
{
String newText = u"Changed text";
control->get_Properties()->idx_set(u"Value", newText);
// zmiana obrazu zastępczego. PowerPoint zamieni ten obraz podczas aktywacji ActiveX, więc czasami można pozostawić obraz niezmieniony.
auto image = System::MakeObject<Bitmap>((int32_t)control->get_Frame()->get_Width(), (int32_t)control->get_Frame()->get_Height());
auto graphics = Graphics::FromImage(image);
auto brush = System::MakeObject<SolidBrush>(Color::FromKnownColor(KnownColor::Window));
graphics->FillRectangle(brush, 0, 0, image->get_Width(), image->get_Height());
auto font = System::MakeObject<Font>(control->get_Properties()->idx_get(u"FontName"), 14.0f);
brush = System::MakeObject<SolidBrush>(Color::FromKnownColor(KnownColor::WindowText));
graphics->DrawString(newText, font, brush, 10.0f, 4.0f);
auto pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlDark), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(0, image->get_Height() - 1), Point(0, 0), System::Drawing::Point(image->get_Width() - 1, 0) }));
pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlDarkDark), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(1, image->get_Height() - 2), Point(1, 1), System::Drawing::Point(image->get_Width() - 2, 1) }));
pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlLight), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(1, image->get_Height() - 1), System::Drawing::Point(image->get_Width() - 1, image->get_Height() - 1), System::Drawing::Point(image->get_Width() - 1, 1) }));
pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlLightLight), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(0, image->get_Height()), System::Drawing::Point(image->get_Width(), image->get_Height()), System::Drawing::Point(image->get_Width(), 0) }));
System::SharedPtr<System::IO::MemoryStream> ms = System::MakeObject<System::IO::MemoryStream>();
image->Save(ms, System::Drawing::Imaging::ImageFormat::get_Png());
ms->Seek(0, System::IO::SeekOrigin::Begin);
control->get_SubstitutePictureFormat()->get_Picture()->set_Image(presentation->get_Images()->AddImage(ms));
}
// zmiana podpisu przycisku
control = slide->get_Controls()->idx_get(1);
if (control->get_Name() == u"CommandButton1" && control->get_Properties() != nullptr)
{
String newCaption = u"MessageBox";
control->get_Properties()->idx_set(u"Caption", newCaption);
// zmiana obrazu zastępczego
auto image = System::MakeObject<Bitmap>((int32_t)control->get_Frame()->get_Width(), (int32_t)control->get_Frame()->get_Height());
auto graphics = Graphics::FromImage(image);
auto brush = System::MakeObject<SolidBrush>(Color::FromKnownColor(KnownColor::Control));
graphics->FillRectangle(brush, 0, 0, image->get_Width(), image->get_Height());
auto font = System::MakeObject<Font>(control->get_Properties()->idx_get(u"FontName"), 14.0f);
brush = System::MakeObject<SolidBrush>(Color::FromKnownColor(KnownColor::WindowText));
SizeF textSize = graphics->MeasureString(newCaption, font, std::numeric_limits<int32_t>::max());
graphics->DrawString(newCaption, font, brush, (image->get_Width() - textSize.get_Width()) / 2, (image->get_Height() - textSize.get_Height()) / 2);
auto pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlLightLight), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(0, image->get_Height() - 1), Point(0, 0), System::Drawing::Point(image->get_Width() - 1, 0) }));
pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlLight), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(1, image->get_Height() - 2), Point(1, 1), System::Drawing::Point(image->get_Width() - 2, 1) }));
pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlDark), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(1, image->get_Height() - 1), System::Drawing::Point(image->get_Width() - 1, image->get_Height() - 1), System::Drawing::Point(image->get_Width() - 1, 1) }));
pen = System::MakeObject<Pen>(Color::FromKnownColor(KnownColor::ControlDarkDark), 1.0f);
graphics->DrawLines(pen, System::MakeArray<Point>({ System::Drawing::Point(0, image->get_Height()), System::Drawing::Point(image->get_Width(), image->get_Height()), System::Drawing::Point(image->get_Width(), 0) }));
System::SharedPtr<System::IO::MemoryStream> ms = System::MakeObject<System::IO::MemoryStream>();
image->Save(ms, System::Drawing::Imaging::ImageFormat::get_Png());
ms->Seek(0, System::IO::SeekOrigin::Begin);
control->get_SubstitutePictureFormat()->get_Picture()->set_Image(presentation->get_Images()->AddImage(ms));
}
// Przesuwanie ramek ActiveX o 100 punktów w dół
for (const auto& ctl : System::IterateOver<Control>(slide->get_Controls()))
{
SharedPtr<IShapeFrame> frame = control->get_Frame();
control->set_Frame(System::MakeObject<ShapeFrame>(frame->get_X(), frame->get_Y() + 100, frame->get_Width(), frame->get_Height(), frame->get_FlipH(), frame->get_FlipV(), frame->get_Rotation()));
}
// Zapisanie prezentacji z edytowanymi kontrolkami ActiveX
presentation->Save(u"withActiveX-edited_out.pptm", SaveFormat::Pptm);
// Teraz usuwanie kontrolek
slide->get_Controls()->Clear();
// Zapisywanie prezentacji z usuniętymi kontrolkami ActiveX
presentation->Save(u"withActiveX.cleared_out.pptm", SaveFormat::Pptm);
Dodanie kontrolki ActiveX Media Player
Kontrolki ActiveX są używane w prezentacjach. Aspose.Slides dla C++ umożliwia dodawanie i zarządzanie kontrolkami ActiveX, ale ich obsługa jest nieco trudniejsza i różni się od zwykłych kształtów prezentacji. Od wersji Aspose.Slides dla C++ 18.1 w Aspose.Slides dodano obsługę dodawania kontrolki ActiveX Media Player. Pamiętaj, że kontrolki ActiveX nie są kształtami i nie należą do IShapeCollection prezentacji, lecz do osobnego IControlExCollection. Ten artykuł pokazuje, jak z nimi pracować. Aby zarządzać kontrolką ActiveX Media Player, wykonaj następujące kroki:
- Utwórz instancję klasy Presentation i wczytaj przykładową prezentację zawierającą kontrolki ActiveX Media Player.
- Utwórz instancję docelowej klasy Presentation i utwórz pustą prezentację.
- Sklonuj slajd z kontrolką ActiveX Media Player w szablonie prezentacji do docelowej prezentacji.
- Uzyskaj dostęp do sklonowanego slajdu w docelowej prezentacji.
- Uzyskaj dostęp do kontrolek ActiveX na slajdzie, odwołując się do IControlCollection.
- Uzyskaj dostęp do kontrolki ActiveX Media Player i ustaw ścieżkę wideo, korzystając z jej właściwości.
- Zapisz prezentację do pliku PPTX.
// Utwórz instancję klasy Presentation reprezentującej plik PPTX
auto presentation = System::MakeObject<Presentation>(u"template.pptx");
// Utwórz pustą instancję prezentacji
auto newPresentation = System::MakeObject<Presentation>();
// Usuń domyślny slajd
newPresentation->get_Slides()->RemoveAt(0);
// Sklonuj slajd z kontrolką ActiveX Media Player
newPresentation->get_Slides()->InsertClone(0, presentation->get_Slides()->idx_get(0));
// Uzyskaj dostęp do kontrolki ActiveX Media Player i ustaw ścieżkę do wideo
newPresentation->get_Slides()->idx_get(0)->get_Controls()->idx_get(0)->get_Properties()->idx_set(u"URL", u"Wildlife.mp4");
// Zapisz prezentację
newPresentation->Save(u"LinkingVideoActiveXControl_out.pptx", SaveFormat::Pptx);
FAQ
Czy Aspose.Slides zachowuje kontrolki ActiveX przy odczycie i ponownym zapisie, jeśli nie mogą być wykonywane w środowisku uruchomieniowym C++?
Tak. Aspose.Slides traktuje je jako część prezentacji i może odczytywać/modyfikować ich właściwości oraz ramki; nie jest wymagane wykonywanie samych kontrolek, aby je zachować.
Czym różnią się kontrolki ActiveX od obiektów OLE w prezentacji?
Kontrolki ActiveX są interaktywnymi kontrolkami zarządzanymi (przyciski, pola tekstowe, odtwarzacz multimedialny), podczas gdy OLE odnosi się do osadzonych obiektów aplikacji (np. arkusza Excel). Są przechowywane i obsługiwane inaczej oraz mają inny model właściwości.
Czy zdarzenia ActiveX i makra VBA działają, jeśli plik został zmodyfikowany przez Aspose.Slides?
Aspose.Slides zachowuje istniejący znacznik i metadane; jednak zdarzenia i makra uruchamiają się wyłącznie w programie PowerPoint na systemie Windows, gdy zabezpieczenia na to pozwalają. Biblioteka nie wykonuje kodu VBA.