Správa ActiveX ovládacích prvků v prezentacích pomocí C++
Úvod
ActiveX ovládací prvky se používají v prezentacích. Aspose.Slides pro C++ vám umožňuje spravovat ActiveX ovládací prvky, ale jejich správa je o něco složitější a liší se od běžných tvarů v prezentaci. Od Aspose.Slides pro C++ 18.1 komponenta podporuje správu ActiveX ovládacích prvků. V současné době můžete přistupovat k již přidanému ActiveX ovládacímu prvku v prezentaci a upravovat jej nebo jej smazat pomocí jeho různých vlastností. Pamatujte, že ActiveX ovládací prvky nejsou tvary a nejsou součástí IShapeCollection prezentace, ale samostatné IControlCollection. Tento článek ukazuje, jak s nimi pracovat.
Upravit ActiveX ovládací prvek
- Vytvořte instanci třídy Presentation a načtěte prezentaci, která obsahuje ActiveX ovládací prvky.
- Získejte referenci na snímek podle jeho indexu.
- Přistupujte k ActiveX ovládacím prvkům na snímku pomocí IControlCollection.
- Získejte ActiveX ovládací prvek TextBox1 pomocí objektu ControlEx.
- Změňte různé vlastnosti ActiveX ovládacího prvku TextBox1, včetně textu, písma, výšky písma a pozice rámce.
- Získejte druhý ovládací prvek nazvaný CommandButton1.
- Změňte popisek tlačítka, písmo a pozici.
- Posuňte pozici rámců ActiveX ovládacích prvků.
- Uložte upravenou prezentaci do souboru PPTX.
Níže uvedený úryvek kódu aktualizuje ActiveX ovládací prvky na snímcích prezentace podle snímku zobrazeného níže.
// Přístup k prezentaci s ActiveX ovládacími prvky
auto presentation = System::MakeObject<Presentation>(u"ActiveX.pptm");
// Přístup k prvnímu snímku v prezentaci
auto slide = presentation->get_Slides()->idx_get(0);
// Změna textu TextBoxu
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);
// Změna náhradního obrázku. PowerPoint tento obrázek nahradí během aktivace ActiveX, takže je někdy v pořádku nechat obrázek beze změny.
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));
}
// Změna popisku tlačítka
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);
// Změna náhrady
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));
}
// Posunutí rámců ActiveX o 100 bodů dolů
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()));
}
// Uložení prezentace s upravenými ActiveX ovládacími prvky
presentation->Save(u"withActiveX-edited_out.pptm", SaveFormat::Pptm);
// Nyní odstraňování ovládacích prvků
slide->get_Controls()->Clear();
// Ukládání prezentace s vymazanými ActiveX ovládacími prvky
presentation->Save(u"withActiveX.cleared_out.pptm", SaveFormat::Pptm);
Přidat Media Player ActiveX ovládací prvek
ActiveX ovládací prvky se používají v prezentacích. Aspose.Slides pro C++ vám umožňuje přidávat a spravovat ActiveX ovládací prvky, ale jejich správa je o něco složitější a liší se od běžných tvarů v prezentaci. Od Aspose.Slides pro C++ 18.1 byla do Aspose.Slides přidána podpora pro přidání Media Player ActiveX ovládacího prvku. Pamatujte, že ActiveX ovládací prvky nejsou tvary a nejsou součástí IShapeCollection prezentace, ale samostatné IControlExCollection. Tento článek ukazuje, jak s nimi pracovat. Pro správu Media Player ActiveX ovládacího prvku postupujte podle následujících kroků:
- Vytvořte instanci třídy Presentation a načtěte ukázkovou prezentaci, která obsahuje Media Player ActiveX ovládací prvky.
- Vytvořte instanci cílové třídy Presentation a vytvořte prázdnou prezentaci.
- Naklonujte snímek s Media Player ActiveX ovládacím prvkem z šablonové prezentace do cílové prezentace.
- Získejte přístup ke klonovanému snímku v cílové prezentaci.
- Přistupujte k ActiveX ovládacím prvkům na snímku pomocí IControlCollection.
- Získejte Media Player ActiveX ovládací prvek a nastavte cestu k videu pomocí jeho vlastností.
- Uložte prezentaci do souboru PPTX.
// Vytvořte instanci třídy Presentation, která představuje soubor PPTX
auto presentation = System::MakeObject<Presentation>(u"template.pptx");
// Vytvořte prázdnou instanci prezentace
auto newPresentation = System::MakeObject<Presentation>();
// Odstraňte výchozí snímek
newPresentation->get_Slides()->RemoveAt(0);
// Naklonujte snímek s Media Player ActiveX ovládacím prvkem
newPresentation->get_Slides()->InsertClone(0, presentation->get_Slides()->idx_get(0));
// Získejte přístup k Media Player ActiveX ovládacímu prvku a nastavte cestu k videu
newPresentation->get_Slides()->idx_get(0)->get_Controls()->idx_get(0)->get_Properties()->idx_set(u"URL", u"Wildlife.mp4");
// Uložte prezentaci
newPresentation->Save(u"LinkingVideoActiveXControl_out.pptx", SaveFormat::Pptx);
Často kladené otázky
Zachovává Aspose.Slides ActiveX ovládací prvky při načítání a opětovném ukládání, pokud není možné je spustit v runtime C++?
Ano. Aspose.Slides je považuje za součást prezentace a může číst/upravovat jejich vlastnosti a rámce; není vyžadováno spouštění samotných ovládacích prvků pro jejich zachování.
Jak se ActiveX ovládací prvky liší od OLE objektů v prezentaci?
ActiveX ovládací prvky jsou interaktivní řízené prvky (tlačítka, textová pole, media player), zatímco OLE odkazuje na vložené objekty aplikací (například list Excel). Jsou ukládány a zpracovávány odlišně a mají odlišné modely vlastností.
Fungují ActiveX události a VBA makra, pokud byl soubor upraven pomocí Aspose.Slides?
Aspose.Slides zachovává existující značkování a metadata; nicméně události a makra se spouští pouze v PowerPointu na Windows, pokud to bezpečnostní nastavení povolí. Knihovna nespouští VBA.