Управление ActiveX элементами управления в презентациях в .NET

ActiveX‑элементы управления используются в презентациях. Aspose.Slides для .NET позволяет управлять ActiveX‑элементами, но работа с ними немного сложнее и отличается от работы с обычными фигурами презентации. Начиная с Aspose.Slides для .NET 6.9.0 компонент поддерживает управление ActiveX‑элементами. В данный момент вы можете получить доступ к уже добавленному ActiveX‑элементу в презентации и изменить или удалить его, используя различные свойства. Помните, что ActiveX‑элементы не являются фигурами и не входят в IShapeCollection презентации, а находятся в отдельном IControlCollection. В этой статье показано, как работать с ними.

Изменение ActiveX‑элементов управления

Для управления простым ActiveX‑элементом, например текстовым полем и простой кнопкой‑командой на слайде:

  1. Создайте экземпляр класса Presentation и загрузите презентацию, содержащую ActiveX‑элементы управления.
  2. Получите ссылку на слайд по его индексу.
  3. Доступ к ActiveX‑элементам на слайде получите через IControlCollection.
  4. Получите доступ к ActiveX‑элементу TextBox1 с помощью объекта ControlEx.
  5. Измените различные свойства ActiveX‑элемента TextBox1, включая текст, шрифт, высоту шрифта и положение рамки.
  6. Получите доступ ко второму элементу управления под названием CommandButton1.
  7. Измените подпись кнопки, шрифт и положение.
  8. Сдвиньте позиции рамок ActiveX‑элементов управления.
  9. Запишите изменённую презентацию в файл PPTX.

Ниже приведён фрагмент кода, обновляющий ActiveX‑элементы на слайдах презентации, как показано ниже.

// Получение презентации с элементами управления ActiveX
Presentation presentation = new Presentation("ActiveX.pptm");

// Получение первого слайда в презентации
ISlide slide = presentation.Slides[0];

// Изменение текста TextBox
IControl control = slide.Controls[0];

if (control.Name == "TextBox1" && control.Properties != null)
{
    string newText = "Changed text";
    control.Properties["Value"] = newText;

    // Изменение заменяющего изображения. PowerPoint заменит это изображение при активации ActiveX, поэтому иногда допускается оставить изображение без изменений.

    Bitmap image = new Bitmap((int)control.Frame.Width, (int)control.Frame.Height);
    Graphics graphics = Graphics.FromImage(image);
    Brush brush = new SolidBrush(Color.FromKnownColor(KnownColor.Window));
    graphics.FillRectangle(brush, 0, 0, image.Width, image.Height);
    brush.Dispose();
    System.Drawing.Font font = new System.Drawing.Font(control.Properties["FontName"], 14);
    brush = new SolidBrush(Color.FromKnownColor(KnownColor.WindowText));
    graphics.DrawString(newText, font, brush, 10, 4);
    brush.Dispose();
    Pen pen = new Pen(Color.FromKnownColor(KnownColor.ControlDark), 1);
    graphics.DrawLines(
        pen, new System.Drawing.Point[] { new System.Drawing.Point(0, image.Height - 1), new System.Drawing.Point(0, 0), new System.Drawing.Point(image.Width - 1, 0) });
    pen.Dispose();
    pen = new Pen(Color.FromKnownColor(KnownColor.ControlDarkDark), 1);

    graphics.DrawLines(pen, new System.Drawing.Point[] { new System.Drawing.Point(1, image.Height - 2), new System.Drawing.Point(1, 1), new System.Drawing.Point(image.Width - 2, 1) });
    pen.Dispose();
    pen = new Pen(Color.FromKnownColor(KnownColor.ControlLight), 1);
    graphics.DrawLines(pen, new System.Drawing.Point[]
    {
            new System.Drawing.Point(1, image.Height - 1), new System.Drawing.Point(image.Width - 1, image.Height - 1),
            new System.Drawing.Point(image.Width - 1, 1)
    });
    pen.Dispose();
    pen = new Pen(Color.FromKnownColor(KnownColor.ControlLightLight), 1);
    graphics.DrawLines(pen,new System.Drawing.Point[] { new System.Drawing.Point(0, image.Height), new System.Drawing.Point(image.Width, image.Height), new System.Drawing.Point(image.Width, 0) });
    pen.Dispose();
    graphics.Dispose();
    control.SubstitutePictureFormat.Picture.Image = presentation.Images.AddImage(image);
}

// Изменение подписи кнопки
    control = slide.Controls[1];

    if (control.Name == "CommandButton1" && control.Properties != null)
    {
        String newCaption = "MessageBox";
        control.Properties["Caption"] = newCaption;

        // Изменение заменяющего изображения
        Bitmap image = new Bitmap((int)control.Frame.Width, (int)control.Frame.Height);
        Graphics graphics = Graphics.FromImage(image);
        Brush brush = new SolidBrush(Color.FromKnownColor(KnownColor.Control));
        graphics.FillRectangle(brush, 0, 0, image.Width, image.Height);
        brush.Dispose();
        System.Drawing.Font font = new System.Drawing.Font(control.Properties["FontName"], 14);
        brush = new SolidBrush(Color.FromKnownColor(KnownColor.WindowText));
        SizeF textSize = graphics.MeasureString(newCaption, font, int.MaxValue);
        graphics.DrawString(newCaption, font, brush, (image.Width - textSize.Width) / 2, (image.Height - textSize.Height) / 2);
        brush.Dispose();
        Pen pen = new Pen(Color.FromKnownColor(KnownColor.ControlLightLight), 1);
        graphics.DrawLines(pen, new System.Drawing.Point[] { new System.Drawing.Point(0, image.Height - 1), new System.Drawing.Point(0, 0), new System.Drawing.Point(image.Width - 1, 0) });
        pen.Dispose();
        pen = new Pen(Color.FromKnownColor(KnownColor.ControlLight), 1);
        graphics.DrawLines(pen, new System.Drawing.Point[] { new System.Drawing.Point(1, image.Height - 2), new System.Drawing.Point(1, 1), new System.Drawing.Point(image.Width - 2, 1) });
        pen.Dispose();
        pen = new Pen(Color.FromKnownColor(KnownColor.ControlDark), 1);
        graphics.DrawLines(pen,new System.Drawing.Point[]
        {
            new System.Drawing.Point(1, image.Height - 1),
            new System.Drawing.Point(image.Width - 1, image.Height - 1),
            new System.Drawing.Point(image.Width - 1, 1)
        });
        pen.Dispose();
        pen = new Pen(Color.FromKnownColor(KnownColor.ControlDarkDark), 1);
        graphics.DrawLines(pen,new System.Drawing.Point[] { new System.Drawing.Point(0, image.Height), new System.Drawing.Point(image.Width, image.Height), new System.Drawing.Point(image.Width, 0) });
        pen.Dispose();
        graphics.Dispose();
        control.SubstitutePictureFormat.Picture.Image = presentation.Images.AddImage(image);
    }

    // Перемещение кадров ActiveX на 100 пунктов вниз
    foreach (Control ctl in slide.Controls)
    {
        IShapeFrame frame = control.Frame;
        control.Frame = new ShapeFrame(
            frame.X, frame.Y + 100, frame.Width, frame.Height, frame.FlipH, frame.FlipV, frame.Rotation);
    }

    // Сохранение презентации с изменёнными элементами управления ActiveX
    presentation.Save("withActiveX-edited_out.pptm", Aspose.Slides.Export.SaveFormat.Pptm);


    // Теперь удаляем элементы управления
    slide.Controls.Clear();

    // Сохранение презентации с очищенными элементами управления ActiveX
    presentation.Save("withActiveX.cleared_out.pptm", Aspose.Slides.Export.SaveFormat.Pptm);

Добавление ActiveX‑элемента Media Player

Чтобы добавить ActiveX‑элемент Media Player, выполните следующие шаги:

  1. Создайте экземпляр класса Presentation и загрузите образец презентации с ActiveX‑элементом Media Player.
  2. Создайте экземпляр целевого класса Presentation и сформируйте пустой экземпляр презентации.
  3. Клонируйте слайд с ActiveX‑элементом Media Player из шаблонной презентации в целевую презентацию.
  4. Получите доступ к клонированному слайду в целевой презентации.
  5. Доступ к ActiveX‑элементам на слайде получите через IControlCollection.
  6. Получите доступ к ActiveX‑элементу Media Player и задайте путь к видео, используя его свойства.
  7. Сохраните презентацию в файл PPTX.
// Создание экземпляра класса Presentation, представляющего файл PPTX
Presentation presentation = new Presentation("template.pptx");

// Создание пустого экземпляра презентации
Presentation newPresentation = new Presentation();

// Удаление слайда по умолчанию
newPresentation.Slides.RemoveAt(0);

// Клонирование слайда с ActiveX‑элементом Media Player
newPresentation.Slides.InsertClone(0, presentation.Slides[0]);

// Доступ к ActiveX‑элементу Media Player и установка пути к видео
newPresentation.Slides[0].Controls[0].Properties["URL"] = "Wildlife.mp4";

// Сохранение презентации
newPresentation.Save("LinkingVideoActiveXControl_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);

FAQ

Сохраняет ли Aspose.Slides ActiveX‑элементы управления при чтении и повторном сохранении, если они не могут быть выполнены в среде .NET?

Да. Aspose.Slides рассматривает их как часть презентации и может считывать/изменять их свойства и рамки; выполнение самих элементов не требуется для их сохранения.

Чем ActiveX‑элементы управления отличаются от OLE‑объектов в презентации?

ActiveX‑элементы управления — это интерактивные управляемые элементы (кнопки, текстовые поля, медиаплеер), тогда как OLE относится к встроенным объектам приложений (например, листу Excel). Они хранятся и обрабатываются иначе и имеют разные модели свойств.

Работают ли события ActiveX и макросы VBA, если файл был изменён Aspose.Slides?

Aspose.Slides сохраняет существующую разметку и метаданные; однако события и макросы запускаются только в PowerPoint на Windows при разрешённой безопасности. Библиотека не выполняет VBA.