Beispiel 4 — Quadrat mit Loch (Combine)
Ein Kreis wird aus einem Quadrat ausgestanzt — Combine erzeugt das Loch. Das Ergebnis ist eine Form mit einem echten Durchbruch, die auch über Hintergründe hinweg transparent erscheint.
Ergebnis
Code
/* PARAMS */
float left = 120f;
float top = 100f;
float size = 180f;
var color = System.Drawing.Color.FromArgb(39, 174, 96);
/* END PARAMS */
int fillRgb = System.Drawing.ColorTranslator.ToOle(color);
int lineRgb = System.Drawing.ColorTranslator.ToOle(
System.Drawing.Color.FromArgb(27, 120, 67));
float cx = left + size / 2f;
float cy = top + size / 2f;
float hole = size * 0.35f;
// Quadrat
var oSquare = ppptools.AddRect(left, top, size, size);
// Loch-Kreis (zentriert im Quadrat)
var oHole = ppptools.AddOval(cx - hole/2f, cy - hole/2f, hole, hole);
// Combine — Kreis wird aus dem Quadrat ausgestanzt
oSquare.Select(MsoTriState.msoTrue);
oHole.Select(MsoTriState.msoFalse);
ppptools.Combine();
foreach (dynamic sh in ppptools.GetSelectedRange())
{
sh.Name = "SquareWithHole";
sh.Fill.ForeColor.RGB = fillRgb;
sh.Fill.Transparency = 0f;
sh.Line.ForeColor.RGB = lineRgb;
sh.Line.Weight = 1.5f;
}
Schritt-für-Schritt-Erklärung
1. Farben und Grössen vorbereiten
int fillRgb = System.Drawing.ColorTranslator.ToOle(color);
int lineRgb = System.Drawing.ColorTranslator.ToOle(
System.Drawing.Color.FromArgb(27, 120, 67));
float cx = left + size / 2f;
float cy = top + size / 2f;
float hole = size * 0.35f;
Alle berechneten Werte werden vor der Form-Erstellung als lokale Variablen gespeichert. Das ist sauberer als die Berechnungen direkt in den Methodenaufrufen zu verschachteln.
cx/cy— Mittelpunkt des Quadrats (für die Loch-Zentrierung)hole = size * 0.35f— Loch-Durchmesser = 35 % der Quadrat-Grösse
2. Quadrat erstellen
var oSquare = ppptools.AddRect(left, top, size, size);
width == height → perfektes Quadrat (genau wie beim Kreis mit msoShapeOval).
3. Loch-Kreis erstellen und zentrieren
var oHole = ppptools.AddOval(cx - hole/2f, cy - hole/2f, hole, hole);
Der Loch-Kreis liegt exakt im Mittelpunkt des Quadrats. Das Mittelpunkt-Muster aus Beispiel 2 wird wieder verwendet: cx - hole/2f.
4. Combine-Operation — der Unterschied zu Union
oSquare.Select(MsoTriState.msoTrue);
oHole.Select(MsoTriState.msoFalse);
ppptools.Combine();
Combine funktioniert wie Union, aber: Bereiche, wo sich Formen überschneiden, werden ausgestanzt (werden transparent). Das Ergebnis ist eine Form mit einem echten Loch.
| Operation | Überschneidung |
|---|---|
Union |
bleibt gefüllt |
Combine |
wird zum Loch (transparent) |
Intersect |
nur Überschneidung bleibt |
Subtract |
Überschneidung wird von erster Form abgezogen |
Reihenfolge beim Selektieren
Bei Combine spielt die Selektionsreihenfolge eine Rolle für den Stil:
Die zuerst selektierte Form (msoTrue) gibt Farbe und Formatierung vor.
Beide Formen werden ausgestanzt — aber die erste Form „gewinnt" beim Stil.
5. Ergebnis-Form formatieren
foreach (dynamic sh in ppptools.GetSelectedRange())
{
sh.Name = "SquareWithHole";
sh.Fill.ForeColor.RGB = fillRgb;
sh.Fill.Transparency = 0f;
sh.Line.ForeColor.RGB = lineRgb;
sh.Line.Weight = 1.5f;
}
Das Loch ist nicht sichtbar, solange der Folienhintergrund weiss ist. Über einem farbigen Hintergrund oder Bild sieht man den echten Durchbruch.
Besonderheiten dieses Beispiels
- Combine ≠ Union — gleiche Syntax, aber überlappende Bereiche werden Löcher, nicht Fläche.
- Echtes Loch — nicht nur optisch (mit weissem Kreis überdeckt), sondern ein echter geometrischer Durchbruch in der Form. Prüfbar: Folienhintergrund ändern → Loch zeigt den Hintergrund.
lineRgbdirekt definiert — die dunklere Rahmenfarbe (27, 120, 67) passt farblich zur Füllfarbe (39, 174, 96) als abgedunkelter Ton.Line.Weight = 1.5f— dünner Rahmen, der die Loch-Kontur sichtbar macht.
Zurück: Beispiel 3 — Union · Weiter: Beispiel 5 — Zahnrad