Управление текстовыми полями в презентациях с помощью C++
Текст на слайдах обычно находится в текстовых полях или фигурах. Поэтому, чтобы добавить текст на слайд, нужно добавить текстовое поле, а затем поместить в него некоторый текст. Aspose.Slides for C++ предоставляет интерфейс IAutoShape, который позволяет добавить фигуру, содержащую текст.
Info
Aspose.Slides также предоставляет интерфейс IShape, который позволяет добавлять фигуры на слайды. Однако не все фигуры, добавленные через интерфейсIShape, могут содержать текст. Фигуры, добавленные через интерфейс IAutoShape, могут содержать текст.
Note
Поэтому, работая с фигурой, к которой вы хотите добавить текст, рекомендуется проверить и убедиться, что она приведена к интерфейсуIAutoShape. Только в этом случае вы сможете работать с TextFrame, который является свойством IAutoShape. См. раздел Update Text на этой странице.
Create a Text Box on a Slide
Чтобы создать текстовое поле на слайде, выполните следующие шаги:
- Создайте экземпляр класса Presentation.
- Получите ссылку на первый слайд в только что созданной презентации.
- Добавьте объект IAutoShape с параметром ShapeType, установленным в
Rectangle, в указанной позиции на слайде и получите ссылку на только что добавленный объектIAutoShape. - Добавьте свойство
TextFrameк объектуIAutoShape, которое будет содержать текст. В приведённом ниже примере мы добавили такой текст: Aspose TextBox - Наконец, запишите файл PPTX через объект
Presentation.
Этот код C++ — реализация указанных выше шагов — показывает, как добавить текст на слайд:
// Создает экземпляр Presentation
auto pres = System::MakeObject<Presentation>();
// Получает первый слайд в презентации
auto sld = pres->get_Slides()->idx_get(0);
// Добавляет AutoShape с типом Rectangle
auto ashp = sld->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150.0f, 75.0f, 150.0f, 50.0f);
// Добавляет TextFrame к прямоугольнику
ashp->AddTextFrame(u" ");
// Получает доступ к TextFrame
auto txtFrame = ashp->get_TextFrame();
// Создает объект Paragraph для TextFrame
auto para = txtFrame->get_Paragraphs()->idx_get(0);
// Создает объект Portion для параграфа
auto portion = para->get_Portions()->idx_get(0);
// Устанавливает текст
portion->set_Text(u"Aspose TextBox");
// Сохраняет презентацию на диск
pres->Save(u"TextBox_out.pptx", SaveFormat::Pptx);
Check for a Text Box Shape
Aspose.Slides предоставляет метод get_IsTextBox из интерфейса IAutoShape, позволяющий проверять фигуры и определять текстовые поля.

Этот код C++ показывает, как проверить, была ли фигура создана как текстовое поле:
auto presentation = MakeObject<Presentation>(u"sample.pptx");
for (auto&& slide : presentation->get_Slides())
{
for (auto&& shape : slide->get_Shapes())
{
if (ObjectExt::Is<IAutoShape>(shape))
{
auto autoShape = ExplicitCast<IAutoShape>(shape);
Console::WriteLine(autoShape->get_IsTextBox() ? u"shape is a text box" : u"shape is not a text box");
}
}
}
presentation->Dispose();
Обратите внимание, что если вы просто добавите автофигуру, используя метод AddAutoShape из интерфейса IShapeCollection, метод get_IsTextBox этой автофигуры вернёт false. Однако после того, как вы добавите текст к автофигуре с помощью метода AddTextFrame или метода set_Text, метод get_IsTextBox вернёт true.
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto shape1 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 10, 100, 40);
// shape1->get_IsTextBox() возвращает false
shape1->AddTextFrame(u"shape 1");
// shape1->get_IsTextBox() возвращает true
auto shape2 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 110, 100, 40);
// shape2->get_IsTextBox() возвращает false
shape2->get_TextFrame()->set_Text(u"shape 2");
// shape2->get_IsTextBox() возвращает true
auto shape3 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 210, 100, 40);
// shape3->get_IsTextBox() возвращает false
shape3->AddTextFrame(u"");
// shape3->get_IsTextBox() возвращает false
auto shape4 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 310, 100, 40);
// shape4->get_IsTextBox() возвращает false
shape4->get_TextFrame()->set_Text(u"");
// shape4->get_IsTextBox() возвращает false
Add Columns to a Text Box
Aspose.Slides предоставляет методы set_ColumnCount и set_ColumnSpacing (из интерфейса ITextFrameFormat и класса TextFrameFormat), которые позволяют добавлять столбцы в текстовые поля. Вы можете указать количество столбцов в текстовом поле и задать расстояние между столбцами в пунктах.
Этот код на C++ демонстрирует описанную операцию:
auto presentation = System::MakeObject<Presentation>();
// Получает первый слайд в презентации
auto slide = presentation->get_Slides()->idx_get(0);
// Добавляет AutoShape с типом Rectangle
auto aShape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 300.0f, 300.0f);
// Добавляет TextFrame к прямоугольнику
aShape->AddTextFrame(String(u"All these columns are limited to be within a single text container -- ")
+ u"you can add or delete text and the new or remaining text automatically adjusts "
+ u"itself to flow within the container. You cannot have text flow from one container "
+ u"to other though -- we told you PowerPoint's column options for text are limited!");
// Получает формат текста TextFrame
auto format = aShape->get_TextFrame()->get_TextFrameFormat();
// Указывает количество столбцов в TextFrame
format->set_ColumnCount(3);
// Указывает интервал между столбцами
format->set_ColumnSpacing(10);
// Сохраняет презентацию
presentation->Save(u"ColumnCount.pptx", SaveFormat::Pptx);
Add Columns to a Text Frame
Aspose.Slides for C++ предоставляет метод set_ColumnCount (из интерфейса ITextFrameFormat), который позволяет добавлять столбцы в текстовые кадры. С помощью этого метода вы можете указать желаемое количество столбцов в текстовом кадре.
Этот код C++ показывает, как добавить столбец внутри текстового кадра:
String outPptxFileName = u"ColumnsTest.pptx";
auto pres = System::MakeObject<Presentation>();
auto shape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 300.0f, 300.0f);
auto format = System::ExplicitCast<TextFrameFormat>(shape->get_TextFrame()->get_TextFrameFormat());
format->set_ColumnCount(2);
shape->get_TextFrame()->set_Text(String(u"All these columns are forced to stay within a single text container -- ")
+ u"you can add or delete text - and the new or remaining text automatically adjusts "
+ u"itself to stay within the container. You cannot have text spill over from one container "
+ u"to other, though -- because PowerPoint's column options for text are limited!");
pres->Save(outPptxFileName, SaveFormat::Pptx);
{
auto test = System::MakeObject<Presentation>(outPptxFileName);
auto format1 = System::ExplicitCast<AutoShape>(test->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0))->get_TextFrame()->get_TextFrameFormat();
CODEPORTING_DEBUG_ASSERT1(2 == format1->get_ColumnCount());
CODEPORTING_DEBUG_ASSERT1(std::numeric_limits<double>::quiet_NaN() == format1->get_ColumnSpacing());
}
format->set_ColumnSpacing(20);
pres->Save(outPptxFileName, SaveFormat::Pptx);
{
auto test = System::MakeObject<Presentation>(outPptxFileName);
auto format2 = System::ExplicitCast<AutoShape>(test->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0))->get_TextFrame()->get_TextFrameFormat();
CODEPORTING_DEBUG_ASSERT1(2 == format2->get_ColumnCount());
CODEPORTING_DEBUG_ASSERT1(20 == format2->get_ColumnSpacing());
}
format->set_ColumnCount(3);
format->set_ColumnSpacing(15);
pres->Save(outPptxFileName, SaveFormat::Pptx);
{
auto test = System::MakeObject<Presentation>(outPptxFileName);
auto format3 = System::ExplicitCast<AutoShape>(test->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0))->get_TextFrame()->get_TextFrameFormat();
CODEPORTING_DEBUG_ASSERT1(3 == format3->get_ColumnCount());
CODEPORTING_DEBUG_ASSERT1(15 == format3->get_ColumnSpacing());
}
Update Text
Aspose.Slides позволяет изменять или обновлять текст, содержащийся в текстовом поле, или все тексты в презентации.
Этот код C++ демонстрирует операцию, при которой все тексты в презентации обновляются или изменяются:
auto pres = System::MakeObject<Presentation>(u"text.pptx");
for (const auto& slide : pres->get_Slides())
{
for (const auto& shape : slide->get_Shapes())
{
if (ObjectExt::Is<IAutoShape>(shape))
{
auto autoShape = System::AsCast<IAutoShape>(shape);
for (const auto& paragraph : autoShape->get_TextFrame()->get_Paragraphs())
{
for (const auto& portion : paragraph->get_Portions())
{
//Изменяет текст
portion->set_Text(portion->get_Text().Replace(u"years", u"months"));
//Изменяет форматирование
portion->get_PortionFormat()->set_FontBold(NullableBool::True);
}
}
}
}
}
//Сохраняет изменённую презентацию
pres->Save(u"text-changed.pptx", SaveFormat::Pptx);
Add a Text Box with a Hyperlink
Вы можете вставить ссылку внутрь текстового поля. При щелчке по текстовому полю пользователи перенаправляются к открытию ссылки.
Чтобы добавить текстовое поле, содержащее ссылку, выполните следующие шаги:
- Создайте экземпляр класса
Presentation. - Получите ссылку на первый слайд в только что созданной презентации.
- Добавьте объект
AutoShapeс параметромShapeType, установленным вRectangle, в указанной позиции на слайде и получите ссылку на только что добавленный объект AutoShape. - Добавьте
TextFrameк объектуAutoShape, содержащий Aspose TextBox в качестве текста по умолчанию. - Создайте экземпляр класса
IHyperlinkManager. - Назначьте объект
IHyperlinkManagerметоду set_HyperlinkClick, связанному с желаемой частьюTextFrame. - Наконец, запишите файл PPTX через объект
Presentation.
Этот код C++ — реализация указанных выше шагов — показывает, как добавить текстовое поле со ссылкой на слайд:
// Создает экземпляр класса Presentation, представляющего PPTX
auto presentation = System::MakeObject<Presentation>();
// Получает первый слайд в презентации
auto slide = presentation->get_Slides()->idx_get(0);
// Добавляет объект AutoShape с типом Rectangle
auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150.0f, 150.0f, 150.0f, 50.0f);
// Приводит форму к AutoShape
auto autoShape = System::ExplicitCast<IAutoShape>(shape);
// Получает доступ к свойству ITextFrame, связанному с AutoShape
autoShape->AddTextFrame(u"");
auto textFrame = autoShape->get_TextFrame();
// Добавляет некоторый текст в кадр
textFrame->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)->set_Text(u"Aspose.Slides");
// Устанавливает гиперссылку для текста части
auto linkManager = textFrame->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)->get_PortionFormat()->get_HyperlinkManager();
linkManager->SetExternalHyperlinkClick(u"http://www.aspose.com");
// Сохраняет PPTX презентацию
presentation->Save(u"hLinkPPTX_out.pptx", SaveFormat::Pptx);
FAQ
В чём разница между текстовым полем и заполнительным текстом при работе с мастер‑слайдами?
Заполнитель (placeholder) наследует стиль/позицию от мастера и может быть переопределён на макетах, тогда как обычное текстовое поле является независимым объектом на конкретном слайде и не меняется при переключении макетов.
Как выполнить массовую замену текста во всей презентации, не затрагивая текст внутри диаграмм, таблиц и SmartArt?
Ограничьте проход только авто‑фигурами, имеющими текстовые кадры, и исключите вложенные объекты (диаграммы, таблицы, SmartArt), проходя их коллекции отдельно или пропуская эти типы объектов.