Cách Thêm Hình Dạng vào PowerPoint bằng C++

Cách Thêm Hình Dạng vào PowerPoint bằng C++

Aspose.Slides FOSS for C++ hỗ trợ thêm AutoShapes, Tables, Connectors và PictureFrames vào các slide của bản trình chiếu. Tất cả các loại hình dạng đều được thêm thông qua bộ sưu tập slide.shapes().

Hướng Dẫn Từng Bước

Bước 1: Xây dựng và Liên kết Thư viện

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 .

Bước 2: Tạo bản trình chiếu

Sử dụng cấp phát ngăn xếp cho việc dọn dẹp 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;
}

Bước 3: Thêm AutoShape

slide.shapes().add_auto_shape(shape_type, x, y, width, height) đặt một hình dạng tại vị trí và kích thước đã cho (tất cả tính bằng điểm). Sử dụng các hằng số ShapeType để chọn hình dạng.

#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;
}

Bước 4: Thêm bảng

slide.shapes().add_table(x, y, col_widths, row_heights) tạo một bảng tại vị trí được chỉ định. Độ rộng cột và chiều cao hàng là các vector có giá trị điểm.

#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;
}

Bước 5: Thêm một Connector

Các kết nối liên kết hai hình dạng một cách trực quan. Đầu tiên tạo các hình dạng, sau đó thêm một kết nối và đặt các điểm kết nối bắt đầu và kết thúc của nó.

#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;
}

Các chỉ số vị trí kết nối được đánh số 0-3 cho một hình chữ nhật: top=0, left=1, bottom=2, right=3.


Bước 6: Thêm khung ảnh

Nhúng một hình ảnh và thêm nó vào slide dưới dạng PictureFrame. Đọc byte của hình ảnh trước, thêm chúng vào bộ sưu tập hình ảnh của bản trình chiếu, sau đó tạo khung.

#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;
}

Các vấn đề thường gặp và cách khắc phục

Hình dạng xuất hiện ngoài khu vực slide có thể nhìn thấy

Các slide có kích thước mặc định là 720 x 540 điểm. Giá trị của x hoặc y vượt ra ngoài giới hạn này sẽ đặt hình dạng ra ngoài slide. Giữ x < 720y < 540, và đảm bảo x + width <= 720y + height <= 540.

add_auto_shape() trả về một tham chiếu tới một đối tượng đã bị hủy

Không lưu trữ các tham chiếu vượt quá thời gian tồn tại của Presentation. Tất cả các đối tượng con được sở hữu bởi Presentation và sẽ bị vô hiệu hoá khi bị hủy.

Văn bản ô bảng trống sau khi gán

Phương pháp đúng là .text_frame()->set_text(). Truy cập các ô như table.rows()[row_index][col_index].text_frame()->set_text("value").


Câu hỏi thường gặp

Tôi có thể thêm bao nhiêu hình dạng vào một slide?

Không có giới hạn do thư viện áp đặt. Giới hạn thực tế phụ thuộc vào kích thước tệp và khả năng hiển thị của trình xem PPTX mục tiêu của bạn.

Tôi có thể thay đổi vị trí của một hình dạng sau khi thêm nó không?

Có. Đối tượng shape được trả về bởi add_auto_shape() có các phương thức set_x(), set_y(), set_width()set_height():

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

Có thể đặt màu viền (border) cho hình dạng không?

Có, qua shape.line_format():

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

Biểu đồ có được hỗ trợ không?

Không. Biểu đồ, SmartArt và các đối tượng OLE không được triển khai trong phiên bản này.


Xem thêm

 Tiếng Việt