Csatlakozók kezelése bemutatókban C++ használatával
Bevezetés
A PowerPoint csatlakozó egy speciális vonal, amely két alakzatot kapcsol össze, és a alakzatokhoz kapcsolva marad akkor is, ha azok elmozdulnak vagy újra pozícionálásra kerülnek egy adott dián.
A csatlakozók általában kapcsolódási pontokhoz (zöld pontok) csatlakoznak, amelyek alapértelmezés szerint minden alakzaton jelen vannak. A kapcsolódási pontok megjelennek, amikor a kurzor közel kerül hozzájuk.
Állítópontok (narancssárga pontok), amelyek csak bizonyos csatlakozókon léteznek, a csatlakozók pozíciójának és alakjának módosítására szolgálnak.
A Csatlakozók Típusai
A PowerPointban egyenes, könyök (szögelt) és íves csatlakozókat használhat.
Az Aspose.Slides a következő csatlakozókat biztosítja:
| Csatlakozó | Kép | Állítópontok száma |
|---|---|---|
ShapeType.Line |
![]() |
0 |
ShapeType.StraightConnector1 |
![]() |
0 |
ShapeType.BentConnector2 |
![]() |
0 |
ShapeType.BentConnector3 |
![]() |
1 |
ShapeType.BentConnector4 |
![]() |
2 |
ShapeType.BentConnector5 |
![]() |
3 |
ShapeType.CurvedConnector2 |
![]() |
0 |
ShapeType.CurvedConnector3 |
![]() |
1 |
ShapeType.CurvedConnector4 |
![]() |
2 |
ShapeType.CurvedConnector5 |
![]() |
3 |
Alakzatok Kapcsolása Csatlakozókkal
- Hozzon létre egy példányt a Presentation osztályból.
- Szerezze meg egy dia hivatkozását az indexe alapján.
- Adjon hozzá két AutoShape objektumot a diára a
Shapesobjektum által biztosítottAddAutoShapemetódussal. - Adjon hozzá egy csatlakozót a
ShapesobjektumAddConnectormetódusával, meghatározva a csatlakozó típusát. - Kösse össze az alakzatokat a csatlakozóval.
- Hívja meg a
Reroutemetódust a legrövidebb kapcsolat útvonal alkalmazásához. - Mentse a bemutatót.
Ez a C++ kód bemutatja, hogyan adhat hozzá egy csatlakozót (egy hajlított csatlakozót) két alakzat (egy ellipszis és egy téglalap) között:
// A dokumentumok könyvtárának útvonala.
const String outPath = u"../out/ConnectShapesUsingConnectors_out.pptx";
const String templatePath = u"../templates/ConnectorLineAngle.pptx";
// Betölti a kívánt bemutatót
SharedPtr<Presentation> pres = MakeObject<Presentation>();
// Eléri az első diát
SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);
// Hozzáfér egy adott dia alakzatgyűjteményéhez
SharedPtr<IShapeCollection> shapes = slide->get_Shapes();
// Hozzáad egy Ellipse automatikus alakzatot
SharedPtr<IAutoShape> ellipse = slide->get_Shapes()->AddAutoShape(ShapeType::Ellipse, 0, 100, 100, 100);
// Hozzáad egy Rectangle automatikus alakzatot
SharedPtr<IAutoShape> rect = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 300, 100, 100);
// Hozzáad egy csatlakozó alakzatot a dia alakzatgyűjteményéhez
SharedPtr<IConnector> connector = shapes->AddConnector(ShapeType::BentConnector2, 0, 0, 10, 10);
// Összekapcsolja az alakzatokat a csatlakozóval
connector->set_StartShapeConnectedTo ( ellipse);
connector->set_EndShapeConnectedTo (rect);
// Meghívja a reroute-ot, amely beállítja az automatikus legrövidebb útvonalat az alakzatok között
connector->Reroute();
// Elmenti a bemutatót
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);
NOTE
connector->Reroute metódus újraútvonalazza a csatlakozót, és a két alakzat közötti legrövidebb lehetséges útvonalat kényszeríti. Ennek eléréséhez a metódus módosíthatja a StartShapeConnectionSiteIndex és EndShapeConnectionSiteIndex pontokat.
Kapcsolódási Pont Megadása
Ha azt szeretné, hogy egy csatlakozó két alakzatot összekapcsoljon a alakzatokon lévő konkrét pontok használatával, a kívánt kapcsolódási pontokat a következő módon kell megadni:
- Hozzon létre egy példányt a Presentation osztályból.
- Szerezze meg egy dia hivatkozását az indexe alapján.
- Adjon hozzá két AutoShape objektumot a diára a
Shapesobjektum által biztosítottAddAutoShapemetódussal. - Adjon hozzá egy csatlakozót a
ShapesobjektumAddConnectormetódusával, meghatározva a csatlakozó típusát. - Kösse össze az alakzatokat a csatlakozóval.
- Állítsa be a kívánt kapcsolódási pontokat az alakzatokon.
- Mentse a bemutatót.
Ez a C++ kód egy műveletet mutat be, ahol egy előnyben részesített kapcsolódási pont van megadva:
// A dokumentumok könyvtárának útvonala.
const String outPath = u"../out/ConnectShapeUsingConnectionSite_out.pptx";
const String templatePath = u"../templates/ConnectorLineAngle.pptx";
// Betölti a kívánt bemutatót
SharedPtr<Presentation> pres = MakeObject<Presentation>();
// Eléri az első diát
SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);
// Hozzáfér egy adott dia alakzatgyűjteményéhez
SharedPtr<IShapeCollection> shapes = slide->get_Shapes();
// Hozzáad egy Ellipse automatikus alakzatot
SharedPtr<IAutoShape> ellipse = slide->get_Shapes()->AddAutoShape(ShapeType::Ellipse, 0, 100, 100, 100);
// Hozzáad egy Rectangle automatikus alakzatot
SharedPtr<IAutoShape> rect = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 200, 100, 100);
// Hozzáad egy csatlakozó alakzatot a dia alakzatgyűjteményéhez
SharedPtr<IConnector> connector = shapes->AddConnector(ShapeType::BentConnector3, 0, 0, 10, 10);
// Összekapcsolja az alakzatokat a csatlakozóval
connector->set_StartShapeConnectedTo(ellipse);
connector->set_EndShapeConnectedTo(rect);
// Beállítja a kívánt kapcsolódási pont indexet az Ellipse alakzaton
int wantedIndex = 6;
// Ellenőrzi, hogy a kívánt index kisebb-e a maximális helyindex számnál
if (ellipse->get_ConnectionSiteCount() > wantedIndex)
{
// Beállítja a kívánt kapcsolódási pontot az Ellipse automatikus alakzaton
connector->set_StartShapeConnectionSiteIndex ( wantedIndex);
}
// Elmenti a bemutatót
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);
Csatlakozó Pontjának Módosítása
Meglévő csatlakozót a hozzá tartozó állítópontok segítségével módosíthat. Csak azok a csatlakozók módosíthatók így, amelyek rendelkeznek állítópontokkal. Lásd a táblázatot a A Csatlakozók Típusai alatt.
Egyszerű Eset
Tekintsünk egy esetet, ahol egy csatlakozó két alakzat (A és B) között áthalad egy harmadik alakzaton (C):

auto pres = System::MakeObject<Presentation>();
auto slide = pres->get_Slides()->idx_get(0);
auto shapes = slide->get_Shapes();
auto shape = shapes->AddAutoShape(ShapeType::Rectangle, 300.0f, 150.0f, 150.0f, 75.0f);
auto shapeFrom = shapes->AddAutoShape(ShapeType::Rectangle, 500.0f, 400.0f, 100.0f, 50.0f);
auto shapeTo = shapes->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 70.0f, 30.0f);
auto connector = shapes->AddConnector(ShapeType::BentConnector5, 20.0f, 20.0f, 400.0f, 300.0f);
auto lineFormat = connector->get_LineFormat();
lineFormat->set_EndArrowheadStyle(LineArrowheadStyle::Triangle);
auto lineFillFormat = lineFormat->get_FillFormat();
lineFillFormat->set_FillType(FillType::Solid);
lineFillFormat->get_SolidFillColor()->set_Color(System::Drawing::Color::get_Black());
connector->set_StartShapeConnectedTo(shapeFrom);
connector->set_EndShapeConnectedTo(shapeTo);
connector->set_StartShapeConnectionSiteIndex(2);
A harmadik alakzat elkerülése vagy megkerülése érdekében a csatlakozót úgy állíthatjuk, hogy a függőleges vonalát balra mozdítjuk:

auto adj2 = connector->get_Adjustments()->idx_get(1);
adj2->set_RawValue(adj2->get_RawValue() + 10000);
Összetett Esetek
Összetettebb módosítások elvégzéséhez az alábbiakat kell figyelembe venni:
- Egy csatlakozó állítható pontja szorosan összefügg egy olyan képlettel, amely kiszámítja és meghatározza a pozícióját. Így a pont helyzetének megváltoztatása a csatlakozó alakját is módosíthatja.
- A csatlakozó állítópontjai szigorú sorrendben vannak definiálva egy tömbben. Az állítópontok számozása a csatlakozó kezdőpontjától a végéig tart.
- Az állítópont értékek a csatlakozó alakzat szélességének/magasságának százalékát tükrözik.
- Az alakzat a csatlakozó kezdő- és végpontjainak 1000-szeresével határolt.
- Az első pont, a második pont és a harmadik pont sorban a szélesség, a magasság és újra a szélesség százalékát határozza meg.
- A csatlakozó állítópontjainak koordinátáit meghatározó számításoknál figyelembe kell venni a csatlakozó forgatását és tükrözését. Megjegyzés: a A Csatlakozók Típusai alatt látható összes csatlakozó forgatási szöge 0.
Eset 1
Tekintsünk egy esetet, ahol két szövegkeret objektumot egy csatlakozó köt össze:

// PPTX fájlt képviselő bemutatóosztályt példányosít
auto pres = System::MakeObject<Presentation>();
// A bemutató első diáját lekéri
auto slide = pres->get_Slides()->idx_get(0);
// Alakzatokat kap az első diáról
auto shapes = slide->get_Shapes();
// Alakzatokat ad hozzá, amelyeket egy csatlakozóval fog összekapcsolni
auto shapeFrom = shapes->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 60.0f, 25.0f);
shapeFrom->get_TextFrame()->set_Text(u"From");
auto shapeTo = shapes->AddAutoShape(ShapeType::Rectangle, 500.0f, 100.0f, 60.0f, 25.0f);
shapeTo->get_TextFrame()->set_Text(u"To");
// Hozzáad egy csatlakozót
auto connector = shapes->AddConnector(ShapeType::BentConnector4, 20.0f, 20.0f, 400.0f, 300.0f);
auto lineFormat = connector->get_LineFormat();
// Megadja a csatlakozó irányát
lineFormat->set_EndArrowheadStyle(LineArrowheadStyle::Triangle);
// Megadja a csatlakozó vonalának vastagságát
lineFormat->set_Width(3);
// Megadja a csatlakozó színét
auto lineFillFormat = lineFormat->get_FillFormat();
lineFillFormat->set_FillType(Aspose::Slides::FillType::Solid);
lineFillFormat->get_SolidFillColor()->set_Color(System::Drawing::Color::get_Crimson());
// Kapcsolja össze az alakzatokat a csatlakozóval
connector->set_StartShapeConnectedTo(shapeFrom);
connector->set_StartShapeConnectionSiteIndex(3);
connector->set_EndShapeConnectedTo(shapeTo);
connector->set_EndShapeConnectionSiteIndex(2);
// Lekéri a csatlakozó állítópontjait
auto adjustments = connector->get_Adjustments();
auto adjValue_0 = adjustments->idx_get(0);
auto adjValue_1 = adjustments->idx_get(1);
Adjustment
Megváltoztathatjuk a csatlakozó állítópont értékeit, ha a megfelelő szélesség- és magasság százalékát rendre 20%-kal és 200%-kal növeljük:
// Módosítja az állítópontok értékeit
adjValue_0->set_RawValue(adjValue_0->get_RawValue() + 20000);
adjValue_1->set_RawValue(adjValue_1->get_RawValue() + 200000);
Az eredmény:

Annak a modellnek a meghatározásához, amely lehetővé teszi a csatlakozó egyes részeinek koordinátáinak és alakjának meghatározását, hozzunk létre egy alakzatot, amely a csatlakozó vízszintes komponensének felel meg a connector.Adjustments[0] pontnál:
// Kirajzolja a csatlakozó függőleges komponensét
float x = connector->get_X() + connector->get_Width() * adjValue_0->get_RawValue() / 100000;
float y = connector->get_Y();
float height = connector->get_Height() * adjValue_1->get_RawValue() / 100000;
shapes->AddAutoShape(ShapeType::Rectangle, x, y, 0.0f, height);
Az eredmény:

Eset 2
Eset 1-ben egyszerű csatlakozóállítási műveletet mutattunk be alapelvek segítségével. Normál helyzetekben figyelembe kell venni a csatlakozó forgatását és megjelenítését (amelyeket a connector.Rotation, connector.Frame.FlipH és connector.Frame.FlipV állít be). Most bemutatjuk a folyamatot.
Először adjunk egy új szövegkeret objektumot (To 1) a diához (kapcsolódási célból), és hozzunk létre egy új (zöld) csatlakozót, amely összeköti azt a már létrehozott objektumokkal.
// Új kötési objektumot hoz létre
auto shapeTo_1 = shapes->AddAutoShape(ShapeType::Rectangle, 100.0f, 400.0f, 60.0f, 25.0f);
shapeTo_1->get_TextFrame()->set_Text(u"To 1");
// Új csatlakozót hoz létre
connector = shapes->AddConnector(ShapeType::BentConnector4, 20.0f, 20.0f, 400.0f, 300.0f);
lineFormat->set_EndArrowheadStyle(LineArrowheadStyle::Triangle);
lineFormat->set_Width(3);
lineFillFormat->set_FillType(Aspose::Slides::FillType::Solid);
lineFillFormat->get_SolidFillColor()->set_Color(System::Drawing::Color::get_MediumAquamarine());
// Az újonnan létrehozott csatlakozóval összekapcsolja az objektumokat
connector->set_StartShapeConnectedTo(shapeFrom);
connector->set_StartShapeConnectionSiteIndex(2);
connector->set_EndShapeConnectedTo(shapeTo_1);
connector->set_EndShapeConnectionSiteIndex(3);
// Lekéri a csatlakozó állítópontjait
adjValue_0 = adjustments->idx_get(0);
adjValue_1 = adjustments->idx_get(1);
// Módosítja az állítópontok értékeit
adjValue_0->set_RawValue(adjValue_0->get_RawValue() + 20000);
adjValue_1->set_RawValue(adjValue_1->get_RawValue() + 200000);
Az eredmény:

Másodszor hozzunk létre egy alakzatot, amely a csatlakozó vízszintes komponensének felel meg, amely áthalad az új csatlakozó connector.Adjustments[0] állítópontján. Felhasználjuk a connector.Rotation, connector.Frame.FlipH és connector.Frame.FlipV értékeket, és alkalmazzuk a népszerű koordináta‑konverziós képletet egy adott x0 pont körüli forgatáshoz:
X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0;
Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;
Mi esetünkben az objektum forgatási szöge 90 fok, és a csatlakozó függőlegesen jelenik meg, ezért ez a megfelelő kód:
Az eredmény:

Bemutattuk a egyszerű módosításokat és az összetett állítópontokat (forgatási szögekkel rendelkező állítópontok) érintő számításokat. A megszerzett tudás segítségével saját modellt fejleszthet (vagy kódot írhat), amely GraphicsPath objektumot ad, vagy akár a csatlakozó állítópont értékeit konkrét dia‑koordináták alapján állítja be.
A Csatlakozó Vonalak Szögének Meghatározása
- Hozzon létre egy példányt a Presentation osztályból.
- Szerezze meg egy dia hivatkozását az indexe alapján.
- Hozzáférés a csatlakozó vonal alakzathoz.
- A vonal szélességét, magasságát, az alakzat keret magasságát és szélességét használja a szög kiszámításához.
Ez a C++ kód egy olyan műveletet mutat be, ahol a csatlakozó vonal alakzat szögét számoltuk ki:
void ConnectorLineAngle()
{
// A dokumentumok könyvtárának útvonala.
const String outPath = u"../out/ConnectorLineAngle_out.pptx";
const String templatePath = u"../templates/ConnectorLineAngle.pptx";
// Betölti a kívánt bemutatót
SharedPtr<Presentation> pres = MakeObject<Presentation>(templatePath);
// Eléri az első diát
SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);
for (int i = 0; i < slide->get_Shapes()->get_Count(); i++)
{
double dir = 0.0;
// Eléri a diák alakzatgyűjteményét
System::SharedPtr<IShape> shape = slide->get_Shapes()->idx_get(i);
if (System::ObjectExt::Is<AutoShape>(shape))
{
SharedPtr<AutoShape> aShape = ExplicitCast<Aspose::Slides::AutoShape>(shape);
if (aShape->get_ShapeType() == ShapeType::Line)
{
// dir = getDirection(aShape->get_Width(), aShape->get_Height(), Convert::ToBoolean(aShape->get_Frame()->get_FlipH()), Convert::ToBoolean(aShape->get_Frame()->get_FlipV()));
dir = getDirection(aShape->get_Width(), aShape->get_Height(), aShape->get_Frame()->get_FlipH(), aShape->get_Frame()->get_FlipV());
}
}
else if (System::ObjectExt::Is<Connector>(shape))
{
SharedPtr<Connector> aShape = ExplicitCast<Aspose::Slides::Connector>(shape);
// dir = getDirection(aShape->get_Width(), aShape->get_Height(), Convert::ToBoolean(aShape->get_Frame()->get_FlipH()), Convert::ToBoolean(aShape->get_Frame()->get_FlipV()));
dir = getDirection(aShape->get_Width(), aShape->get_Height(), aShape->get_Frame()->get_FlipH(),aShape->get_Frame()->get_FlipV());
}
Console::WriteLine(dir);
}
}
//double ConnectorLineAngle::getDirection(float w, float h, NullableBool flipH, NullableBool flipV)
double getDirection(float w, float h, Aspose::Slides::NullableBool flipH, Aspose::Slides::NullableBool flipV)
{
float endLineX = w;
if (flipH == NullableBool::True)
endLineX= endLineX * -1;
else
endLineX=endLineX * 1;
//float endLineX = w * (flipH ? -1 : 1);
float endLineY = h;
if (flipV == NullableBool::True)
endLineY = endLineY * -1;
else
endLineY = endLineY * 1;
//float endLineY = h * (flipV ? -1 : 1);
float endYAxisX = 0;
float endYAxisY = h;
double angle = (Math::Atan2(endYAxisY, endYAxisX) - Math::Atan2(endLineY, endLineX));
if (angle < 0) angle += 2 * Math::PI;
return angle * 180.0 / Math::PI;
}
GYIK
Hogyan tudom megállapítani, hogy egy csatlakozó „ragasztható‑e” egy adott alakzatra?
Ellenőrizze, hogy az alakzat rendelkezik-e kapcsolódási pontokkal. Ha nincsenek, vagy a számuk nulla, a ragasztás nem lehetséges; ilyen esetben használjon szabad végpontokat, és helyezze el őket kézzel. Érdemes a pontok számát ellenőrizni a csatlakoztatás előtt.
Mi történik egy csatlakozóval, ha törlöm a csatlakoztatott alakzatok egyikét?
A végei leválnak; a csatlakozó a dián egy szabad kezdő‑ és végpontú vonalként marad. Törölheti, vagy újra hozzárendelheti a kapcsolatokat, és szükség esetén újratervezi.
Megmaradnak a csatlakozó kötődések, ha egy diát átmásolok egy másik bemutatóba?
Általában igen, amennyiben a célalakzatok is másolásra kerülnek. Ha a dia egy másik fájlba kerül beillesztésre a csatlakoztatott alakzatok nélkül, a végek szabadok lesznek, és újra kell csatlakoztatni őket.









