在 C++ 中管理簡報主題

簡介

簡報主題定義了設計元素的屬性。當您選取簡報主題時,實際上就是在選擇一組特定的視覺元素及其屬性。

在 PowerPoint 中,主題包括顏色、字型背景樣式以及效果。

theme-constituents

變更主題顏色

PowerPoint 主題會為投影片上的不同元素使用特定的一組顏色。若您不喜歡這些顏色,可以透過套用新顏色來變更主題的顏色。為了讓您選取新的主題顏色,Aspose.Slides 在 SchemeColor 列舉中提供了相應的值。

以下 C++ 程式碼示範如何變更主題的重點色彩:

auto pres = System::MakeObject<Presentation>();

auto shape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10.0f, 10.0f, 100.0f, 100.0f);

shape->get_FillFormat()->set_FillType(FillType::Solid);
shape->get_FillFormat()->get_SolidFillColor()->set_SchemeColor(SchemeColor::Accent4);

您可以透過以下方式取得結果顏色的有效值:

auto fillEffective = shape->get_FillFormat()->GetEffective();
    
Console::WriteLine(u"{0} ({1})", fillEffective->get_SolidFillColor().get_Name(), fillEffective->get_SolidFillColor());
// ff8064a2 (顏色 [A=255, R=128, G=100, B=162])

為了進一步示範顏色變更的操作,我們建立另一個元素,並將(初始操作中)取得的重點顏色指派給它。接著在主題中變更顏色:

auto otherShape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10.0f, 120.0f, 100.0f, 100.0f);
    
otherShape->get_FillFormat()->set_FillType(FillType::Solid);
otherShape->get_FillFormat()->get_SolidFillColor()->set_SchemeColor(SchemeColor::Accent4);

pres->get_MasterTheme()->get_ColorScheme()->get_Accent4()->set_Color(Color::get_Red());

新顏色會自動套用到兩個元素上。

從額外調色盤設定主題顏色

當您對主主題顏色 (1) 套用亮度變換時,會產生來自額外調色盤 (2) 的顏色。之後您可以設定與取得這些主題顏色。

additional-palette-colors

1- 主主題顏色
2- 來自額外調色盤的顏色。

以下 C++ 程式碼示範從主主題顏色取得額外調色盤顏色,並將其應用於圖形的操作:

// 強調色 4
auto shape1 = shapes->AddAutoShape(ShapeType::Rectangle, 10.0f, 10.0f, 50.0f, 50.0f);
auto fillFormat1 = shape1->get_FillFormat();

fillFormat1->set_FillType(FillType::Solid);
fillFormat1->get_SolidFillColor()->set_SchemeColor(SchemeColor::Accent4);

// 強調色 4,較亮 80%
auto shape2 = shapes->AddAutoShape(ShapeType::Rectangle, 10.0f, 70.0f, 50.0f, 50.0f);
auto fillFormat2 = shape2->get_FillFormat();
auto solidFillColor2 = fillFormat2->get_SolidFillColor();

fillFormat2->set_FillType(FillType::Solid);
solidFillColor2->set_SchemeColor(SchemeColor::Accent4);
solidFillColor2->get_ColorTransform()->Add(ColorTransformOperation::MultiplyLuminance, 0.2f);
solidFillColor2->get_ColorTransform()->Add(ColorTransformOperation::AddLuminance, 0.8f);

// 強調色 4,較亮 60%
auto shape3 = shapes->AddAutoShape(ShapeType::Rectangle, 10.0f, 130.0f, 50.0f, 50.0f);
auto fillFormat3 = shape3->get_FillFormat();
auto solidFillColor3 = fillFormat3->get_SolidFillColor();

fillFormat3->set_FillType(FillType::Solid);
solidFillColor3->set_SchemeColor(SchemeColor::Accent4);
solidFillColor3->get_ColorTransform()->Add(ColorTransformOperation::MultiplyLuminance, 0.4f);
solidFillColor3->get_ColorTransform()->Add(ColorTransformOperation::AddLuminance, 0.6f);

// 強調色 4,較亮 40%
auto shape4 = shapes->AddAutoShape(ShapeType::Rectangle, 10.0f, 190.0f, 50.0f, 50.0f);
auto fillFormat4 = shape4->get_FillFormat();
auto solidFillColor4 = fillFormat4->get_SolidFillColor();

fillFormat4->set_FillType(FillType::Solid);
solidFillColor4->set_SchemeColor(SchemeColor::Accent4);
solidFillColor4->get_ColorTransform()->Add(ColorTransformOperation::MultiplyLuminance, 0.6f);
solidFillColor4->get_ColorTransform()->Add(ColorTransformOperation::AddLuminance, 0.4f);

// 強調色 4,較暗 25%
auto shape5 = shapes->AddAutoShape(ShapeType::Rectangle, 10.0f, 250.0f, 50.0f, 50.0f);
auto fillFormat5 = shape5->get_FillFormat();
auto solidFillColor5 = fillFormat5->get_SolidFillColor();

fillFormat5->set_FillType(FillType::Solid);
solidFillColor5->set_SchemeColor(SchemeColor::Accent4);
solidFillColor5->get_ColorTransform()->Add(ColorTransformOperation::MultiplyLuminance, 0.75f);

// 強調色 4,較暗 50%
auto shape6 = shapes->AddAutoShape(ShapeType::Rectangle, 10.0f, 310.0f, 50.0f, 50.0f);
auto fillFormat6 = shape6->get_FillFormat();
auto solidFillColor6 = fillFormat6->get_SolidFillColor();

fillFormat6->set_FillType(FillType::Solid);
solidFillColor6->set_SchemeColor(SchemeColor::Accent4);
solidFillColor6->get_ColorTransform()->Add(ColorTransformOperation::MultiplyLuminance, 0.5f);

presentation->Save(u"example.pptx", Export::SaveFormat::Pptx);

SchemeColor 對映至 IColorScheme 顏色

當您使用 SchemeColor 時,可能會注意到它包含以下主題顏色值:

Background1, Background2, Text1, and Text2.

然而,Presentation::get_MasterTheme()::get_ColorScheme() 會回傳 IColorScheme,其提供相對應的顏色為:

Dark1, Dark2, Light1, and Light2.

此差異僅在於命名。這些值指向相同的主題顏色槽位,且對映是固定的:

  • Text1 = Dark1
  • Background1 = Light1
  • Text2 = Dark2
  • Background2 = Light2

TextBackgroundDarkLight 之間沒有動態轉換,它們只是相同主題顏色的別名。

此命名差異來源於 Microsoft Office 的術語。舊版 Office 使用 Dark 1Light 1Dark 2Light 2,而較新版的使用者介面則將相同槽位顯示為 Text 1Background 1Text 2Background 2

變更主題字型

為了讓您為主題及其他用途選取字型,Aspose.Slides 使用以下特殊識別碼(類似於 PowerPoint 中使用的):

  • +mn-lt - 內文字型 Latin(次要 Latin 字型)
  • +mj-lt - 標題字型 Latin(主要 Latin 字型)
  • +mn-ea - 內文字型 東亞(次要 東亞 字型)
  • +mj-ea - 正文字型 東亞(主要 東亞 字型)

以下 C++ 程式碼示範如何將 Latin 字型指派給主題元素:

auto shape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10.0f, 10.0f, 100.0f, 100.0f);

auto paragraph = System::MakeObject<Paragraph>();
auto portion = System::MakeObject<Portion>(u"Theme text format");

paragraph->get_Portions()->Add(portion);
shape->get_TextFrame()->get_Paragraphs()->Add(paragraph);

portion->get_PortionFormat()->set_LatinFont(System::MakeObject<FontData>(u"+mn-lt"));

以下 C++ 程式碼示範如何變更簡報主題的字型:

pres->get_MasterTheme()->get_FontScheme()->get_Minor()->set_LatinFont(MakeObject<FontData>(u"Arial"));

所有文字方塊的字型都會被更新。

變更主題背景樣式

預設情況下,PowerPoint 應用程式提供 12 種預設背景,但在一般簡報中僅會儲存其中的 3 種背景。

todo:image_alt_text

例如,當您在 PowerPoint 應用程式中儲存簡報後,可以執行以下 C++ 程式碼來查詢簡報中預設背景的數量:

auto pres = MakeObject<Presentation>(u"pres.pptx");
        
int32_t numberOfBackgroundFills = pres->get_MasterTheme()->get_FormatScheme()->get_BackgroundFillStyles()->get_Count();

Console::WriteLine(u"Number of background fill styles for theme is {0}", numberOfBackgroundFills);

以下 C++ 程式碼示範如何為簡報設定背景:

pres->get_Masters()->idx_get(0)->get_Background()->set_StyleIndex(2);

索引說明:0 代表無填色。索引從 1 開始。

變更主題效果

PowerPoint 主題通常為每個樣式陣列包含 3 個值。這些陣列結合後形成 3 種效果:細緻、適中與強烈。例如,將這些效果套用至特定圖形時的結果如下:

todo:image_alt_text

使用 FormatScheme 類別中的 3 個屬性(FillStylesLineStylesEffectStyles),您可以變更主題中的元素(比 PowerPoint 的選項更具彈性)。

以下 C++ 程式碼示範如何透過調整元素部份來變更主題效果:

auto pres = System::MakeObject<Presentation>(u"Subtle_Moderate_Intense.pptx");
        
pres->get_MasterTheme()->get_FormatScheme()->get_LineStyles()->idx_get(0)->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());

pres->get_MasterTheme()->get_FormatScheme()->get_FillStyles()->idx_get(2)->set_FillType(FillType::Solid);

pres->get_MasterTheme()->get_FormatScheme()->get_FillStyles()->idx_get(2)->get_SolidFillColor()->set_Color(Color::get_ForestGreen());

pres->get_MasterTheme()->get_FormatScheme()->get_EffectStyles()->idx_get(2)->get_EffectFormat()->get_OuterShadowEffect()->set_Distance(10.f);

pres->Save(u"Design_04_Subtle_Moderate_Intense-out.pptx", SaveFormat::Pptx);

結果會在填色、填充類型、陰影效果等方面產生變化:

todo:image_alt_text

常見問題

我能在不更改母片的情況下,將主題套用到單一投影片嗎?
可以。Aspose.Slides 支援投影片層級的主題覆寫,您可以僅在該投影片套用本機主題,同時保持母片主題不變(透過 SlideThemeManager)。

將主題從一個簡報安全搬移至另一個簡報的最佳方式是什麼?
Clone slides 與其母片一起複製到目標簡報。此做法會保留原始的母片、版面配置以及相關的主題,確保外觀保持一致。

如何在所有繼承與覆寫之後查看「有效」值?
使用 API 的「effective」檢視 取得主題/顏色/字型/效果的實際值。這些檢視會在套用母片以及任何本機覆寫後回傳解析後的最終屬性。