Comment ajouter des formes à PowerPoint en C++

Comment ajouter des formes à PowerPoint en C++

Aspose.Slides FOSS for C++ prend en charge l’ajout d’AutoShapes, de Tables, de Connectors et de PictureFrames aux diapositives de présentation. Tous les types de formes sont ajoutés via la collection slide.shapes().

Guide étape par étape

Étape 1 : Compiler et lier la bibliothèque

git clone https://github.com/aspose-slides-foss/Aspose.Slides-FOSS-for-Cpp.git
cd Aspose.Slides-FOSS-for-Cpp && mkdir build && cd build
cmake .. && cmake --build .

Étape 2 : Créer une présentation

Utilisez l’allocation sur la pile pour le nettoyage RAII.

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];
    // ... add shapes ...
    prs.save("output.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Étape 3 : Ajouter une AutoShape

slide.shapes().add_auto_shape(shape_type, x, y, width, height) place une forme à la position et à la taille données (toutes en points). Utilisez les constantes ShapeType pour sélectionner la forme.

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];

    // Rectangle
    auto& rect = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 50, 300, 100);
    rect.text_frame()->set_text("Rectangle shape");

    // Ellipse
    auto& ellipse = slide.shapes().add_auto_shape(
        asf::ShapeType::ELLIPSE, 400, 50, 200, 100);
    ellipse.text_frame()->set_text("Ellipse shape");

    prs.save("autoshapes.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Étape 4 : Ajouter un tableau

slide.shapes().add_table(x, y, col_widths, row_heights) crée un tableau à la position spécifiée. Les largeurs de colonnes et les hauteurs de lignes sont des vecteurs de valeurs en points.

#include <Aspose/Slides/Foss/presentation.h>
#include <vector>
#include <string>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];

    std::vector<double> col_widths = {150.0, 150.0, 150.0};
    std::vector<double> row_heights = {40.0, 40.0, 40.0};
    auto& table = slide.shapes().add_table(50, 200, col_widths, row_heights);

    // Set header row text
    std::vector<std::string> headers = {"Product", "Units", "Revenue"};
    for (size_t col = 0; col < headers.size(); ++col) {
        table.rows()[0][col].text_frame()->set_text(headers[col]);
    }

    // Set data rows
    std::vector<std::vector<std::string>> rows = {
        {"Widget A", "120", "$2,400"},
        {"Widget B", "85",  "$1,700"},
    };
    for (size_t r = 0; r < rows.size(); ++r) {
        for (size_t c = 0; c < rows[r].size(); ++c) {
            table.rows()[r + 1][c].text_frame()->set_text(rows[r][c]);
        }
    }

    prs.save("table.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Étape 5 : Ajouter un connecteur

Les connecteurs relient visuellement deux formes. Créez d’abord les formes, puis ajoutez un connecteur et définissez ses points de connexion de départ et d’arrivée.

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];

    auto& box1 = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 100, 150, 60);
    box1.text_frame()->set_text("Start");

    auto& box2 = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 350, 100, 150, 60);
    box2.text_frame()->set_text("End");

    auto& conn = slide.shapes().add_connector(
        asf::ShapeType::BENT_CONNECTOR3, 0, 0, 10, 10);
    conn.set_start_shape_connected_to(&box1);
    conn.set_start_shape_connection_site_index(3); // right side of box1
    conn.set_end_shape_connected_to(&box2);
    conn.set_end_shape_connection_site_index(1);   // left side of box2

    prs.save("connector.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Les indices des sites de connexion sont numérotés 0-3 pour un rectangle : haut=0, gauche=1, bas=2, droite=3.


Étape 6 : Ajouter un cadre photo

Intégrez une image et ajoutez‑la à la diapositive en tant que PictureFrame. Lisez d’abord les octets de l’image, ajoutez‑les à la collection d’images de la présentation, puis créez le cadre.

#include <Aspose/Slides/Foss/presentation.h>
#include <fstream>
#include <vector>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;

    std::ifstream file("logo.png", std::ios::binary);
    std::vector<uint8_t> data((std::istreambuf_iterator<char>(file)),
                               std::istreambuf_iterator<char>());

    auto& image = prs.images().add_image(data);

    auto& slide = prs.slides()[0];
    slide.shapes().add_picture_frame(
        asf::ShapeType::RECTANGLE, // bounding shape type
        50, 50,                    // x, y in points
        200, 150,                  // width, height in points
        image);

    prs.save("with-image.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Problèmes courants et solutions

Forme apparaît en dehors de la zone visible de la diapositive

Les diapositives mesurent 720 × 540 points par défaut. Les valeurs de x ou y dépassant ces limites placent la forme hors de la diapositive. Conservez x < 720 et y < 540, et assurez x + width <= 720 et y + height <= 540.

add_auto_shape() renvoie une référence à un objet détruit

Ne stockez pas de références au‑delà de la durée de vie du Presentation. Tous les objets enfants sont possédés par le Presentation et invalidés lors de la destruction.

Le texte de la cellule du tableau est vide après l’affectation

La méthode correcte est .text_frame()->set_text(). Accédez aux cellules comme table.rows()[row_index][col_index].text_frame()->set_text("value").


Foire aux questions

Combien de formes puis‑je ajouter à une diapositive ?

Il n’y a pas de limite imposée par la bibliothèque. Les limites pratiques dépendent de la taille du fichier et de la capacité de rendu de votre visionneuse PPTX cible.

Puis-je modifier la position d’une forme après l’avoir ajoutée ?

Oui. L’objet shape renvoyé par add_auto_shape() possède les méthodes set_x(), set_y(), set_width() et set_height() :

shape.set_x(100);
shape.set_y(200);
shape.set_width(400);
shape.set_height(80);

Puis-je définir la couleur du contour (bordure) de la forme ?

Oui, via shape.line_format():

shape.line_format().fill_format().solid_fill_color().set_color(
    asf::Color::from_argb(255, 200, 0, 0));

Les graphiques sont-ils pris en charge ?

Non. Les graphiques, SmartArt et les objets OLE ne sont pas implémentés dans cette édition.


Voir aussi

 Français